0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

冬至子 ? 来源:balabala ? 作者:balabala ? 2023-10-13 14:14 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

看了大家对F030复用串口的疑惑,这里继续给出“当同时使用UART3~UART6中的多个串口时,由于其中断响应函数都是同一个,需要自己在中断函数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();
}

其中就是加入了获取串口的判断,执行不同中断ISR。还有一点需要注意,F030RC的默认DMA通道是Cxs 0级别的中断,如果需要使用串口的DMA中断,需要在DMA初始化的时候添加__HAL_DMA1_REMAP()函数,

1.jpg

据需要选择不同串口即可,下面是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);
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串口中断
    +关注

    关注

    0

    文章

    67

    浏览量

    14382
  • USART串口
    +关注

    关注

    0

    文章

    32

    浏览量

    7107
  • HAL库
    +关注

    关注

    1

    文章

    121

    浏览量

    7056
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    UART 扩展芯片 数据转发多串口扩展 1主4从,高效通信

    uart
    稳控自动化
    发布于 :2025年08月11日 14:20:36

    什么是零代码平台?

    代码平台是一种无需编写传统代码,通过可视化拖拽、参数配置、逻辑连线即可快速搭建业务流程与应用系统的工具平台。它将复杂的软件开发过程转化为 “搭积木” 式的操作,让非技术人员(如业务人员、运营人员
    发表于 07-12 20:28

    芯知识|广州唯创电子语音芯片UART通信协议解析:发码长度与校验计算

    于实现设备与主控芯片的指令交互,例如广州唯创电子的WT588D、WT2000T等系列语音芯片均支持多种UART控制模式(如一线串口、三线串口等)。二、广州唯创语音
    的头像 发表于 05-27 08:48 ?260次阅读
    芯知识|广州唯创电子语音<b class='flag-5'>芯片</b><b class='flag-5'>UART</b>通信协议解析:发码长度与校验<b class='flag-5'>码</b>计算

    IMX8mn DDR3L EVK在u-boot上初始化UART3时出错怎么解决?

    什么影响吗? u-boot=> uart_test uart3 9600 48656C6C6F2C2055415254210A 尝试uclass_get_device_by_name
    发表于 04-04 07:26

    stlink V3mini调试器不能识别stm32f030F4P6芯片怎么解决?

    stlinkV3mini 调试器不能识别stm32f030F4P6芯片,有解决办法吗?
    发表于 03-12 06:55

    WTVxxxx系列语音芯片UART通信说明书V1

    WTVxxxx系列语音芯片UART通信说明书V1
    发表于 03-06 08:26 ?0次下载

    中科芯CKS32F030K6T6 高性能32位RISC内核MCU 程序兼容STM32F030K6T6

    。CKS32F030xx 系列包括三种不同的封装,从 20 脚到 64 引脚不等的。根据选择的器件,包含不同组合的外设。下面的内容包含了这个产品系列所提供的全部外设的描述。 CKS32F0
    发表于 03-05 16:23

    STM32H743 UART DMA接收不到数据,为什么?

    #define BSP_UART8_RX_BUFSIZE 128 其中BSP_USING_UART8作为msh串口,对uart8除了msp.c的初始化,没有使用其他配置,msh使用正常. 对
    发表于 02-19 06:14

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之UART

    UART1、UART2、UART3UART7,其中UART1用于调试,UART2、
    发表于 02-08 09:00

    飞凌嵌入式ElfBoard ELF 1板卡-开发板适配之UART

    1、UART2、UART3UART7,其中UART1用于调试,UART2、UART3用于连接R
    发表于 02-07 10:30

    通信技术:UART串口通信开源代码实操!

    今天我们分享的是关于UART串口通信示例,欢迎大家探讨
    的头像 发表于 11-05 11:56 ?4030次阅读
    通信技术:<b class='flag-5'>UART</b>串口通信开源<b class='flag-5'>代码</b>实操!

    使用USB转UART桥接芯片TUSB3410 TMS320F280x DSC USB连接

    电子发烧友网站提供《使用USB转UART桥接芯片TUSB3410 TMS320F280x DSC USB连接.pdf》资料免费下载
    发表于 10-16 10:51 ?0次下载
    使用USB转<b class='flag-5'>UART</b>桥接<b class='flag-5'>芯片</b>TUSB3410 TMS320<b class='flag-5'>F</b>280x DSC USB连接

    uart波特率和传输频率的关系 UART串口的常用波特率为多少

    频率是两个关键参数,它们之间存在一定的关系,并且UART串口有一系列常用的波特率。以下是对这两个概念的介绍。 一、UART波特率和传输频率的关系 1. 定义与区别 波特率(Baud Rate
    的头像 发表于 10-06 16:12 ?7558次阅读
    <b class='flag-5'>uart</b>波特率和传输频率的关系 <b class='flag-5'>UART</b>串口的常用波特率为多少

    在NXP源码基础上如何适配ELF 1开发板的UART功能

    UART接口供开发者使用,具体包括UART1、UART2、UART3以及UART7。其中UART
    的头像 发表于 09-29 11:49 ?761次阅读
    在NXP源码基础上如何适配ELF 1开发板的<b class='flag-5'>UART</b>功能

    ElfBoard技术贴|如何在NXP源码基础上适配ELF 1开发板的UART功能

    了4路UART接口供开发者使用,具体包括UART1、UART2、UART3以及UART7。其中UART
    的头像 发表于 09-25 13:56 ?2889次阅读
    ElfBoard技术贴|如何在NXP源码基础上适配ELF 1开发板的<b class='flag-5'>UART</b>功能