目录:

1.MM32F0020简介

2.初始化MM32F0020 UART1空闲中断和NVIC中断

3.编写MM32F0020 UART1中断接收和空闲中断函数

4.编写MM32F0020 UART1发送字节和ASCII字符函数

5.编写MM32F0020 UART1处理空闲中断接收数据函数

6.MM32F0020 UART1发送UART1空闲中断接收到的数据到上位机串口助手

提要:

  学习MM32F0020 UART1空闲中断接收数据,UART1产生空闲中断表示接收完一帧数据,可以通过空闲中断置标志来判断一帧数据接收完成,通过上位机串口助手发送8字节的十六进制数据:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位机MM32F0020的UART1空闲中断接收到一帧:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手显示出来。

内容:

1、MM32F0020简介

(1)MM32F0020微控制器是基于Arm Cortex-M0内核,最高工作频率可达48MHz;

  (2)供电电压支持:2.0V - 5.5V;

  (3)多达32KB的Flash,2KB的SRAM;

  (4)1个I2C;

  (5)2个UART;

  (6)1个12位的共8通道的ADC;

  (7)1个I2C或I2S;

  (8)1个16位高级定时,1个16位通用定时器,1个16位基本定时器;

  (9)1个IWDG和一个WWDG看门狗。

2.初始化MM32F0020 UART1空闲中断和NVIC中断:

  MM32F0020 UART1的GPIO初始化,根据MM32F0020的DS数据手册选择PA12:UART1_TX,PA3:UART1_RX做为UART1的发送和接收数据的引脚,具体配置步骤,及其初始化如下所示:

(1)使能GPIOA外设时钟;

(2)配置IO管脚GPIO_AFx复用为UART1功能;

(3)配置UARTx IO的管脚;

(4)配置GPIO的输出速度;

(5)配置IO管脚的工作模式;

(6)根据GPIOA配置的参数整体初始化GPIO各管脚的成员参数。

  1. void Bsp_UART1_GPIO_Init(void)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStruct;
  4. RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
  5. //UART Initial set
  6. GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_1);
  7. GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_1);
  8.  
  9. //UART1_TX GPIOA.12
  10. GPIO_StructInit(&GPIO_InitStruct);
  11. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
  12. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  13. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  14. GPIO_Init(GPIOA, &GPIO_InitStruct);
  15.  
  16. //UART1_RX GPIOA.3
  17. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3;
  18. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
  19. GPIO_Init(GPIOA, &GPIO_InitStruct);
  20. }

  MM32F0020 UART1和NVIC中断优先级初始化,并使能UART1空闲中断功能,具体配置步骤,及其初始化如下所示:

(1)使能UART1外设时钟;

(2)调用之前配置的UART1GPIO初始化函数;

(3)调配置UART1通信波特率为115200;

(4)配置UART1字长为8位;

(5)配置UART1收发数据为1位停止位;

(6)配置UART1收发数据为无奇偶校验位;

(7)配置UART1允许串口收发数据;

(8)根据以上配置参数初始化UART1结构体成员;

(9)使能UART1中断接收和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_APB1PeriphClockCmd(RCC_APB1ENR_UART1, ENABLE);
  7. //UART1 GPIO Init
  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. //Enable UART1 RXIEN and RXIDLE
  22. UART_ITConfig(UART1,UART_IT_RXIEN | UART_IER_RXIDLE, ENABLE);
  23.  
  24. //UART1 NVIC
  25. NVIC_InitStruct.NVIC_IRQChannel = UART1_IRQn;
  26. //UART1 Priority
  27. NVIC_InitStruct.NVIC_IRQChannelPriority = 0;
  28. //Enable UART1_IRQn
  29. NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
  30. NVIC_Init(& NVIC_InitStruct);
  31.  
  32. UART_Cmd(UART1,ENABLE);
  33. }

3.编写MM32F0020 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 IDLE Flag
  6. u8 gUART1_IDLE_Flag = 0;

