一种解决STM32多串口同时收发的方法

这篇具有很好参考价值的文章主要介绍了一种解决STM32多串口同时收发的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在做项目中,遇到了同时调用串口通信时程序崩溃的问题,在项目中,串口1用作调试串口,串口2用作MQTT通信串口,串口3用作下位机通信串口,

串口1重定向以后,用库函数自带的printf函数打印字符串

串口2使用自己写的u2_printf函数,即va_list这套变参宏定义后使用vsprintf函数打印字符串

串口3刚开始使用串口2一样的打印方式,程序在调试调用到串口3打印函数时直接崩溃,后续将串口3改用dma转存输出,仍然无法正常调用

多次研究以后,采用三个串口都使用重定向后的库函数自带的printf函数进行输出,问题得以解决,该方法可以灵活运用于多个串口输出的情况下

现将各个模块代码进行分析:

首先介绍一下串口初始化部分

串口初始化需要使能串口,使能所用的gpio引脚,若是收发模式,还需配置中断部分,代码为:

串口1初始化:

该程序为了修改方便,先定义了串口指针

USART_TypeDef * DEBUG_USARTx = USART1;   //定义串口指针,通过指针指到使用串口的各个寄存器,(SR状态寄存器,DR数据寄存器)

void USART_Config(void)

{ 

    uart1_init(9600);

    uart2_init(115200);

    uart3_init(115200);

}//配置波特率函数

void uart1_init(u32 bt)    

{    

    GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO    

    NVIC_InitTypeDef NVIC_InitStructure; //中断结构体定义    

    USART_InitTypeDef USART_InitStructure; //串口结构体定义    



    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);    //使能gpio,串口1,以及afio



    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX    

    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;    

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;    

    GPIO_Init(GPIOA,&GPIO_InitStructure);    

    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX    

    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;    

    GPIO_Init(GPIOA,&GPIO_InitStructure);    

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);    //设置中断分组

    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;     

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;     

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;     

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     

    NVIC_Init(&NVIC_InitStructure);    





    USART_InitStructure.USART_BaudRate=bt; //波特率设置为bt    

    USART_InitStructure.USART_WordLength=USART_WordLength_8b;    

    USART_InitStructure.USART_StopBits=USART_StopBits_1;    

    USART_InitStructure.USART_Parity=USART_Parity_No;    

    USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;    

    USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;    

    USART_Init(USART1,&USART_InitStructure);    

    USART_Cmd(USART1, ENABLE);    

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能或者失能指定的USART中断 接收中断    

    USART_ClearFlag(USART1,USART_FLAG_TC);//清除USARTx的待处理标志位  

}    

串口2和串口3的初始化与串口1初始化大同小异,只需要修改串口使能和引脚号即可。

其次介绍一下重定向:

//重定向c库函数printf到串口

int fputc(int ch, FILE *f)

{

  USART_SendData(DEBUG_USARTx, (uint8_t) ch);//串口发送函数

  while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);  

  return (ch);

}

在配置完成后,使用串口输出时:

串口1:

DEBUG_USARTx = USART1;
printf(); //自定义即可
 

串口2:

DEBUG_USARTx = USART2;

printf(); //自定义即可

串口3:

DEBUG_USARTx = USART3;
printf(); //自定义即可

    文章来源地址https://www.toymoban.com/news/detail-420241.html

