日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

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

冬至子 ? 來(lái)源:balabala ? 作者:balabala ? 2023-10-13 14:14 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

看了大家對(duì)F030復(fù)用串口的疑惑,這里繼續(xù)給出“當(dāng)同時(shí)使用UART3~UART6中的多個(gè)串口時(shí),由于其中斷響應(yīng)函數(shù)都是同一個(gè),需要自己在中斷函數(shù)USART3_6_IRQHandler() 中判斷是來(lái)自哪個(gè)串口的中斷?!边@個(gè)問(wèn)題的解決辦法。這里使用的是串口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級(jí)別的中斷,如果需要使用串口的DMA中斷,需要在DMA初始化的時(shí)候添加__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); //添加這兩個(gè)即可
__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)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 串口中斷
    +關(guān)注

    關(guān)注

    0

    文章

    67

    瀏覽量

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

    關(guān)注

    0

    文章

    32

    瀏覽量

    7327
  • HAL庫(kù)
    +關(guān)注

    關(guān)注

    1

    文章

    121

    瀏覽量

    7754
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    UART數(shù)據(jù)轉(zhuǎn)發(fā)芯片 多接口可配置

    uart
    穩(wěn)控自動(dòng)化
    發(fā)布于 :2026年04月10日 10:46:12

    請(qǐng)問(wèn)一下,繪制F030系列MCU的時(shí)候,仿真接口是否必須要引出RST呢?

    請(qǐng)問(wèn)一下,繪制F030系列MCU的時(shí)候,仿真接口是否必須要引出RST呢?
    發(fā)表于 01-13 07:06

    TL16C2550:雙UART芯片的技術(shù)剖析與應(yīng)用指南

    TL16C2550:雙UART芯片的技術(shù)剖析與應(yīng)用指南 在電子設(shè)計(jì)領(lǐng)域,UART(通用異步收發(fā)傳輸器)芯片是實(shí)現(xiàn)串行通信的關(guān)鍵組件。TI公司的TL16C2550作為一款1.8 - V至
    的頭像 發(fā)表于 12-29 10:15 ?446次閱讀

    CW32F030開(kāi)發(fā)板的工程模板

    _StandardPeripheralLibExamples CW32-48F大學(xué)計(jì)劃板例程 EX1流水燈實(shí)驗(yàn) EX2蜂鳴器實(shí)驗(yàn) EX3按鍵指示燈實(shí)驗(yàn) EX4定時(shí)器實(shí)驗(yàn) EX5GPIOEXTI外部中斷實(shí)驗(yàn) EX6UART
    發(fā)表于 12-26 08:08

    CW32F030 UART的主要特性

    CW32F030 內(nèi)部集成 3 個(gè)通用異步收發(fā)器 (UART),支持異步全雙工、同步半雙工和單線半雙工模式,支持硬件數(shù)據(jù)流控和多機(jī)通信;可編程數(shù)據(jù)幀結(jié)構(gòu),可以通過(guò)小數(shù)波特率發(fā)生器提供寬范圍的波特率
    發(fā)表于 12-11 08:07

    請(qǐng)問(wèn)芯源F030有沒(méi)有SSOP20的封裝2個(gè)串口的芯片?

    芯源F030有沒(méi)有SSOP20的封裝2個(gè)串口的芯片
    發(fā)表于 12-03 07:32

    ElfBoard技術(shù)貼|如何在【RK3588】ELF 2開(kāi)發(fā)板上進(jìn)行UART引腳復(fù)用配置

    IOMUX(引腳功能復(fù)用)是芯片廠商為高效利用有限硬件引腳資源而設(shè)計(jì)的關(guān)鍵技術(shù),它允許單個(gè)物理引腳通過(guò)軟件配置為多種不同的功能(如GPIO、UART、I2C等)。不同SoC芯片的配置方式各異,本文將以【RK3588】ELF 2開(kāi)
    的頭像 發(fā)表于 11-18 16:54 ?5759次閱讀
    ElfBoard技術(shù)貼|如何在【RK3588】ELF 2開(kāi)發(fā)板上進(jìn)行<b class='flag-5'>UART</b>引腳復(fù)用配置

    芯源F030性能如何?能與STM的對(duì)比嗎?

    芯源F030性能如何?能與STM的對(duì)比嗎?
    發(fā)表于 11-14 07:23

    請(qǐng)問(wèn)芯源F030性能對(duì)標(biāo)ST的哪一款?

    芯源F030性能對(duì)標(biāo)ST的哪一款?
    發(fā)表于 11-14 07:15

    多路UART數(shù)據(jù)轉(zhuǎn)發(fā)芯片 支持1主4從UART接口 UART擴(kuò)展芯片

    UART接口
    穩(wěn)控自動(dòng)化
    發(fā)布于 :2025年11月13日 13:27:11

    多路UART數(shù)據(jù)轉(zhuǎn)發(fā)芯片 支持1主4從UART接口 UART擴(kuò)展芯片

    多路UART數(shù)據(jù)轉(zhuǎn)發(fā)芯片 支持1主4從UART接口 UART擴(kuò)展芯片 EU104 是一款高性能 UART
    的頭像 發(fā)表于 11-12 10:33 ?571次閱讀

    FT32F030F6CU7輝芒微單片機(jī)32位M0系列MCU

    深圳市三佛科技有限公司介紹:FT32F030F6CU7輝芒微單片機(jī)32位M0系列MCU FT32F030F6CU7 在掃描儀上的應(yīng)用: FT32F030F6CU7應(yīng)用領(lǐng)域:應(yīng)用控制
    發(fā)表于 11-10 11:30

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

    . 對(duì)uart3 增加一下內(nèi)容宏定義 /* DMA1 stream1 */ #if defined(BSP_UART3_RX_USING_DMA) && !defined
    發(fā)表于 09-11 07:14

    什么是零代碼平臺(tái)?

    代碼平臺(tái)是一種無(wú)需編寫(xiě)傳統(tǒng)代碼,通過(guò)可視化拖拽、參數(shù)配置、邏輯連線即可快速搭建業(yè)務(wù)流程與應(yīng)用系統(tǒng)的工具平臺(tái)。它將復(fù)雜的軟件開(kāi)發(fā)過(guò)程轉(zhuǎn)化為 “搭積木” 式的操作,讓非技術(shù)人員(如業(yè)務(wù)人員、運(yùn)營(yíng)人員
    發(fā)表于 07-12 20:28

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

    于實(shí)現(xiàn)設(shè)備與主控芯片的指令交互,例如廣州唯創(chuàng)電子的WT588D、WT2000T等系列語(yǔ)音芯片均支持多種UART控制模式(如一線串口、三線串口等)。二、廣州唯創(chuàng)語(yǔ)音
    的頭像 發(fā)表于 05-27 08:48 ?920次閱讀
    芯知識(shí)|廣州唯創(chuàng)電子語(yǔ)音<b class='flag-5'>芯片</b><b class='flag-5'>UART</b>通信協(xié)議解析:發(fā)碼長(zhǎng)度與校驗(yàn)<b class='flag-5'>碼</b>計(jì)算
    聂拉木县| 台山市| 宣化县| 侯马市| 文昌市| 台东市| 沁水县| 宁波市| 桐庐县| 慈利县| 双城市| 靖边县| 西安市| 塔河县| 田阳县| 扎鲁特旗| 贵港市| 呼和浩特市| 全椒县| 博白县| 沙雅县| 永嘉县| 潜山县| 仙居县| 绩溪县| 松阳县| 木兰县| 苏尼特左旗| 兴化市| 兰西县| 廊坊市| 额敏县| 西乌| 盈江县| 济宁市| 广宁县| 杭州市| 聂拉木县| 湖口县| 剑川县| 内丘县|