(2)头文件声明与UART1空闲中断接收和发送相关的宏,缓存、变量以及函数声明等,如下所示:

  1. //UART1 Baudrate
  2. #define UART1_BAUDRATE (115200)
  3. //UART1 Recv length
  4. #define UART1_RXD_LEN (200)
  5.  
  6. //UART1 Recv Buffer
  7. extern u8 gUART1_Rx_Buf[UART1_RXD_LEN];
  8. //UART1 Recv Count
  9. extern u16 gUART1_Rx_Cnt;
  10. //UART1 IDLE Flag
  11. extern u8 gUART1_IDLE_Flag;
  12.  
  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.  
  5. //Check receive status
  6. if(UART_GetITStatus(UART1, UART_IT_RXIEN) == SET)
  7. {
  8. UART_ClearITPendingBit(UART1, UART_IT_RXIEN);
  9.  
  10. Recv = UART_ReceiveData(UART1);
  11.  
  12. gUART1_Rx_Buf[gUART1_Rx_Cnt] = Recv;
  13.  
  14. if(gUART1_Rx_Cnt < UART1_RXD_LEN-1)
  15. {
  16. gUART1_Rx_Cnt++;
  17. }
  18. else
  19. {
  20. gUART1_Rx_Cnt = 0;
  21. }
  22. }
  23. if(UART_GetITStatus(UART1, UART_IER_RXIDLE) != RESET)
  24. {
  25. UART_ClearITPendingBit(UART1,UART_IER_RXIDLE);
  26. gUART1_IDLE_Flag = 1;
  27. }
  28. }

4.编写MM32F0020 UART1发送字节和ASCII字符函数:

(1)MM32F0020 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)MM32F0020  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. }

(3)MM32F0020  UART1发送ASCII字符串函数如下所示:

  1. void Bsp_UART_SendASCII(UART_TypeDef* uart,char *str)
  2. {
  3. while(*str)
  4. {
  5. Bsp_UART_SendByte(uart,*str++);
  6. }
  7. }

5.编写MM32F0020 UART1处理空闲中断接收数据函数

  MM32F0020 UART1处理空闲中断接收到的数据函数如下所示,当上位机串口助手发送8字节的十六进制数据:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位机MM32F0020的UART1中断接收到一帧:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手。

  1. void Bsp_UART1_Recv_Task(void)
  2. {
  3. //UART1 IDLE Flag
  4. if(gUART1_IDLE_Flag == 1)
  5. {
  6. gUART1_IDLE_Flag = 0;
  7.  
  8. if((gUART1_Rx_Buf[0] == 0x55) && (gUART1_Rx_Buf[1] == 0x01) && (gUART1_Rx_Buf[2] == 0x02) && (gUART1_Rx_Buf[3] == 0x03) && \
  9. (gUART1_Rx_Buf[4] == 0x04) && (gUART1_Rx_Buf[5] == 0x05) && (gUART1_Rx_Buf[6] == 0x06) && (gUART1_Rx_Buf[7] == 0x07))
  10. {
  11. LED4_TOGGLE();
  12. Bsp_UART_SendBytes(UART1,gUART1_Rx_Buf,gUART1_Rx_Cnt);
  13. }
  14. gUART1_Rx_Cnt = 0;
  15. memset(gUART1_Rx_Buf,0,sizeof(gUART1_Rx_Buf));
  16. }
  17. }

6.MM32F0020 UART1发送UART1空闲中断接收到的数据到上位机串口助手

  当上位机串口助手发送8字节的十六进制数据:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位机MM32F0020的UART1空闲中断接收到一帧:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共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. //Process UART1 Recv Task
  9. Bsp_UART1_Recv_Task();
  10. }
  11. }

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

                图1

总结:

  学习MM32F0020 UART1空闲中断接收数据,UART1产生空闲中断表示接收完一帧数据,可以通过空闲中断置标志来判断一帧数据接收完成,通过上位机串口助手发送8字节的十六进制数据:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07;下位机MM32F0020的UART1空闲中断接收到一帧:0x55,0x01,0x02,0x03,0x04,0x05,0x06,0x07 共8字节数据后,通过UART1发送多字节函数,原样发送到串口助手显示出来。

注意事项:

  (1)MM32F0020每个外设都有自己独立的时钟,需使能UART1 发送和接收引脚的GPIO时钟;

  (2)使能UART1外设时钟;

  (3)配置GPIOA的 PA12和PA3复用成UART1功能

  (4)使能UART1接收中断和UART1空闲中断;

  (5)使能UART1 NVIC中断,使能UART1;

  (6)UART2的操作方法与UART1的方法一样,可参考以上UART1把对应的UART1参数改成UART2,使能UART2空闲中断,使能相应外设时钟即可。

