[STM32CubeMX]学习笔记4:printf( )重定向到USART串口输出

发布者:翅膀小鹰最新更新时间:2020-06-09 来源: eefocus关键字:STM32CubeMX  USART  串口输出 手机看文章 扫描二维码
随时随地手机看文章

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一下,以后学习懂了回头再讨论。

关键字:STM32CubeMX  USART  串口输出 引用地址:[STM32CubeMX]学习笔记4:printf( )重定向到USART串口输出

上一篇:STM32HAL库学习技巧1:基于STM32CubeMX printf重定向
下一篇:调用STM32F4 库函数FLASH_ProgramWord() 出错问题

推荐阅读最新更新时间:2024-11-04 09:38

【STM32】HAL库 STM32CubeMX教程四---UART串口通信详解
前言: 今天我们学习STM32CubeMX串口的操作,以及HAL库串口的配置,我们会详细的讲解各个模块的使用和具体功能,并且基于HAL库实现Printf函数功能重定向,UART中断接收,本系列教程将HAL库与STM32CubeMX结合在一起讲解,使您可以更快速的学会各个模块的使用 所用工具: 1、芯片: STM32F407ZET6 2、STM32CubeMx软件 3、IDE: MDK-Keil软件 4、STM32F1xx/STM32F4xxHAL库 5、串口: 使用USART1 PA9,PA10 知识概括: 通过本篇博客您将学到: STM32CubeMX创建串口例程 HAL库UATR函数库
[单片机]
【STM32】HAL库 <font color='red'>STM32CubeMX</font>教程四---UART<font color='red'>串口</font>通信详解
USART串口发送接收数据
1.发送模块程序及仿真图 (程序中发送数据为0x03) (以下是发送模块程序) #include pic.h __CONFIG(HS&UNPROTECT&DUNPROT&PWRTDIS&BORDIS&WDTDIS&LVPDIS&DEBUGEN&WRTEN); #define uchar unsigned char #define uint unsigned int uchar k,d; void usartint(void) { TRISC=0xC0;//RC端口RC6、RC7分别为输出和输入1100 0000 SPBRG= 77;//设置波特率9600,系统时钟12MHZ TXST
[单片机]
STM32中USART 串口简单使用
  使用查询方式的USART:   设置时钟:   RCC_APB2Periph_AFIO 功能复用IO时钟   RCC_APB2Periph_GPIOA GPIOA时钟   RCC_APB2Periph_USART1 USART1时钟   你可以用   //使能串口1,PA,AFIO总线 RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO|RCC_APB2Periph_USART1 ,ENABLE);   或直接   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ALL,ENABLE); //全部APB
[单片机]
STM32CubeMX系列 | 按键输入
按键输入 1. 实验介绍 本实验介绍如何使用STM32F103的IO口作为输入使用。IO口作为输入使用时,是通过读取IDR的内容来读取IO口的状态的。 本实验利用板载的4个按键,来控制板载的两个LED的亮灭和蜂鸣器。其中KEY_UP控制蜂鸣器;K1控制D1,按一次亮再按一次灭;K2控制D2,按一次亮再按一次灭;K3同时控制D1和D2,按一次它们的状态就翻转一次 2. 硬件设计 用到的硬件资源有: 指示灯D1、D2 蜂鸣器BUZ 4个按键:KEY_UP、K1、K2、K3 硬件连接原理图如下,注意K1、K2、K3是低电平有效的,而KEY_UP是高电平有效,并且外部都没有上下拉电阻,所以需要在STM32F1内部设置上下拉; ST
[单片机]
STM32中printf与scanf的重定向问题
关于STM32中 printf 与 scanf 的重定向问题在此我仅对不使用 USE MircoLIB 的情况做整理(针对Keil RVMDK开发环境)。 ① :首先需要在 usart.h 中包含 “stdio.h” 头文件 ② :在 usart.c 中,加入如下代码块,以此避免使用半主机模式,并重定向 printf 和scanf 函数; #if 1 #pragma import (__use_no_semihosting_swi) /*标准库需要的支持函数,use_no_semihosting_swi以避免使用半主机模式*/ struct __FILE { int handle; };
[单片机]
stm32实现printf重定向到LCD显示屏
嘿嘿,学习stm32已经有一段时间了。以前纠结过一个问题,(USART)串口的可变参数问题,查找C语言的书终于还是解决了,自己编写了一个USART_printf()函数,功能模仿C语言的printf,实现可变参数处理。有点小成就感。 我也因此发表了一下C语言可变参数的博文, 同学们有兴趣可以参考一下: http://blog.sina.com.cn/s/blog_6e22f4ce01010uud.html 最近几天在玩LCD显示屏,基本驱动写好了,并写了一个函数支持中文英文混合打印,但是函数功能还是不够强大啊!串口的时候可以使用printf重定向,这么说开printf也可以重定向到LCD? 基于这个问题,本人昨天
[单片机]
STM32之USART串口接收数据处理
//原帖http://bbs.elecfans.com/forum.php?mod=viewthread&tid=445463 //在学习过程中发现几处编译错误,并改正; //主要贴出定义、和中断函数部分; uint8_t usart_rx_buf ; //接收缓冲,最大40个字节 uint8_t usart_rx_temporary ; //数据保存暂存器,最多能够缓存40个字节 uint8_t usartrxbuf_pagebuf=0; //最上面接受缓存的页码(5)缓存 uint8_t usart_rd_len=0; //有用信息的数据长度 uint8_t usart_rd_lentemp=0; //用来记录已
[单片机]
基于STM32CUBEMX驱动TOF模块VL6180与VL6180X(4)----测量环境光
概述 在本章中,我们将介绍如何配置VL6180X传感器以测量环境光,并获取环境光的强度值。VL6180X是一种多功能、高性能的接近和环境光传感器,其环境光测量功能可以用于检测周围环境的亮度水平。 查看VL6180X手册可得知,VL6180X模块是内置了环境光感应(Ambient Light Sensing,ALS)功能的。ALS功能使得VL6180X不仅能够测量物体与传感器之间的距离,还能够检测周围环境的光照强度。 样品申请 https://www.wjx.top/vm/OhcKxJk.aspx# 视频教程 https://www.bilibili.com/video/BV1vM4y1x74M/ video(vid
[单片机]
基于<font color='red'>STM32CUBEMX</font>驱动TOF模块VL6180与VL6180X(4)----测量环境光
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved