[MM32软件] 灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据

[复制链接]
 楼主| LEDyyds 发表于 2024-10-30 14:38 | 显示全部楼层 |阅读模式
本帖最后由 LEDyyds 于 2024-10-30 14:46 编辑

目录:
1、MM32F0010UART简介
2、MM32F0010UART特性
3、MM32F0010使用UART2的注意事项
4、MM32F0010UART中断接收的初始化配置
5、MM32F0010UART中断接收函数的编写
6、MM32F0010UART查询方式发送数据函数的编写
7、MM32F0010UART处理接收数据函数的编写

文章出处:https://www.cnblogs.com/armny3264-lcpj/p/MM32F0010_UART1_UART2_Interruupt_Recv_Config.html
 楼主| LEDyyds 发表于 2024-10-30 14:38 | 显示全部楼层
1、MM32F0010UART简介:
  MM32F0010的通用异步收发器 (UART) 提供了一种灵活的方法与使用工业标准 NRZ 异步串行数据格式的外部设备之间进行全双工数据交换。UART 利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信。
2、MM32F0010UART特性:
• 支持异步方式下 RS-232S 协议,符合工业标准 16550
• 全双工异步操作
• 分数波特率发生器系统
• 发送和接收共用的可编程波特率
• 单独分开的发送和接收缓冲寄存器
• 内置 1 字节发送和 1 字节接收缓冲
• 发送和接收数据低位在前
• 一个起始位开始,后面接数据位,输出的数据长度可为 5 位、6 位、7 位、8 位,最后为
停止位。另外可选择是否有加奇偶校验位,奇偶校验位在数据位之后停止位之前。
• 第 9 位可做同步帧配置
• 支持硬件奇数或者偶数校验产生和侦测
• 线断开产生和侦测
• 线空闲产生和侦测
• 支持 LIN 协议下收发 brk
• 支持信号收发互换,接收和发送取反
• 支持波特率自适应功能
• 支持下面中断源:
– 发送端 BUFFER 空
– 接收端数据有效
– 接收缓冲缓存溢出
– 帧错误
– 奇偶校验错误
– 接收断开帧
– 发送移位寄存器完成
– 发送断开帧完成
– 接收同步帧
– 空闲帧完成
– 自动波特率结束
– 自动波特率错误
3、MM32F0010使用UART2的注意事项:
  注意:因PA13为SWD烧录口,MCU每次上电复位瞬间默认为SWD功能,如果用户把PA13复用成了UART2_RX功能,则在main函数中很快就被初始化成串口2的UART2_RX功能,导致来不及识别烧录时序,造成下次无法支持烧录代码,因此最好延时1s再复用为UART2_RX功能,让烧录器每次烧录时有足够的时间识别MCU的
烧录时序。

 楼主| LEDyyds 发表于 2024-10-30 14:39 | 显示全部楼层
4、MM32F0010UART中断接收的初始化配置:
(1)在MDK Keil工程中新建bsp_uartx.c和bsp_uartx.h文件,在bsp_uartx.c中包含bsp_uartx.h头文件
(2)在bsp_uartx.c文件中编写UART1中断接收的初始化函数,并定义UART1和UART2的接收缓存等参数
  1. #include "bsp_uartx.h"

  2. //UART1接收缓存,最大UART1_REC_LEN个字节
  3. u8 UART1_Rx_Buf[UART1_REC_LEN];
  4. //UART1接收计数
  5. u16 UART1_Rx_Cnt;
  6. //UART1多少ms允许判断接收完数据
  7. u8 UART1_Rx_TimeCnt = 0;

  8. //UART2接收缓存,最大UART1_REC_LEN个字节
  9. u8 UART2_Rx_Buf[UART2_REC_LEN];
  10. //UART2接收计数
  11. u16 UART2_Rx_Cnt;
  12. //UART2多少ms允许判断接收完数据
  13. u8 UART2_Rx_TimeCnt = 0;
  14. //UART1 接收标志
  15. bool UART1_Rx_Flag = false;
  16. //UART2 接收标志
  17. bool UART2_Rx_Flag = false;

  18. /**
  19. ***********************************************************************************************************************
  20. *@函数名称:void Bsp_UART1_Init_Config(u32 bound)
  21. *@功能描述:UART2 Init
  22. *@输入参数:bound:通信波特率
  23. *@返回参数:None
  24. ***********************************************************************************************************************
  25. */
  26. void Bsp_UART1_Init_Config(u32 bound)
  27. {
  28.     GPIO_InitTypeDef GPIO_InitStructure;
  29.     UART_InitTypeDef UART_InitStructure;
  30.     NVIC_InitTypeDef NVIC_InitStruct;

  31.     //使能UART1 时钟
  32.     RCC_APB1PeriphClockCmd(RCC_APB1ENR_UART1, ENABLE);
  33.     //使能GPIOA时钟
  34.     RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);

  35.     //PA3 复用功能为UART1_RX
  36.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
  37.     //PA12 复用功能为UART1_TX
  38.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_1);

  39.     GPIO_StructInit(&GPIO_InitStructure);
  40.     //PA12 UART1_TX
  41.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  42.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  43.     //PA12 UART1_TX 推挽输出
  44.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  45.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  46.     //GPIOA.3 UART1_RX
  47.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  48.     //PA3 UART1_RX上拉输入
  49.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  50.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  51.     //自定义值初始化UART1结构体成员
  52.     UART_StructInit(&UART_InitStructure);
  53.     //配置串口波特率
  54.     UART_InitStructure.UART_BaudRate = bound;
  55.     //8位数据位长度
  56.     UART_InitStructure.UART_WordLength = UART_WordLength_8b;
  57.     //1位停止位
  58.     UART_InitStructure.UART_StopBits = UART_StopBits_1;
  59.     //配置为不带奇偶校验位
  60.     UART_InitStructure.UART_Parity = UART_Parity_No;
  61.     //配置为不带硬件流控
  62.     UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
  63.     //允许UART接收和发送数据
  64.     UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;
  65.     //使能UART1接收中断
  66.     UART_ITConfig( UART1,  UART_IT_RXIEN, ENABLE);
  67.     //根据配置的UART1结构体成员初始化UART1
  68.     UART_Init(UART1, &UART_InitStructure);

  69.     //使能UART1 NVIC中断通道
  70.     NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;
  71.     //使能UART1 NVIC中断
  72.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

  73.     //设置UART1中断优先级
  74.     NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
  75.     //根据配置的中断优先级参数初始化NVIC中断优先级
  76.     NVIC_Init(& NVIC_InitStruct);
  77.     //使能UART1工作
  78.     UART_Cmd(UART1, ENABLE);
  79. }


 楼主| LEDyyds 发表于 2024-10-30 14:39 | 显示全部楼层
