可以在NVIC里面设置串口的优先级,避免bug的出现。
串口打印重定向
在usart.c里面添加
/**
* @brief 串口重定向
*/
#include <stdio.h>
int fputc(int ch, FILE *f)
{
HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
return ch;
}
在使用的地方要引入<stdio.h>
设置接收中断
设置接收缓存变量
在usart.h中声明
写回调函数
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
//中断处理程序
if(huart->Instance == USART2){
HAL_UART_Transmit(&huart2, (uint8_t *)&U2RxBuffer, 1, 0xFFFF);
}
HAL_UART_Receive_IT(&huart2, (uint8_t *)&U2RxBuffer, 1);
}
其中根据huart->Instance == USART2
判断中断源,注意每一次接收完后要开启下一次中断接收。
在main.c里面开启第一次接收中断
一般来说这样就够了,如果需要设置发送中断,接收重定向等等东西,以及多字节中断等,可以参考下面博客自行设置。
https://www.waveshare.net/study/article-644-1.html
本人在使用stm32h743zi的开发板时,配置串口重定向后无法输出,不知道出了什么问题,那么这个时候该怎么办呢?我们可以使用sprintf函数来解决这一问题:
char cha[20] = {0};
sprintf(cha, "hello %.2f\n", 0.123);
HAL_UART_Transmit(&huart1, (uint8_t *)&cha, 11, 0xFFFF);
当然你也可以自己重写printf,不过我看了一下有些麻烦,printf的返回值是transform的字符数,那就要计算字符长度。可以参考下面这个博客关于不定参数的写法:https://www.cnblogs.com/linhaostudy/p/6695422.html