本来是因为很久不用就容易忘记,想转载大佬的文当笔记,发现自己不会转载操作。。。尴尬,所以就自己写一下吧
好吧,,,最后还是借鉴了佬的,然后自己改了一下printf的重定向
STM32的串口简介
在STM32中,串口分USART和UART两种,USART与UART其中最简单的区别是USART有两种通信模式(异步和同步),而UART通信只有异步模式。
简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。USART 在 STM32 应用最多莫过于“打印”程序信息,一般在硬件设计时都会预留一USART 通信接口连接电脑,用于在调试程序是可以把一些调试信息“打印”在电脑端的串口调试助手工具上,从而了解程序运行是否正确、如果出错哪具体哪里出错等等。
在STM32中一共有五个串口,如下:
本次使用到的函数:阻塞模式下的发送函数(HAL_UART_Transmit())中断模式下的接收函数(HAL_UART_Receive_IT())
软件实现
开RCC时钟,系统时钟,烧录下载,串口,中断
(1)使用阻塞模式,发送数据
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t Data[] = "HELLO WORLD !\n";
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
//参数1:使用的串口,2:要发送的数据,3:数据大小,4:发送的超时时间
HAL_UART_Transmit(&huart1,Data,sizeof(Data),1000);
/* USER CODE END 2 */
}
编译下载程序可在串口助手中看到:
在使用串口发送数据时,常用 printf() 语句进行发送。而在STM32中使用printf() 语句需要进行printf() 语句的重定向。代码如下:
在 usart.h 文件中添加
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */
在 usart.c 文件中添加:
/* USER CODE BEGIN 0 */
//通过这段代码,可以实现通过printf函数输出的内容被重定向到USART串口
//从而可以通过串口将printf输出的内容发送到外部设备或者调试工具上
#include <stdio.h>
#ifdef __GNUC__
#define PUTCHAR_PROTOTYPE int _io_putchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__*/
/******************************************************************
*@brief Retargets the C library printf function to the USART.
*@param None
*@retval None
******************************************************************/
PUTCHAR_PROTOTYPE
{
HAL_UART_Transmit(&huart1, (uint8_t *)&ch,1,0xFFFF);
return ch;
}
/* USER CODE END 0 */
做完以上步骤后即可实现 printf() 语句的重定向
/* USER CODE BEGIN 2 */
//参数1:使用的串口,2:要发送的数据,3:数据大小,4:发送的超时时间
HAL_UART_Transmit(&huart1,Data,sizeof(Data),1000);
printf("HELLO STM32 !\n");
/* USER CODE END 2 */
(2)使用中断模式,接收数据
1.在main函数中添加:
/* USER CODE BEGIN 2 */
//参数说明, 1:使用的串口,2:接收数据的缓存区,3:接收数据的字节数
HAL_UART_Receive_IT(&huart1,Rx_Data,3);
2. 调用中断回调函数,将接收到的数据发送出去
uint8_t Rx_Data[3];
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_UART_Transmit(&huart1,Rx_Data,sizeof(Rx_Data),100);
HAL_UART_Receive_IT(&huart1,Rx_Data,3); //接收结束后需要重新调用该函数,不然只能接收一次
}
}
HAL_UART_Receive_IT(&huart1,Rx_Data,3); //接收结束后需要重新调用该函数,不然只能接收一次这里强调一下!回调函数尾巴这里一定要再写一次接收函数!!!是为了下次的接收启动串口中断接收
实验现象如下:
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/cairongshou/article/details/127340984