(3)在bsp_uartx.c文件中编写UART2中断接收的初始化函数
  1. /**
  2. ***********************************************************************************************************************
  3. *@函数名称:void Bsp_UART2_Init_Config(u32 bound)
  4. *@功能描述:UART2 Init
  5. *@输入参数:bound:通信波特率
  6. *@返回参数:None
  7. ***********************************************************************************************************************
  8. */
  9. void Bsp_UART2_Init_Config(u32 bound)
  10. {
  11.     //GPIO GPIO set
  12.     GPIO_InitTypeDef GPIO_InitStructure;
  13.     UART_InitTypeDef UART_InitStructure;
  14.     NVIC_InitTypeDef NVIC_InitStruct;

  15.     //使能GPIOA时钟
  16.     RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
  17.     //使能UART2时钟
  18.     RCC_APB1PeriphClockCmd(RCC_APB1ENR_UART2, ENABLE);

  19.     //PA1 复用功能为UART2_TX
  20.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_2);
  21.     //PA13 复用功能为UART2_RX
  22.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource13, GPIO_AF_2);

  23.     GPIO_StructInit(&GPIO_InitStructure);
  24.     //PA1 UART2_TX
  25.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  26.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  27.     //PA1 UART2_TX 推挽输出
  28.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  29.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  30.     //GPIOA.13 UART2_RX
  31.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
  32.     //PA13 UART2_RX上拉输入
  33.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  34.     GPIO_Init(GPIOA, &GPIO_InitStructure);

  35.     //自定义值初始化UART2结构体成员
  36.     UART_StructInit(&UART_InitStructure);
  37.     //配置串口波特率
  38.     UART_InitStructure.UART_BaudRate = bound;
  39.     //8位数据位长度
  40.     UART_InitStructure.UART_WordLength = UART_WordLength_8b;
  41.     //1位停止位
  42.     UART_InitStructure.UART_StopBits = UART_StopBits_1;
  43.     //配置为不带奇偶校验位
  44.     UART_InitStructure.UART_Parity = UART_Parity_No;
  45.     //配置为不带硬件流控
  46.     UART_InitStructure.UART_HardwareFlowControl = UART_HardwareFlowControl_None;
  47.     //允许UART接收和发送数据
  48.     UART_InitStructure.UART_Mode = UART_Mode_Rx | UART_Mode_Tx;
  49.     //使能UART2接收中断
  50.     UART_ITConfig(UART2,  UART_IT_RXIEN, ENABLE);
  51.     //根据配置的UART2结构体成员初始化UART2
  52.     UART_Init(UART2, &UART_InitStructure);

  53.     //使能UART2 NVIC中断通道
  54.     NVIC_InitStruct.NVIC_IRQChannel = UART2_IRQn;
  55.     //使能UART2 NVIC中断
  56.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  57.     //设置UART2中断优先级
  58.     NVIC_InitStruct.NVIC_IRQChannelPriority = 1;
  59.     //根据配置的中断优先级参数初始化NVIC中断优先级
  60.     NVIC_Init(& NVIC_InitStruct);
  61.     //使能UART2工作
  62.     UART_Cmd(UART2, ENABLE);
  63. }


 楼主| LEDyyds 发表于 2024-10-30 14:40 | 显示全部楼层
(4)在bsp_uartx.h文件中编写头文件,包括UART1和UART2中断接收初始化函数以及变量的外部声明,代码如下所示:
  1. #ifndef __BSP_UARTX__H__
  2. #define __BSP_UARTX__H__

  3. #include "mm32_device.h"
  4. #include "hal_conf.h"
  5. #include "string.h"

  6. //UART1 Baudrate
  7. #define UART1_BAUD_RATE    (115200)
  8. //UART2 Baudrate
  9. #define UART2_BAUD_RATE    (115200)

  10. //UART1最大接收字节数200
  11. #define UART1_REC_LEN   (200)
  12. //UART2最大接收字节数200
  13. #define UART2_REC_LEN   (200)

  14. //UART1接收缓存,最大UART1_REC_LEN个字节
  15. extern u8  UART1_Rx_Buf[UART1_REC_LEN];
  16. //UART2接收缓存,最大UART2_REC_LEN个字节
  17. extern u8  UART2_Rx_Buf[UART2_REC_LEN];

  18. //UART1接收计数
  19. extern u16 UART1_Rx_Cnt;
  20. //UART2接收计数
  21. extern u16 UART2_Rx_Cnt;

  22. //UART1多少ms允许判断接收完数据
  23. extern u8 UART1_Rx_TimeCnt;
  24. extern u8 UART2_Rx_TimeCnt;
  25. //UART1 接收标志
  26. extern bool UART1_Rx_Flag;
  27. //UART2 接收标志
  28. extern bool UART2_Rx_Flag;
  29. //UART1 Init
  30. void Bsp_UART1_Init_Config(u32 bound);
  31. //UART2 Init
  32. void Bsp_UART2_Init_Config(u32 bound);
  33. //处理UART1接收任务
  34. void Bsp_UART1_Recv_Task(void);
  35. //处理UART2接收任务
  36. void Bsp_UART2_Recv_Task(void);
  37. //发送单字节数据
  38. void Bsp_UART_SendByte(u8 dat);
  39. //发送多字节数据
  40. void Bsp_UART_SendBytes(u8 *buf, u16 len);
  41. //发送ASCII字符
  42. void Bsp_UART_SendASCII(char *str);

  43. #endif


 楼主| LEDyyds 发表于 2024-10-30 14:41 | 显示全部楼层
