[MM32软件] MM32F0140 UART1中断接收

[复制链接]
 楼主| LEDyyds 发表于 2024-10-30 14:47 | 显示全部楼层 |阅读模式
目录:
1.MM32F0140简介
2.初始化MM32F0140 UART1和NVIC中断
3.编写MM32F0140 UART1中断接收函数
4.编写MM32F0140 UART1发送字节和ASCII字符函数
5.编写MM32F0140 UART1处理中断接收到的数据函数
6.MM32F0140 UART1发送UART1中断接收到的数据到上位机串口助手
提要:
  学习MM32F0140 UART1中断接收数据,通过上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0140的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手显示出来。

 楼主| LEDyyds 发表于 2024-10-30 14:48 | 显示全部楼层
1、MM32F0140简介
  (1)MM32F0140微控制器是基于Arm® Cortex®-M0内核,最高工作频率可达72MHz;
  (2)供电电压支持:2.0V - 5.5V;
  (3)多达64KB的Flash,8KB的SRAM;
  (4)1个I2C;
  (5)3个UART;
  (6)1个12位共13通道的ADC;
  (7)2个I2C或I2S;
  (8)1个16位高级定时,1个16位和1个32位的通用定时器,3个16位的基本定时器;
  (9)1个FlexCAN接口;
  (10)1个IWDG和1个WWDG看门狗。
2.初始化MM32F0140 UART1和NVIC中断:
  MM32F0140 UART1的GPIO初始化,根据MM32F0140的DS数据手册选择PA9:UART1_TX,PA10:UART1_RX做为UART1的发送和接收数据的引脚,具体配置步骤,及其初始化如下所示:
(1)使能GPIOA外设时钟;
(2)配置IO管脚GPIO_AFx复用为UART1功能;
(3)配置UARTx IO的管脚;
(4)配置GPIO的输出速度;
(5)配置IO管脚的工作模式;
(6)根据GPIOA配置的参数整体初始化GPIO各管脚的成员参数。
  1. static void Bsp_UART1_GPIO_Init(void)
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;

  4.     //Enable GPIOA Clock
  5.     RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
  6.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_1);
  7.     GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_1);

  8.     //UART1_TX   GPIOA.9
  9.     GPIO_StructInit(&GPIO_InitStruct);
  10.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  11.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  12.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  13.     GPIO_Init(GPIOA, &GPIO_InitStruct);

  14.     //UART1_RX    GPIOA.10
  15.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  16.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
  17.     GPIO_Init(GPIOA, &GPIO_InitStruct);
  18. }
 MM32F0140 UART1和NVIC中断优先级初始化,具体配置步骤,及其初始化如下所示:
(1)使能UART1外设时钟;
(2)调用之前配置的UART1GPIO初始化函数;
(3)调配置UART1通信波特率为115200;
(4)配置UART1字长为8位;
(5)配置UART1收发数据为1位停止位;
(6)配置UART1收发数据为无奇偶校验位;
(7)配置UART1允许串口收发数据;
(8)根据以上配置参数初始化UART1结构体成员;
(9)使能UART1中断接收功能;
(10)配置UART1的NVIC中断优先级为0,并使能和初始化NVIC中断(优先级为0-3均可,参数越小优先级越高)。
  根据以上配置参数,则UART1初始化代码如下所示:
  1. void Bsp_UART1_NVIC_Init(u32 baudrate)
  2. {
  3.     UART_InitTypeDef UART_InitStruct;
  4.     NVIC_InitTypeDef NVIC_InitStruct;
  5.     //Enable UART1 Clock
  6.     RCC_APB2PeriphClockCmd(RCC_APB2ENR_UART1, ENABLE);
  7.    
  8.     Bsp_UART1_GPIO_Init();
  9.    
  10.     UART_StructInit(&UART_InitStruct);
  11.     UART_InitStruct.BaudRate = baudrate;
  12.     //The word length is in 8-bit data format.
  13.     UART_InitStruct.WordLength = UART_WordLength_8b;
  14.     UART_InitStruct.StopBits = UART_StopBits_1;
  15.     //No even check bit.
  16.     UART_InitStruct.Parity = UART_Parity_No;
  17.     //No hardware data flow control.
  18.     UART_InitStruct.HWFlowControl = UART_HWFlowControl_None;
  19.     UART_InitStruct.Mode = UART_Mode_Rx | UART_Mode_Tx;
  20.     UART_Init(UART1, &UART_InitStruct);
  21.    
  22.     UART_ITConfig(UART1,UART_IT_RXIEN, ENABLE);
  23.    
  24.     //UART1 NVIC
  25.     NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;
  26.     NVIC_InitStruct.NVIC_IRQChannelPriority = 1;
  27.     NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  28.     NVIC_Init(&NVIC_InitStruct);
  29.    
  30.     UART_Cmd(UART1, ENABLE);
  31. }


 楼主| LEDyyds 发表于 2024-10-30 14:49 | 显示全部楼层
3.编写MM32F0140 UART1中断接收函数:
(1)定义UART1接收和发送数据相关的的缓存,变量如下所示:
  1. //UART1 Recv Buffer
  2. u8 gUART1_Rx_Buf[UART1_RXD_LEN];      
  3. //UART1 Recv Count
  4. u16 gUART1_Rx_Cnt;  
  5. //UART1 Recv Timing Count
  6. u8 gUART1_Rx_TimeCnt = 0;
  7. //UART1 Recv Flag
  8. bool gUART1_Rx_Flag = false;
