TIPS:作为一只新手,从标准库转到HAL库确实很不习惯,这个程序配置很简单但是代码也是纠结了很久,最终参考了官方的USART_Printf例程,下载见:STM32Cube官方例程学习指南。
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一下,以后学习懂了回头再讨论。
上一篇:STM32HAL库学习技巧1:基于STM32CubeMX printf重定向
下一篇:调用STM32F4 库函数FLASH_ProgramWord() 出错问题
推荐阅读最新更新时间:2024-11-04 09:38