5、MM32F0010UART中断接收函数的编写:
(1)在bsp_uartx.c文件中编写UART1中断接收数据函数,代码如下所示:
  1. /**
  2. ***********************************************************************************************************************
  3. *@函数名称:void UART1_IRQHandler(void)
  4. *@功能描述:UART1 中断服务函数
  5. *@输入参数:None
  6. *@返回参数:None
  7. ***********************************************************************************************************************
  8. */
  9. void UART1_IRQHandler(void)
  10. {
  11.     u8 Recbyte;

  12.     if(UART_GetITStatus(UART1, UART_IT_RXIEN) == SET)
  13.     {
  14.         UART_ClearITPendingBit(UART1, UART_IT_RXIEN);
  15.         //在TIM3里面对接收做超时处理,为后续处理接收数据做准备
  16.         UART1_Rx_TimeCnt = 2;
  17.         //读出UART1接收到的数据到Recbyte
  18.         Recbyte = UART_ReceiveData(UART1);
  19.         //把UART1接收到的数据缓存到UART1接收缓存数组中
  20.         UART1_Rx_Buf[UART1_Rx_Cnt] = Recbyte;

  21.         if(UART1_Rx_Cnt < UART1_REC_LEN-1)
  22.         {
  23.             //UART1接收计数
  24.             UART1_Rx_Cnt++;
  25.         }
  26.         else
  27.         {
  28.             //接收缓存满清接收计数
  29.             UART1_Rx_Cnt = 0;
  30.         }
  31.     }
  32. }
(2)在bsp_uartx.c文件中编写UART2中断接收数据函数,代码如下所示:
  1. /**
  2. ***********************************************************************************************************************
  3. *@函数名称:void UART2_IRQHandler(void)
  4. *@功能描述:UART2 中断服务函数
  5. *@输入参数:None
  6. *@返回参数:None
  7. ***********************************************************************************************************************
  8. */
  9. void UART2_IRQHandler(void)
  10. {
  11.     u8 Recbyte;

  12.     if(UART_GetITStatus(UART2, UART_IT_RXIEN) == SET)
  13.     {
  14.         UART_ClearITPendingBit(UART2, UART_IT_RXIEN);
  15.         //在TIM3里面对接收做超时处理,为后续处理接收数据做准备
  16.         UART2_Rx_TimeCnt = 3;
  17.         //读出UART2接收到的数据到Recbyte
  18.         Recbyte = UART_ReceiveData(UART2);
  19.         //把UART2接收到的数据缓存到UART2接收缓存数组中
  20.         UART2_Rx_Buf[UART2_Rx_Cnt] = Recbyte;

  21.         if(UART2_Rx_Cnt < UART2_REC_LEN-1)
  22.         {
  23.             //UART2接收计数
  24.             UART2_Rx_Cnt++;
  25.         }
  26.         else
  27.         {
  28.             //接收缓存满清接收计数
  29.             UART2_Rx_Cnt = 0;
  30.         }
  31.     }
  32. }


 楼主| LEDyyds 发表于 2024-10-30 14:42 | 显示全部楼层
