软件:STM32CubeMX,MDK-ARM
硬件:蓝桥杯物联网Lora开发板,板载芯片STM32L071
一、STM32CubeMX配置
1、先在连接(Connectivity)里面将UART2设置为异步通信模式
2、打开UART中断
3、将系统核心(System Core)里GPIO里面的两个USART设置为上拉模式
4、将PC15设置为GPIO_Output,并且命名为LED
二、代码
1、UART中断接收函数:HAL_UART_Receive_IT,这个和STM32CubeMx玩转STM32—简单UART通信 Day3》里面提到的类似。
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
使用中断接收的好处就是他不会一直问(轮询),大大减少了了CPU的负担,提高CPU的工作效率。
如果程序量很多,while(1)里面有很多个Handler()需要处理很多事情,当CPU正在处理某个Handler()里的事件时,串口有数据需要优先处理,这时,使用轮询,就无法保证数据能及时处理了,所以使用中断接收更好。
2、在usart.c里面编写
#include "usart.h"
#include <string.h>
uint8_t uart_rxbuf[1];
char *str1="\nLED已经熄灭!\r\n";
char *str2="\nLED已经点亮!\r\n";
UART_HandleTypeDef huart2;
void MX_USART2_UART_Init(void)
{
huart2.Instance = USART2;
huart2.Init.BaudRate = 115200;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
HAL_UART_Receive_IT(&huart2, uart_rxbuf, 1);
/*这个MX_USART2_UART_Init函数是已经生成好了的
只需要添加上面这一句UART中断接收代码就行*/
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Transmit(&huart2, uart_rxbuf,1, 100); // 把收到的字节原样发送出去
if(uart_rxbuf[0]=='0'){ //比较字符数组里面的第一个字符,判断是否为0
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_SET);//熄灭LED
HAL_UART_Transmit(&huart2,(uint8_t *)str1,strlen(str1),100);
}
else if(uart_rxbuf[0]=='1'){//比较字符数组里面的第一个字符,判断是否为1
HAL_GPIO_WritePin(LED_GPIO_Port,LED_Pin,GPIO_PIN_RESET);//点亮LED
HAL_UART_Transmit(&huart2,(uint8_t *)str2,strlen(str2),100);
}
HAL_UART_Receive_IT(&huart2, uart_rxbuf, 1); // 重新注册一次,要不然下次收不到了
}