在STM32测试串口的时候经常需要在开发板和上位机之间传输数据,我们可以用c语言中的printf()函数和getchar()函数来简化传输。
以printf()为例:
printf()函数实际上是一个宏,最终调用的是 fputc(int ch,FILE *f)这个函数来执行输出的,所以我们需要修改这个函数,使函数向串口输出,这样当再次引用printf()函数时,printf()就是通过串口向上位机发送数据的一个函数了。
那么如何修改printf()呢?加上了__weak 修饰符的函数,用户可以在用户文件中重新定义一个同名函数,最终编译器编译的时候,会选择用户定义的函数,如果用户没有重新定义这个函数,那么编译器就会执行__weak 声明的函数,并且编译器不会报错。所以我们可以在别的地方定义一个相同名字的函数,而不必也尽量不要修改之前的函数。
修改fputc函数如示:
/* 重定向printf函数 */
int fputc(int ch, FILE *f)
{
USART_SendData( DEBUG_USARTx, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return ch;
}
修改完成后需要勾选Target设置中的Use Micro LIB选项,MicroLib提供了一个有限的stdio子系统,所以还要再头文件中包含#include getchar()函数也是如此:
/* 重定向scanf函数 */
int getc(FILE *f)
{
/* 等待串口输入数据 */
/* 有了这个等待就不需要在中断中进行了 */
while(USART_GetFlagStatus(DEBUG_USARTx , USART_FLAG_RXNE)==RESET);
/* 返回值进行强制类型转换 */
return (int)USART_ReceiveData(DEBUG_USARTx);
}
关键字:STM32 重定向printf 串口
引用地址:
STM32—重定向printf和getchar函数到串口
推荐阅读最新更新时间:2024-11-18 08:15
ST推出低功耗高安全的STM32U5
意法半导体(STMicroelectronics)宣布推出新一代节能微控制器(MCU),即STM32U5系列,该产品专为可穿戴设备,个人医疗设备,家庭自动化和工业传感器等智能应用中对功率/性能比敏感的应用而设计。 新的MCU采用40纳米工艺制造,可在动态工作模式和节能模式下节省功耗。新的STM32U5系列结合了Arm Cortex-M33内核,使用Arm Keil MDK进行最大功率优化的功能以及诸如高级安全性和针对PSA 安全3级和SESIP(针对IoT平台SESIP的安全评估标准)的基于硬件的保护之类的新功能 ,以及图形加速器以增强用户体验。 面向未来的物联网 在物联网(IoT)不断发展的时代,为了使事物连接到网络
[单片机]
STM32 SPI接口的NSS引脚
SPI_NSS 设置 NSS 信号由硬件( NSS 管脚)还是软件控制,这里我们一般通过软件控制 NSS ,而不是硬件自动控制,所以选择 SPI_NSS_Soft 选择了软件NSS之后,引脚NSS就可以用作其它了。
[单片机]
STM32 串口ISP下载方式解读
Flash_Loader_Demonstrator下载工具的安装 1.硬件的连接和设置 串口ISP下载方式(对应开发板BOOT0为1、2引脚,BOOT1为2、3引脚) STM32下载程序的方法,与51单片机差不多,一般有三种方法:MDK编译器附带的烧写、串口ISP烧写、J-FLASH 方式烧写。 当然,不同的下载方式对应STM32启动方式也不同,如下图是STM32三种启动方式: ● 第一种启动方式是最常用的 用户FLASH 启动,STM32的FLASH可以擦出10万次,所以不用担心芯片哪天会被擦爆!!! ● 第二种启动方式是系统存储器启动方式,即我们常说的串口下载方式(ISP),建议使用这种
[单片机]
STM32程序编写基本流程(LED流水灯)
LED流水灯程序初始化流程 //1.定义结构体变量 GPIO_InitTypeDef GPIO_InitStructure; //2.开启GPIOC的外部时钟,不同的外设开启不同的时钟,IO口复用时两个时钟都要开启。stmf10x_rcc.h RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //3.设置要控制的GPIO管脚 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; //4.设置管脚模式,推挽输出 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_
[单片机]
MSP432驱动舵机串口输出角度
MSP432驱动舵机串口输出角度 备注:我用的TI官方launchpad的MSP432P401R开发板 1、舵机需要50Hz基准的PWM,占空比是0.025~0.125.如何产生PWM,当然是定时器了。查看MSP432P401R数据手册,有4个定时器。 2、要算出详细的具体PWM频率,就需要知道系统的时钟,定时器的时钟。MSP432时钟来源比较复杂。具体可以看手册。(上TI官网下载) 5个时钟源,这里我选择HFXTCLK外部高速时钟(48MHz) 3、定时器的时钟来源可以有4种选择 这里我选择SMCLK时钟,定时器和串口都是SMCLK时钟源。 4、定时器具体配置代码 1 、定义PWM结构并初始化 Timer_A_
[单片机]
STM32单片机学习(8) 程序加密
STM32程序加密有两种方式 1、禁止读出Flash存储器内容 2、用ID加密程序 u8 Sys_ID ,i; for(i=0;i 12;i++) { Sys_ID =*(u8*)(0x1FFFF7E8+i); //产品唯一身份标识寄存器(96位) printf( %0.2X ,Sys_ID ); //参考另外两篇文章串口中断通信 串口通信printf重定向 } if(Sys_ID ==0x36 && Sys_ID ==0xFF && Sys_ID ==0xD7 && Sys_ID ==0x05 && Sys_ID ==0x34 && Sys_ID ==0x52 && Sys_ID ==0x32
[单片机]
STM32串口3使用代码
STM32的串口是相当丰富的,功能也很强劲。最多可提供5路串口(MiniSTM32使用的是STM32F103RBT6,具有3个串口),有分数波特率发生器、支持单线光通信和半双工单线通讯、支持LIN、智能卡协议和IrDASIR ENDEC规范(仅串口3支持)、具有DMA等。 串口最基本的设置,就是波特率的设置。STM32的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应IO口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了。 串口能给我们编程调试带来很大帮助,STM32的串口使用起来也很简单,参考官方代码,然后对照STM32手册,就能找到相关寄存器设置,以及设置的先后顺序。
[单片机]
gd32和stm32哪个好?
GD32和STM32是两种常见的微控制器系列,是开发者们常用的开发板核心。尽管它们相似之处很多,但它们也存在着差异,本文将深入探讨GD32和STM32,分享它们的优缺点。 首先,我们从GD32说起。GD32是由国内的同时表示中心研发的一种基于ARM Cortex-M3 CPU的微控制器,该平台具有很高的兼容性、低功耗以及出色的性能。许多GD32产品也广泛用在电子产品、智能家居、工业控制系统和无人机开发等领域。 与此相反,STM32系列是ST公司基于Cortex-M3架构开发的高性能微控制器。STM32系列以其高速运算能力、出色的数据处理性能、广泛的官方支持和易用的硬件软件接口而著名。STM32可轻松完成各种任务,比如音频、显示以及
[单片机]