6、MM32F0010UART查询方式发送数据函数的编写
(1)在bsp_uartx.c文件中编写UART查询方式发送单字节数据函数,代码如下所示:
  1. /**
  2. ***********************************************************************************************************************
  3. *@函数名称:void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data)
  4. *@功能描述:UART发送单字节数据
  5. *@输入参数:uart:串口号,data:待发送的数据
  6. *@返回参数:None
  7. ***********************************************************************************************************************
  8. */
  9. void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data)
  10. {
  11.     UART_SendData(uart, data);
  12.     while(!UART_GetFlagStatus(uart, UART_FLAG_TXEPT));
  13. }
2)在bsp_uartx.c文件中编写UART查询方式发送多字节数据函数,代码如下所示:
  1. /**
  2. ***********************************************************************************************************************
  3. *@函数名称:void Bsp_UART_SendBytes(UART_TypeDef* uart,u8 *buf, u16 len)
  4. *@功能描述:UART发送多字节数据
  5. *@输入参数:uart:串口号,buf:数据指针指向待发送的数据;len:数据长度
  6. *@返回参数:None
  7. ***********************************************************************************************************************
  8. */
  9. void Bsp_UART_SendBytes(UART_TypeDef* uart,u8 *buf, u16 len)
  10. {
  11.     while(len--)
  12.     {
  13.         Bsp_UART_SendByte(uart,*buf++);
  14.     }
  15. }
(3)在bsp_uartx.c文件中编写UART查询方式发送ASII字符函数,代码如下所示:
  1. /**
  2. ***********************************************************************************************************************
  3. *@函数名称:void Bsp_UART_SendASCII(UART_TypeDef* uart,char *str)
  4. *@功能描述:发送ASII字符
  5. *@输入参数:str:指向字符串的字符指针
  6. *@返回参数:None
  7. ***********************************************************************************************************************
  8. */
  9. void Bsp_UART_SendASCII(UART_TypeDef* uart,char *str)
  10. {
  11.     while(*str)
  12.     {
  13.         Bsp_UART_SendByte(uart,*str++);
  14.     }
  15. }



 楼主| LEDyyds 发表于 2024-10-30 14:44 | 显示全部楼层
7、MM32F0010UART处理接收数据函数的编写:
(1)在MDK Keil中新建bsp_timerx.c和bsp_timerx.h文件开一个TIM3定时器定时中断5ms为例,用作UART1和UART2接收数据超时标志,方便处理接收数据,bsp_timerx.c文件中包含bsp_timerx.h文件,在bsp_timerx.c中编写TIM3定时中断5ms初始化函数,代码如下所示:
  1. /**
  2. ***********************************************************************************************************************
  3. *@函数名称:void Bsp_TIM3_Init(u16 Prescaler,u16 Period)
  4. *@功能描述:TIM3 Init
  5. *@输入参数:Prescaler:预分频系数1-65536、Period:周期值
  6. *@返回参数:None
  7. ***********************************************************************************************************************
  8. */
  9. void Bsp_TIM3_Init(u16 Prescaler,u16 Period)
  10. {
  11.     TIM_TimeBaseInitTypeDef TIM_StructInit;
  12.     NVIC_InitTypeDef NVIC_StructInit;

  13.     //使能TIM3外设时钟
  14.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  15.     //配置TIM3重载计数周期值
  16.     TIM_StructInit.TIM_Period = Period;
  17.     //配置TIM3 预分频系数
  18.     TIM_StructInit.TIM_Prescaler = Prescaler;
  19.     //配置TIM3时钟分割
  20.     TIM_StructInit.TIM_ClockDivision = TIM_CKD_DIV1;
  21.     //向上计数模式
  22.     TIM_StructInit.TIM_CounterMode = TIM_CounterMode_Up;
  23.     //配置脉冲周期计数
  24.     TIM_StructInit.TIM_RepetitionCounter = 0;
  25.     //根据以上配置参数初始化 TIM3结构体成员参数
  26.     TIM_TimeBaseInit(TIM3, &TIM_StructInit);

  27.     //使能TIM3 NVIC中断优先级通道
  28.     NVIC_StructInit.NVIC_IRQChannel = TIM3_IRQn;
  29.     //配置TIM3 NVIC中断优先级
  30.     NVIC_StructInit.NVIC_IRQChannelPriority = 1;
  31.     //使能NVIC中断优先级
  32.     NVIC_StructInit.NVIC_IRQChannelCmd = ENABLE;
  33.     //根据配置的中断优先级参数初始化TIM3中断优先级
  34.     NVIC_Init(&NVIC_StructInit);

  35.     //TIM3计时之前清向上计数标志
  36.     TIM_ClearFlag(TIM3, TIM_FLAG_Update);
  37.     //使能TIM3向上计时中断
  38.     TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  39.     //使能TIM3 工作
  40.     TIM_Cmd(TIM3, ENABLE);
  41. }