到了这里,关于一种解决STM32多串口同时收发的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 Cubemx配置串口收发

    最近学到了串口收发,简单记录一下注意事项。 以使用USART1为例。 USART1需配置成 异步工作模式Asynchronous 。 并且 需要使能NVIC 。 我偏向于在stm32f1xx_it.c文件中对printf进行重定向,重定向函数如下。 同时需包含头文件路径#include “stdio.h” 在工程属性Target下, 勾选Use MicroLIB

    2024年02月10日
    浏览(42)
  • STM32+UART串口+DMA收发

    目录 1、cubemax端配置 1.1 初始化配置 1.2 GPIO配置  1.3 UART配置 1.3.1 串口基础配置 1.3.2 DMA配置 2、keil端代码设计 2.1 初始化配置 2.2 DMA接收初始化配置 2.3 DMA发送配置  2.4 接收回调函数设置 2.5 回调函数内容代码编写 2.5.1 接收回调函数 2.5.2 发送回调函数 2.6 回调函数内容代码优化

    2024年02月07日
    浏览(32)
  • HAL库STM32的串口收发教程

            首先配置STM32CubeMX 第一步在系统SYS里的Debug(调试)选项选择Serial Wire(这里使用ST-LINK-V2仿真下载器所以选择该项)。  第二打开使用外部晶振  在芯片引脚上点击PC13选择GPIO_Output(即设置GPIO为输出模式) 点击GPIO,点击PC13 在其下方配置引脚: GPIO out  level 设置成

    2024年02月14日
    浏览(27)
  • STM32(1)-简单实现串口收发与通信

    本文通过串口收发实验来说明具体的串口的使用过程,以及与其他外设通过串口进行通信从而实现相关功能。 前言 在STM32里,串口通信是USART,STM32可以通过串口和其他设备进行传输并行数据,是全双工,异步时钟控制,设备之间是点对点的传输。对应的STM32引脚分别是RX和TX端

    2024年02月08日
    浏览(32)
  • stm32串口+DMA环形缓冲收发保姆级

    首先在此感谢开源项目,以及大佬们的无私奉献,让每一个逐梦人能够免费学习,再次感谢! 发布只为记录,记性不够,笔记来凑。记得点赞哦 具体实现原理讲起来确实挺复杂,不过用起来还是很NICE的!可以直接移植! 1.1、选择单片机型号 2、配置时钟和串口 或者直接在

    2024年02月10日
    浏览(29)
  • 【STM32】STM32F103C8T6串口通信,实现3个串口收发数据

    串口通信(Serial Communications)实现单片机与电脑或者其它外设进行通信,通信时只需两根线(TX,RX)就可以实现数据传输。STM32f103有三个串口,分别为串口1(RX PA10, TX PA 9),串口2(RX PA3,TX PA2),串口3(RX PB11,TX PB10)。 以下代码是配置三个串口: usart.c usart.h main.c 注意,

    2024年02月12日
    浏览(36)
  • 【STM32笔记】STM32的串口数据收发基础(四)(USART DMA模式)

         在STM32中编写串口通信数据收发有三种方式: 轮询模式 (阻塞方式), 中断模式 (非阻塞方式)以及 DMA模式 。      打开STM32CubeMX,前部分配置流程如串口数据收发基础(三)节里一样。配置好USART1的基本参数,开启定时器中断后,接下来就要开启USART1的DMA。

    2024年02月03日
    浏览(27)
  • STM32+CubeMX零基础串口收发全攻略

    第一章:初学单片机,使用STM32进行点灯 本文主要是解决简单的串口通信 提示:以下是本篇文章正文内容,下面案例可供参考 本案例主要涉及到的装置和软件有: 1.一块STM32F103ZET6的开发板(也可使用其它板子) 2.ST-LINKV2(有钱的也可使用J-link等)一个与杜邦线若干 3.涉及到

    2024年02月13日
    浏览(26)
  • stm32和python实现DMA+串口数据收发

    1-0 串口配置 1-1 DMA发送模式配置 1-2 通过DMA传输数据到USART1的发送寄存器 1-3 串口数据发送 将usart1_dma_tx_data()函数放在main函数中或者中断处理函数中即可,如下所示: 2-1 DMA接收模式配置 2-2 串口结束中断 2-3 对串口接收的数据进行处理 3 完整程序

    2024年02月14日
    浏览(27)
  • 【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)

    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和

    2024年01月19日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包