HAL库中断方式进行串口通信
文章目录
- HAL库中断方式进行串口通信
- 版本:
- 1. 通过CubeMX配置项目
- 1.1 设置SYS
- 1.2 设置RCC
- 1.3 设置USART
- 1.4 设置NVIC
- 1.5 设置时钟
- 1.6 创建项目
- 2. keil配置代码
- 2.1 **printf函数设置**
- 2.2 设置两个字符型数组和FLAG
- 2.2在main函数中设置接收中断
- 2.2.1 函数原型
- 2.2.2 功能
- 2.2.3 参数
- 2.2.4 在while前添加
- 2.3 main函数里while循环里面添加传输代码
- 2.4 在main函数下面重写中断处理函数
- 3. 编译
- 4.烧录
- 5.运行
- 6.总结
- 7. 参考文章
版本:
软件:
STM32CubeMX:6.6.0
KEIl:5.37.0.0
FlyMcu:0.188
硬件:
STM32F103ZET6
1. 通过CubeMX配置项目
1.1 设置SYS
1.2 设置RCC
1.3 设置USART
1.4 设置NVIC
1.5 设置时钟
1.6 创建项目
2. keil配置代码
2.1 printf函数设置
在main.c
和usart.c
中添加头文件#include "stdio.h"
之后,勾选Target中的use MicroLIB,在mian.c
文件中,添加如下代码,进行重定义
int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff); return ch; }
2.2 设置两个字符型数组和FLAG
在main.c
中设置两个字符型数组,用来存放需要判别的字符串(记得添加头文件#include "string.h"
)。同时设置FLAG
标志变量,来判断电脑向stm32发送了哪一个字符串。
uint8_t aRxBuffer;//接收中断uint8_t Uart1_RxBuff[256]; //接收缓冲uint8_t str1[1] = "g";uint8_t str2[1] = "s";uint8_t go[20] = "go stm32!";uint8_t stop[20] = "stop stm32!";uint8_t Uart1_Rx_Cnt = 0;//接收缓冲计算uint8_t cAlmStr[] = "数据溢出\r\n";unsigned int flag = 1;
2.2在main函数中设置接收中断
2.2.1 函数原型
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
2.2.2 功能
串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据
而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
2.2.3 参数
UART_HandleTypeDef *huart | UATR的别名 |
huart1 *pData | 接收到的数据存放地址 |
Size | 接收的字节数 |
2.2.4 在while前添加
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
2.3 main函数里while循环里面添加传输代码
while (1){if(flag == 1){printf("Hello windows!\r\n");}HAL_Delay(1000);}
2.4 在main函数下面重写中断处理函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){if(strcmp(Uart1_RxBuff, str1) == 0){flag = 1;printf("start....\r\n");}if(strcmp(Uart1_RxBuff, str2) == 0){flag = 0;printf("stop....\r\n");}if (strcmp(Uart1_RxBuff, go) == 0){flag = 1;printf("start....\r\n");}if (strcmp(Uart1_RxBuff, stop) == 0){flag = 0;printf("stop....\r\n");}if(Uart1_Rx_Cnt >= 255)//溢出判断{Uart1_Rx_Cnt = 0;memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff));HAL_UART_Transmit(&huart1, (uint8_t *)&cAlmStr, sizeof(cAlmStr),0xFFFF);}else{Uart1_RxBuff[Uart1_Rx_Cnt++] = aRxBuffer; //接收数据转存if((Uart1_RxBuff[Uart1_Rx_Cnt-1] == 0x0A)&&(Uart1_RxBuff[Uart1_Rx_Cnt-2] == 0x0D)) //判断结束位{Uart1_Rx_Cnt = 0;memset(Uart1_RxBuff,0x00,sizeof(Uart1_RxBuff)); //清空数组}}HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1); //再开启接收中断}
3. 编译
4.烧录
5.运行
6.总结
使用HAL库配置好相关引脚后,在生成的代码里可以很容易的实现中断控制串口通信,但是大量的函数需要自己查找,需要大量练习。
7. 参考文章
STM32利用中断实现LED亮灭和串口通信的收发_xxbiubiu的博客-CSDN博客