(2)在bsp_timerx.c中编写TIM3定时中断5ms中断服务函数,代码如下所示:
  1. /**
  2. **************************************************************************************************************************
  3. * 函数名称:void TIM3_IRQHandler(void)
  4. * 函数功能:TIM3中断服务函数
  5. * 输入参数:无
  6. * 输出参数:无
  7. * 返回数值:无
  8. **************************************************************************************************************************
  9. */
  10. void TIM3_IRQHandler(void)
  11. {
  12.     if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
  13.     {
  14.         TIM_ClearITPendingBit(TIM3, TIM_IT_Update);

  15.         //UART1多少ms允许判断接收完数据,10ms可根据具体情况更改超时时间
  16.         if(UART1_Rx_TimeCnt > 0)
  17.         {
  18.             UART1_Rx_TimeCnt--;

  19.             if(UART1_Rx_TimeCnt == 0)
  20.             {
  21.                 UART1_Rx_Flag = true;
  22.             }
  23.         }
  24.         //UART2多少ms允许判断接收完数据,15ms可根据具体情况更改超时时间
  25.         if(UART2_Rx_TimeCnt > 0)
  26.         {
  27.             UART2_Rx_TimeCnt--;

  28.             if(UART2_Rx_TimeCnt == 0)
  29.             {
  30.                 UART2_Rx_Flag = true;
  31.             }
  32.         }
  33.     }
  34. }
(3)在bsp_timerx.h中编写头文件,包含TIM3定时中断5ms初始化函数声明,UART头文件包含,代码如下所示:
  1. #ifndef __BSP_TIMX__H__
  2. #define __BSP_TIMX__H__

  3. #include "mm32_device.h"
  4. #include "hal_conf.h"
  5. #include "bsp_uartx.h"


  6. //初始化TIM3
  7. void Bsp_TIM3_Init(u16 Prescaler,u16 Period);




  8. #endif
(4)在bsp_uartx.c中编写处理UART1接收数据函数
  1. /**
  2. ***********************************************************************************************************************
  3. *@函数名称:void Bsp_UART1_Recv_Task(void)
  4. *@功能描述:处理UART1接收任务
  5. *@输入参数:None
  6. *@返回参数:None
  7. ***********************************************************************************************************************
  8. */
  9. void Bsp_UART1_Recv_Task(void)
  10. {
  11.     //UART1接收标志
  12.     if(UART1_Rx_Flag == true)
  13.     {
  14.         UART1_Rx_Flag = false;

  15.         //UART1接收到0x55 0xAA 0xEE
  16.         if((UART1_Rx_Buf[0] == 0x55) && (UART1_Rx_Buf[1] == 0xAA) && (UART1_Rx_Buf[2] == 0xEE))
  17.         {
  18.             //UART1原样返回接收到的数据
  19.             Bsp_UART_SendBytes(UART1,UART1_Rx_Buf,UART1_Rx_Cnt);
  20.         }
  21.         //清UART1接收计数
  22.         UART1_Rx_Cnt = 0;
  23.         //清UART1接收缓存
  24.         memset(UART1_Rx_Buf,0,sizeof(UART1_Rx_Buf));
  25.     }
  26. }
