目录
1、CUBEMX勾选全局中断,生成代码
2、在usart.c文件头部定义接收缓冲区以及定义函数
这里避免使用半主机模式很重要,不能少。
/* USER CODE BEGIN 0 */
uint8_t usart1_receive_buffer[UART1_RX_LENGTH] = {0}; // 接收缓冲区
uint8_t rx1_temp_char = 0; // 用于存储接收到的单个字符
struct __FILE
{
int handle;
};
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0x0001);
return ch;
}
/* USER CODE END 0 */
记得在KEIL勾选这个。
3、在usart.h文件添加extern变量声明
/* USER CODE BEGIN Private defines */
#define UART1_RX_LENGTH 1024
extern uint8_t usart1_receive_buffer[UART1_RX_LENGTH]; // 接收缓冲区
extern uint8_t rx1_temp_char; // 用于存储接收到的单个字符
/* USER CODE END Private defines */
4、在main.c主函数里添加接收中断开启
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, &rx1_temp_char, 1);
/* USER CODE END 2 */
5、在main.c末尾定义串口中断回调函数
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
static uint16_t usart1_rx_counter = 0; // 接收计数器
UNUSED(huart); //消除警告
if(usart1_rx_counter < UART1_RX_LENGTH)
{
usart1_receive_buffer[usart1_rx_counter++] = rx1_temp_char; //接收数据转存
if(rx1_temp_char == '\n')
{
//将'\n'(usart1_rx_counter)后面的数据清空; usart1_receive_buffer[0] = NULL表示将整个数组清空
usart1_receive_buffer[usart1_rx_counter] = NULL;
usart1_rx_counter = 0;
//printf("%s",usart1_receive_buffer); //测试语句,不需要可以删除
}
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&rx1_temp_char, 1); //再开启接收中断
}
/* USER CODE END 4 */
6、编译,烧录,测试效果如图,发送什么返回什么
在输入数据时记得多加一个回车。
7、注意&不确定
在初始化串口中断优先级时,不宜把优先级设置得太低,不然一直被freertos系统时钟抢占。但是不能和系统时钟中断冲突,原谅下,freertos没怎么细学。实测F2,F4系列单片机同样配置也是没有问题的。
9、工程源文件
gitee仓库地址:https://gitee.com/SongYang030108/stm32-h750_-cubemx_freertos