MM32F0020 UART1空闲中断接收的更多相关文章

  1. MM32F0140 UART1空闲中断接收

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1空闲中断和NVIC中断 3.编写MM32F0140 UART1中断接收和空闲中断函数 4.编写MM32F0140 UART1 ...

  2. MM32F0020 UART1中断接收

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1和NVIC中断 3.编写MM32F0020 UART1中断接收函数 4.编写MM32F0020 UART1发送字节和ASCI ...

  3. MM32F0020 UART1中断接收和UART1中断发送

    目录: 1.MM32F0020简介 2.初始化MM32F0020 UART1和NVIC中断 3.编写MM32F0020 UART1使能中断发送函数 4.编写MM32F0020 UART1中断接收和中断 ...

  4. MM32F0020 UART1硬件自动波特率的使用

    目录: 1.MM32F0020简介 2.UART自动波特率校准应用场景 3.MM32F0020 UART自动波特率校准原理简介 4.MM32F0020 UART1 NVIC硬件自动波特率配置以及初始化 ...

  5. MM32F0140 UART1中断接收和UART1中断发送

    目录: 1.MM32F0140简介 2.初始化MM32F0140 UART1和NVIC中断 3.编写MM32F0140 UART1使能中断发送函数 4.编写MM32F0140 UART1中断接收和中断 ...

  6. MM32F0140 UART1 DMA RX and TX 中断接收和发送数据

    目录: 1.MM32F0140简介 2.DMA工作原理简介 3.初始化MM32F0140 UART1 4.配置MM32F0140 UART1 DMA接收 5.配置MM32F0140 UART1 DMA ...

  7. 灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据

    灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据 目录: 1.MM32F0010UART简介 2.MM32F0010UART特性 3.MM32F0010使用 ...

  8. 2-关于单片机通信数据传输(中断接收,大小端,IEEE754浮点型格式,共用体,空闲中断,环形队列)

    上一篇链接 http://www.cnblogs.com/yangfengwu/p/8628219.html 先说明一点这种方式,不光对于单片机类的,,对于上位机接收数据同样适用----不骗人的,自己 ...

  9. Stm32使用串口空闲中断,基于队列来接收不定长、不定时数据

    串口持续地接收不定长.不定时的数据,把每一帧数据缓存下来且灵活地利用内存空间,下面提供一种方式供参考.原理是利用串口空闲中断和DMA,每当对方发来一帧完整的数据后,串口接收开始空闲,触发中断,在中断处 ...

随机推荐

  1. linux sftp

    转载请注明来源:https://www.cnblogs.com/hookjc/ sftp用法 1. 用sftp如何登录服务器 sftp 是一个交互式文件传输程式.它类似于 ftp, 但它进行加密传输, ...

  2. Apache中commons包的各种jar的功能说明

    commons-logging.jar -----记录日志,通常和  log4j.jar共同使用 commons-beanutils.jar(1.1)                主要提供Bean的 ...

  3. LAMP架构—源码编译安装 (爱情受过伤,为爱跳过鸭绿江)

    LAMP架构--源码编译安装 1.LAMP架构概述 2.编译安装Apache httpd 服务 3.编译安装mysql 服务 4.编译安装PHP 解析服务 5.利用LAMP搭建论坛 1.LAMP架构概 ...

  4. PL/SQL批量执行SQL脚本文件

    1.选择File > New > Command Windows(命令窗口) 2.输入 @ 符号,之后敲击回车键.从本地选择执行的 SQL脚本 等待批量命令全部执行成功,关闭页面即可 新增 ...

  5. SQL server 查询当前数据库所有表的行数

    SELECT OBJECT_NAME(ii.id) TableName ,rows FROM sysindexes ii INNER JOIN sysobjects oo ON ( oo.id = i ...

  6. 框架5--nginx安装部署 下(web服务)

    目录 1.提纲 2.Nginx虚拟主机 3.Nginx日志 4.Nginx访问控制模块 5.Nginx状态监控模块 6.访问连接控制模块 框架5--nginx安装部署 下(web服务) 1.提纲 1. ...

  7. 《深度探索C++对象模型》第二章 | 构造函数语意学

    默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一 ...

  8. Spring Boot对Spring Data JPA的支持

    前两篇介绍了Spring Data JPA的基本使用,本篇介绍Spring Boot 对JPA的支持.如下: 1)导入坐标 2)注解配置 其他配置同Spring Data JPA应用之常规CRUD操作 ...

  9. Spring高级特性之四:FactoryBean和BeanFactory

    FactoryBean和BeanFactory两只是两个单词顺序不同但是内容大不相同.落脚点在后面一个单词,前面一个单词是其功能描述:FactoryBean--工厂bean,一个建工厂的bean?Be ...

  10. ESXI系统从0搭建流程

    ESXI系统从0搭建流程 简单介绍 简单介绍:项目中使用到了这个系统,我自己不会搭建,但是请教别人之后自己成功搭建出来了此系统.所以在此记录一下搭建流程,希望能够帮助"零"小白. ...