(2)头文件声明与UART1接收和发送相关的宏,缓存、变量以及函数声明,如下所示:
  1. //UART1 Baudrate
  2. #define UART1_BAUDRATE  (115200)
  3. //UART1 Recv length
  4. #define UART1_RXD_LEN   (200)

  5. //UART1 Recv Buffer
  6. extern u8 gUART1_Rx_Buf[UART1_RXD_LEN];
  7. //UART1 Recv Count
  8. extern u16 gUART1_Rx_Cnt;
  9. //UART1 Recv Timing Count
  10. extern u8 gUART1_Rx_TimeCnt;
  11. //UART1 Recv Flag
  12. extern bool gUART1_Rx_Flag;

  13. //UART1 NVIC Init
  14. void Bsp_UART1_NVIC_Init(u32 baudrate);
  15. //Process UART1 Recv Task
  16. void Bsp_UART1_Recv_Task(void);
  17. //UART sends a byte data
  18. void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data);
  19. //Send ASCII characters
  20. void Bsp_UART_SendASCII(UART_TypeDef* uart,char* str);
  21. //UART sends multi-byte data
  22. void Bsp_UART_SendBytes(UART_TypeDef* uart,u8* buf, u16 len);
(3)编写UART1中断接收数据函数,如下所示:
  1. void UART1_IRQHandler(void)
  2. {
  3.     u8 Recv;

  4.     if(UART_GetITStatus(UART1, UART_IT_RXIEN) != RESET)
  5.     {
  6.         UART_ClearITPendingBit(UART1, UART_IT_RXIEN);

  7.         Recv = UART_ReceiveData(UART1);
  8.         
  9.         gUART1_Rx_Buf[gUART1_Rx_Cnt] = Recv;
  10.         
  11.         if(gUART1_Rx_Cnt < UART1_RXD_LEN-1)
  12.         {
  13.             gUART1_Rx_Cnt++;
  14.         }
  15.         else
  16.         {
  17.             gUART1_Rx_Cnt = 0;        
  18.         }  
  19.         if(gUART1_Rx_Cnt >= 8)
  20.         {
  21.             gUART1_Rx_Flag = 1;
  22.         }        
  23.     }
  24. }


 楼主| LEDyyds 发表于 2024-10-30 14:51 | 显示全部楼层
4.编写MM32F0140 UART1发送字节和ASCII字符函数:
(1)MM32F0140 UART1发送字节函数如下所示:
  1. void Bsp_UART_SendByte(UART_TypeDef* uart,u8 data)
  2. {
  3.     UART_SendData(uart, data);
  4.     while(!UART_GetFlagStatus(uart,UART_FLAG_TXEPT));
  5. }

(2)MM32F0140  UART1发送多字节函数如下所示:
  1. void Bsp_UART_SendBytes(UART_TypeDef* uart,u8 *buf, u16 len)
  2. {
  3.     while(len--)
  4.     {
  5.         Bsp_UART_SendByte(uart,*buf++);
  6.     }
  7. }

[url=](3)MM32F0140  UART1发送ASCII字符串函数如下所示:[/url]
  1. void Bsp_UART_SendASCII(UART_TypeDef* uart,char *str)
  2. {
  3.     while(*str)
  4.     {
  5.         Bsp_UART_SendByte(uart,*str++);
  6.     }
  7. }

[url=]5.编写MM32F0140 UART1处理中断接收到的数据函数:[/url]
  MM32F0140 UART1处理中断接收到的数据函数如下所示,当上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0140的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手。
  1. void Bsp_UART1_Recv_Task(void)
  2. {
  3.     if(gUART1_Rx_Flag == 1)
  4.     {
  5.         gUART1_Rx_Flag = 0;
  6.         
  7.         if((gUART1_Rx_Buf[0] == 0xAA) && (gUART1_Rx_Buf[1] == 0x01) && (gUART1_Rx_Buf[2] == 0x02) && (gUART1_Rx_Buf[3] == 0x03) && \
  8.             (gUART1_Rx_Buf[4] == 0x04) && (gUART1_Rx_Buf[5] == 0x05) && (gUART1_Rx_Buf[6] == 0x06) && (gUART1_Rx_Buf[7] == 0x55))
  9.         {
  10.             Bsp_UART_SendBytes(UART1,gUART1_Rx_Buf,8);
  11.         }
  12.         gUART1_Rx_Cnt = 0;        
  13.         memset(gUART1_Rx_Buf,0,sizeof(gUART1_Rx_Buf));  
  14.     }
  15. }

[url=]6.MM32F0140 UART1发送UART1中断接收到的数据到上位机串口助手:[/url]
  当上位机串口助手发送8字节的十六进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55;下位机MM32F0140的UART1中断接收到一帧:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手。
(1)在main函数中调用UART1 NVIC初始化函数;
(2)在main函数的while(1)主循环中调用UART1处理中断接收到的数据函数,循环检测UART1的接收中断是否接收到上位机串口助手下发的数据,如有收到就原样发送到上位机串口助手上显示出来;
  1. int main(void)
  2. {   
  3.     //UART1 NVIC Init Baudrate 115200
  4.     Bsp_UART1_NVIC_Init(UART1_BAUDRATE);
  5.    
  6.     while(1)
  7.     {
  8.         //Test UART1 RX TX
  9.         Bsp_UART1_Recv_Task();
  10.     }
  11. }

[url=](3)上位机串口助手发送8字节16进制数据:0xAA,0x01,0x02,0x03,0x04,0x05,0x06,0x55,下位机MM32F0020 UART1中断接收到一帧数据后原样把接收到的数据发送到上位机上显示出来,如下图1所示:[/url]
[url=] 309616721d75816fb7.png [/url]

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

本版积分规则

122

主题

867

帖子

1

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

122

主题

867

帖子

1

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