HAL库中断方式进行串口通信
实验准备:
软件:
STM32CubeMX:6.6.0
KEIl:5.37.0.0
FlyMcu:0.188
硬件:
STM32F103ZET6
一、CubeMX配置项目
1.1 SYS配置
1.2 RCC配置
1.3 USART设置
1.4 NVIC配置
1.5时钟配置
1.6 项目创建
二、Keil编写代码
2.1添加头文件
在main.c和usart.c中添加头文件#include "stdio.h"和#include "string.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 start[20] = "start stm32!";
uint8_t stop[20] = "stop stm32!";
uint8_t Uart1_Rx_Cnt = 0; //??????
uint8_t cAlmStr[] = "????\r\n";
unsigned int flag = 1;
2.3 在main函数中设置中断
2.3.1 函数原型
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
参数:
- UART_HandleTypeDef *huart:UATR的别名
- huart1 *pData:接收到的数据存放地址
- Size:接收的字节数
2.3.2 功能
- 串口中断接收,以中断方式接收指定长度数据。
- 大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。
- 接收到数据时,会触发串口中断。
- 再然后,串口中断函数处理,直到接收到指定长度数据
- 而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)
2.3.4 添加代码
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer, 1);
2.4 main函数中while添加代码
while (1)
{
if(flag == 1){
printf("Hello windows!\r\n");
}
HAL_Delay(1000);
}
2.5 在main函数下面重写中断处理函数
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); //再开启接收中断
}
只要头文件添加了string.h不用理会警告
三、烧录运行
打开串口后在数据发送区发送“stop stm32!”数据接收停止
发送“stat stm32!”数据接受开始
效果如下: