×
单片机 > 单片机程序设计 > 详情

STM32CubeMX学习笔记4:printf( )重定向到USART串口输出(参考官方例程)

发布时间:2020-06-01 发布时间:
|

MCU:STM32F103ZET6


IDE:  MDK-ARM V5 +STM32CubeMX5.0.0


串口调试助手:SSCOM3.2



功能描述:USART1收到PC机发来的数据后原封不动的返回给PC机显示,但是C语言中printf函数默认输出设备是显示器,要使用printf输出到串口,需要将fputc里面的输出指向串口,这一过程就叫重定向。


需要配置的只有USART1,配置过程非常简单。


一. 在 Pinout&Configuration---System Core中:

1. 首先设置时钟RCC的HSE(外部高速时钟)为晶振模式:Crystal/ceramic Resonator


2. 设置系统SYS的Debug为Serial Wire:


二. 在 Pinout&Configuration---Connectivity中:

1. 打开USART1,并设置模式为异步收发模式Asynchronous:


2. 设置USART1的参数,通用的“96-N-8-1”模式,即波特率9600,N校验位(无校验),数据位数为8,停止位为1位:


3. 串口通信方式有:查询、中断、DMA三种,因此要使能USART1的中断,在NVIC使能选项中打钩:


三.在 Clock Configuration中:

配置时钟为72 Mhz。



四.在 Project Manager---Project中:

1.设置项目的名称以及保存的位置,选择Toolchain/IDE为MDK-ARM V5,

Tips:最好把Linker Settings中的Minimum Heap Size设置为0x600。



2.在Code Generator选项中如下勾选:


最后点Generate Code生成代码,并选择“Open Project”:


五.代码分析与改写:

将printf()函数的输出功能映射到串口上:


1. 首先在main.c中进行宏定义:

 

/* Private function prototypes -----------------------------------------------*/

#ifdef __GNUC__

  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /* __GNUC__ */

2. 对于MDK-ARM编译器,在main.c中加入重定向函数:(此处与官方例程中不同,将&UartHandle改为&huart1)

/* USER CODE BEGIN 0 */

int fputc(int ch,FILE *f)

{

HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xFFFF);

return ch;

}

/* USER CODE END 0 */

此处附上标准库实现的printf重定向代码供参考:(仅供参考,无需添加)


int fputc(int ch,FILE *p)     //Printf重定向

{

USART_SendData(USART1,(u8)ch);

while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);

return ch;

}

3. 在main.c的while(1)循环中添加输出内容:

/* USER CODE BEGIN 3 */

  printf("zytjasper blog printf function USART1 output rn");

  HAL_Delay(1000);

如果不想一直输出,只输出一次就将输出内容放在循环外:


/* USER CODE BEGIN 2 */

printf("nr zytjasper blog nr");

/* USER CODE END 2 */

至此,编译后无错并下载到开发板中,就完成了通过STM32CubeMX调用HAL库实现printf函数串口通信的效果程序,实验结果如下:



这次只是按照官方例程实现了这个功能,但感觉理解USART还比较吃力,尤其是对中断方式串口通信还不是很清楚,Mark一下,以后学习懂了回头再讨论。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
单片机中高阻态的实质及意义