(5)在bsp_uartx.c中编写处理UART2接收数据函数
  1. /**
  2. ***********************************************************************************************************************
  3. *@函数名称:void Bsp_UART2_Recv_Task(void)
  4. *@功能描述:处理UART2接收任务
  5. *@输入参数:None
  6. *@返回参数:None
  7. ***********************************************************************************************************************
  8. */
  9. void Bsp_UART2_Recv_Task(void)
  10. {
  11.     //UART2接收标志
  12.     if(UART2_Rx_Flag == true)
  13.     {
  14.         UART2_Rx_Flag = false;
  15.         //UART2接收到0xAA 0xBB 0xCC
  16.         if((UART2_Rx_Buf[0] == 0xAA) && (UART2_Rx_Buf[1] == 0xBB) && (UART2_Rx_Buf[2] == 0xCC))
  17.         {
  18.             //UART2原样返回接收到的数据
  19.             Bsp_UART_SendBytes(UART2,UART2_Rx_Buf,UART2_Rx_Cnt);
  20.         }
  21.         //清UART2接收计数
  22.         UART2_Rx_Cnt = 0;
  23.         //清UART2接收缓存
  24.         memset(UART2_Rx_Buf,0,sizeof(UART2_Rx_Buf));
  25.     }
  26. }
(6)在main.c中文件中包含"bsp_uartx.h"、"delay.h"(含SysTick 1ms初始化函数声明即DELAY_Init、DELAY_Ms(__IO u32 count))、"bsp_timerx.h"头文件,在main函数中分别调用SysTick初始化函数DELAY_Init、DELAY_Ms(1000);延时1s(注意:因PA13为SWD烧录口,MCU每次上电复位瞬间默认为SWD功能,如果用户把PA13复用成了UART2_RX功能在main函数中很快就被初始化成串口2的UART2_RX功能,导致来不及识别烧录时序,造成下次无法支持烧录代码,因此最好延时1s再复用为UART2_RX功能让烧录器每次烧录时有足够的时间识别MCU的烧录时序)Bsp_TIM3_Init、Bsp_UART1_Init_Config、Bsp_UART2_Init_Config初始化,波特率均设为115200,在while(1)大循环中分别调用Bsp_UART1_Recv_Task、Bsp_UART2_Recv_Task处理UART1和UART2接收任务函数,代码如下所示,编译代码并烧录到MM32F0010核心板或开发板中。
  1. #include "delay.h"
  2. #include "bsp_timerx.h"
  3. #include "bsp_uartx.h"

  4. /**
  5. ***********************************************************************************************************************
  6. *@函数名称:int main(void)
  7. *@功能描述:main函数,主函数入口代码在这里开始执行
  8. *@输入参数:None
  9. *@返回参数:int:0(和编译器有关)
  10. ***********************************************************************************************************************
  11. */
  12. int main(void)
  13. {
  14.     //SysTick Init
  15.     DELAY_Init();
  16.     //Delay 1000ms
  17.     DELAY_Ms(1000);
  18.     //TIM3 Init Config 5ms
  19.     Bsp_TIM3_Init(SystemCoreClock/100000-1,500-1);
  20.     //UART1 Init Baudrate 115200
  21.     Bsp_UART1_Init_Config(UART1_BAUD_RATE);
  22.     //UART2 Init Baudrate 115200
  23.     Bsp_UART2_Init_Config(UART2_BAUD_RATE);

  24.     while(1)
  25.     {
  26.         //处理UART1接收任务
  27.         Bsp_UART1_Recv_Task();
  28.         //处理UART2接收任务
  29.         Bsp_UART2_Recv_Task();

  30.     }
  31. }


您需要登录后才可以回帖 登录 | 注册

本版积分规则

122

主题

867

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部