色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

F030系列芯片UART3~UART6代碼分享

冬至子 ? 來源:balabala ? 作者:balabala ? 2023-10-13 14:14 ? 次閱讀

看了大家對F030復(fù)用串口的疑惑,這里繼續(xù)給出“當(dāng)同時使用UART3~UART6中的多個串口時,由于其中斷響應(yīng)函數(shù)都是同一個,需要自己在中斷函數(shù)USART3_6_IRQHandler() 中判斷是來自哪個串口的中斷?!边@個問題的解決辦法。這里使用的是串口V2版本。

void USART3_6_IRQHandler(void)
{
/* enter interrupt */
rt_interrupt_enter();
struct stm32_uart *uart3,*uart4,uart5;
uart5 = rt_container_of(&(uart_obj[UART5_INDEX].serial), struct stm32_uart, serial);
uart3 = rt_container_of(&(uart_obj[UART3_INDEX].serial), struct stm32_uart, serial);
uart4 = rt_container_of(&(uart_obj[UART4_INDEX].serial), struct stm32_uart, serial);
if(__HAL_UART_GET_FLAG(&(uart3->handle), UART_FLAG_RXNE) != RESET)
uart_isr(&(uart_obj[UART3_INDEX].serial));
if(__HAL_UART_GET_FLAG(&(uart4->handle), UART_FLAG_RXNE) != RESET)
uart_isr(&(uart_obj[UART4_INDEX].serial));
if(__HAL_UART_GET_FLAG(&(uart5->handle), UART_FLAG_RXNE) != RESET)
uart_isr(&(uart_obj[UART5_INDEX].serial));
/
leave interrupt */
rt_interrupt_leave();
}

其中就是加入了獲取串口的判斷,執(zhí)行不同中斷ISR。還有一點(diǎn)需要注意,F(xiàn)030RC的默認(rèn)DMA通道是Cxs 0級別的中斷,如果需要使用串口的DMA中斷,需要在DMA初始化的時候添加__HAL_DMA1_REMAP()函數(shù),

1.jpg

據(jù)需要選擇不同串口即可,下面是DMA初始化代碼。

static void stm32_dma_config(struct rt_serial_device serial, rt_ubase_t flag)
{
struct rt_serial_rx_fifo rx_fifo;
DMA_HandleTypeDef DMA_Handle;
struct dma_config dma_config;
struct stm32_uart uart;
RT_ASSERT(serial != RT_NULL);
RT_ASSERT(flag == RT_DEVICE_FLAG_DMA_TX || flag == RT_DEVICE_FLAG_DMA_RX);
uart = rt_container_of(serial, struct stm32_uart, serial);
if (RT_DEVICE_FLAG_DMA_RX == flag)
{
DMA_Handle = &uart->dma_rx.handle;
dma_config = uart->config->dma_rx;
}
else /
RT_DEVICE_FLAG_DMA_TX == flag /
{
DMA_Handle = &uart->dma_tx.handle;
dma_config = uart->config->dma_tx;
}
LOG_D("%s dma config start", uart->config->name);
{
rt_uint32_t tmpreg = 0x00U;
#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32G0)
|| defined(SOC_SERIES_STM32L0)
/
enable DMA clock && Delay after an RCC peripheral clock enabling
/
SET_BIT(RCC->AHBENR, dma_config->dma_rcc);
tmpreg = READ_BIT(RCC->AHBENR, dma_config->dma_rcc);
#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32WL)
|| defined(SOC_SERIES_STM32G4)|| defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32WB)
/
enable DMA clock && Delay after an RCC peripheral clock enabling
/
SET_BIT(RCC->AHB1ENR, dma_config->dma_rcc);
tmpreg = READ_BIT(RCC->AHB1ENR, dma_config->dma_rcc);
#elif defined(SOC_SERIES_STM32MP1)
/
enable DMA clock && Delay after an RCC peripheral clock enabling*/
SET_BIT(RCC->MP_AHB2ENSETR, dma_config->dma_rcc);
tmpreg = READ_BIT(RCC->MP_AHB2ENSETR, dma_config->dma_rcc);
#endif
#if defined(DMAMUX1) && (defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32WL) || defined(SOC_SERIES_STM32G4) || defined(SOC_SERIES_STM32WB))
/* enable DMAMUX clock for L4+ and G4 /
__HAL_RCC_DMAMUX1_CLK_ENABLE();
#elif defined(SOC_SERIES_STM32MP1)
__HAL_RCC_DMAMUX_CLK_ENABLE();
#endif
UNUSED(tmpreg); /
To avoid compiler warnings /
}
if (RT_DEVICE_FLAG_DMA_RX == flag)
{
__HAL_LINKDMA(&(uart->handle), hdmarx, uart->dma_rx.handle);
}
else if (RT_DEVICE_FLAG_DMA_TX == flag)
{
__HAL_LINKDMA(&(uart->handle), hdmatx, uart->dma_tx.handle);
}
#if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32F0) || defined(SOC_SERIES_STM32L0)
DMA_Handle->Instance = dma_config->Instance;
#elif defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
DMA_Handle->Instance = dma_config->Instance;
DMA_Handle->Init.Channel = dma_config->channel;
#elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32WL) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32G4) || defined(SOC_SERIES_STM32WB)
|| defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32MP1)
DMA_Handle->Instance = dma_config->Instance;
DMA_Handle->Init.Request = dma_config->request;
#endif
DMA_Handle->Init.PeriphInc = DMA_PINC_DISABLE;
DMA_Handle->Init.MemInc = DMA_MINC_ENABLE;
DMA_Handle->Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
DMA_Handle->Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
if (RT_DEVICE_FLAG_DMA_RX == flag)
{
DMA_Handle->Init.Direction = DMA_PERIPH_TO_MEMORY;
DMA_Handle->Init.Mode = DMA_CIRCULAR;
}
else if (RT_DEVICE_FLAG_DMA_TX == flag)
{
DMA_Handle->Init.Direction = DMA_MEMORY_TO_PERIPH;
DMA_Handle->Init.Mode = DMA_NORMAL;
}
DMA_Handle->Init.Priority = DMA_PRIORITY_MEDIUM;
#if defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32H7) || defined(SOC_SERIES_STM32MP1)
DMA_Handle->Init.FIFOMode = DMA_FIFOMODE_DISABLE;
#endif
if (HAL_DMA_DeInit(DMA_Handle) != HAL_OK)
{
RT_ASSERT(0);
}
if (HAL_DMA_Init(DMA_Handle) != HAL_OK)
{
RT_ASSERT(0);
}
__HAL_DMA1_REMAP(HAL_DMA1_CH3_USART3_RX); //添加這兩個即可
__HAL_DMA1_REMAP(HAL_DMA1_CH1_USART4_RX);
/
enable interrupt */
if (flag == RT_DEVICE_FLAG_DMA_RX)
{
rx_fifo = (struct rt_serial_rx_fifo )serial->serial_rx;
RT_ASSERT(rx_fifo != RT_NULL);
/
Start DMA transfer /
if (HAL_UART_Receive_DMA(&(uart->handle), rx_fifo->buffer, serial->config.rx_bufsz) != HAL_OK)
{
/
Transfer error in reception process /
RT_ASSERT(0);
}
CLEAR_BIT(uart->handle.Instance->CR3, USART_CR3_EIE);
__HAL_UART_ENABLE_IT(&(uart->handle), UART_IT_IDLE);
}
/
DMA irq should set in DMA TX mode, or HAL_UART_TxCpltCallback function will not be called */
HAL_NVIC_SetPriority(dma_config->dma_irq, 0, 0);
HAL_NVIC_EnableIRQ(dma_config->dma_irq);
HAL_NVIC_SetPriority(uart->config->irq_type, 1, 0);
HAL_NVIC_EnableIRQ(uart->config->irq_type);
LOG_D("%s dma %s instance: %x", uart->config->name, flag == RT_DEVICE_FLAG_DMA_RX ? "RX" : "TX", DMA_Handle->Instance);
LOG_D("%s dma config done", uart->config->name);
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 串口中斷
    +關(guān)注

    關(guān)注

    0

    文章

    67

    瀏覽量

    14233
  • USART串口
    +關(guān)注

    關(guān)注

    0

    文章

    32

    瀏覽量

    7020
  • HAL庫
    +關(guān)注

    關(guān)注

    1

    文章

    121

    瀏覽量

    6726
收藏 0人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    芯知識|廣州唯創(chuàng)電子語音芯片UART通信協(xié)議解析:發(fā)碼長度與校驗計算

    于實(shí)現(xiàn)設(shè)備與主控芯片的指令交互,例如廣州唯創(chuàng)電子的WT588D、WT2000T等系列語音芯片均支持多種UART控制模式(如一線串口、三線串口等)。二、廣州唯創(chuàng)語音
    的頭像 發(fā)表于 05-27 08:48 ?40次閱讀
    芯知識|廣州唯創(chuàng)電子語音<b class='flag-5'>芯片</b><b class='flag-5'>UART</b>通信協(xié)議解析:發(fā)碼長度與校驗<b class='flag-5'>碼</b>計算

    IMX8mn DDR3L EVK在u-boot上初始化UART3時出錯怎么解決?

    什么影響嗎? u-boot=> uart_test uart3 9600 48656C6C6F2C2055415254210A 嘗試uclass_get_device_by_name
    發(fā)表于 04-04 07:26

    stlink V3mini調(diào)試器不能識別stm32f030F4P6芯片怎么解決?

    stlinkV3mini 調(diào)試器不能識別stm32f030F4P6芯片,有解決辦法嗎?
    發(fā)表于 03-12 06:55

    WTVxxxx系列語音芯片UART通信說明書V1

    WTVxxxx系列語音芯片UART通信說明書V1
    發(fā)表于 03-06 08:26 ?0次下載

    STM32H743 UART DMA接收不到數(shù)據(jù),為什么?

    #define BSP_UART8_RX_BUFSIZE 128 其中BSP_USING_UART8作為msh串口,對uart8除了msp.c的初始化,沒有使用其他配置,msh使用正常. 對
    發(fā)表于 02-19 06:14

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-開發(fā)板適配之UART

    UART1、UART2、UART3、UART7,其中UART1用于調(diào)試,UART2、
    發(fā)表于 02-08 09:00

    飛凌嵌入式ElfBoard ELF 1板卡-開發(fā)板適配之UART

    1、UART2、UART3UART7,其中UART1用于調(diào)試,UART2、UART3用于連接R
    發(fā)表于 02-07 10:30

    通信技術(shù):UART串口通信開源代碼實(shí)操!

    今天我們分享的是關(guān)于UART串口通信示例,歡迎大家探討
    的頭像 發(fā)表于 11-05 11:56 ?3782次閱讀
    通信技術(shù):<b class='flag-5'>UART</b>串口通信開源<b class='flag-5'>代碼</b>實(shí)操!

    使用USB轉(zhuǎn)UART橋接芯片TUSB3410 TMS320F280x DSC USB連接

    電子發(fā)燒友網(wǎng)站提供《使用USB轉(zhuǎn)UART橋接芯片TUSB3410 TMS320F280x DSC USB連接.pdf》資料免費(fèi)下載
    發(fā)表于 10-16 10:51 ?0次下載
    使用USB轉(zhuǎn)<b class='flag-5'>UART</b>橋接<b class='flag-5'>芯片</b>TUSB3410 TMS320<b class='flag-5'>F</b>280x DSC USB連接

    uart波特率和傳輸頻率的關(guān)系 UART串口的常用波特率為多少

    頻率是兩個關(guān)鍵參數(shù),它們之間存在一定的關(guān)系,并且UART串口有一系列常用的波特率。以下是對這兩個概念的介紹。 一、UART波特率和傳輸頻率的關(guān)系 1. 定義與區(qū)別 波特率(Baud Rate
    的頭像 發(fā)表于 10-06 16:12 ?6152次閱讀
    <b class='flag-5'>uart</b>波特率和傳輸頻率的關(guān)系 <b class='flag-5'>UART</b>串口的常用波特率為多少

    在NXP源碼基礎(chǔ)上如何適配ELF 1開發(fā)板的UART功能

    UART接口供開發(fā)者使用,具體包括UART1、UART2、UART3以及UART7。其中UART
    的頭像 發(fā)表于 09-29 11:49 ?608次閱讀
    在NXP源碼基礎(chǔ)上如何適配ELF 1開發(fā)板的<b class='flag-5'>UART</b>功能

    ElfBoard技術(shù)貼|如何在NXP源碼基礎(chǔ)上適配ELF 1開發(fā)板的UART功能

    了4路UART接口供開發(fā)者使用,具體包括UART1、UART2、UART3以及UART7。其中UART
    的頭像 發(fā)表于 09-25 13:56 ?2681次閱讀
    ElfBoard技術(shù)貼|如何在NXP源碼基礎(chǔ)上適配ELF 1開發(fā)板的<b class='flag-5'>UART</b>功能

    STM32G030F6串口空閑中斷配置卡死怎么解決?

    本人在用STM32G030F6 串口空閑中斷+DMA接受的時候,CubeMX配置完成,在mian函數(shù)while(1)前初始化,使能空閑中斷__HAL_UART_ENABLE_IT( huart1
    發(fā)表于 07-22 06:51

    3章_UART 開發(fā)基礎(chǔ)

    3章_UART 開發(fā)基礎(chǔ)
    的頭像 發(fā)表于 06-29 14:27 ?1061次閱讀
    第<b class='flag-5'>3</b>章_<b class='flag-5'>UART</b> 開發(fā)基礎(chǔ)

    使用通用串口模塊下載CW32F030芯片的方法

    芯片數(shù)據(jù)手冊里4.3節(jié),有表明BOOTLOADER下載時,通過UART1(也是SWDR接口)PA13PA14下載。 在CW32F030的用戶手冊里有,2.6節(jié)有講明BOOT引腳在ISP下載時需要的配置定義。 因此,在啟動時,需要
    的頭像 發(fā)表于 05-31 17:30 ?929次閱讀
    使用通用串口模塊下載CW32<b class='flag-5'>F030</b><b class='flag-5'>芯片</b>的方法
    主站蜘蛛池模板: 蜜芽tv在线www | 免费观看久久 | 国产成人精品电影 | 天天狠狠色噜噜 | 玖玖爱在线播放 | 一级特黄aa大片欧美 | 中文字幕AV在线一二三区 | 美国色情三级欧美三级纸匠情挑 | 欧美久久综合性欧美 | 久爱在线中文在观看 | 姑娘日本大全免费观看版中文翻译 | 免费观看男生桶美女私人部位 | 在线播放毛片 | 男人J桶女人P视频无遮挡网站 | 小货SAO边洗澡边CAO你动漫 | 阿娇和冠希13分钟在线观看 | 国产精品亚洲专区在线播放 | 亚洲午夜福利未满十八勿进 | 欧美精品一区二区蜜臀亚洲 | 美女与男人对肌免费网站 | 伊人色综合久久天天网 | 中文字幕中文字幕永久免费 | 一本久道久久综合狠狠躁AV | 亚洲午夜精品A片久久不卡蜜桃 | 永久adc视频| www.中文字幕在线观看 | 99re6久久热在线视频 | 99热这里只有精品9 99热这里只有精品88 | 色欲AV精品人妻一区二区三区 | 依人青青青在线观看 | 成人无码在线超碰视频 | 黄色a一级视频 | 国产亚洲精品高清视频免费 | 小黄文纯肉污到你湿 | 国产乱码精品一区二区三区四川 | 亚洲欧美一区二区三区久久 | 久久久久久久久人体 | 秋霞电影院兔费理论观频84mb | 亚洲AV永久无码精品老司机蜜桃 | MELODY在线播放无删减 | 萝莉御姐被吸奶 |

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學(xué)習(xí)
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品