最近使用STM32CubeMX加Ubuntu18.0来进行STM32相关程序的开发,在使用串口打印的使用出现了如下问题:
printf函数按照Keil中的方式进行映射后,在软件仍然无法正常使用Printf函数 使用了__io_putchar() 和 int putc()都无法解决问题
我是使用的时makefile项目来通过命令行进行编译的,在网上查了,并且亲自测试后得出结论,在STM32CubeMX生成的makefile项目文件缺少syscalls.c文件,进一步查询发现这个主要是进行系统调用的。结合其中的函数,在使用int __io_putchar(int ch)进行printf重映射的时候还需加入系统调用的相关函数,如图所示:
经过上述的重映射之后printf函数就可以使用了,我这边使用了FreeRTOS操作系统,如图:
串口接收到的数据如下图所示:
希望对需要的小伙伴能有所帮助,有喜欢使用开源开发工具进行STM32开发的小伙伴,可以多交流交流
关键字:Ubuntu STM32程序 printf函数 重映射问题
引用地址:
关于在Ubuntu下开发STM32程序printf函数的重映射问题
推荐阅读最新更新时间:2024-03-16 16:26
STM32程序无法进入main函数的解决方法
很多人在基于STM32单片机项目开发过程中,会遇到STM32程序无法进入main的现象,在这篇文将分享STM32程序无法进入main函数的解决方法,希望对用户有所帮助。 1.printf等函数采用了半主机模式 解决方法:关掉半主机模式,将输入输出端重定向到ARM器件上,重写fputc和fgetc函数。 2.系统滴答systick中断导致无法进入main函数 解决方法有两种: 1)在bootloader程序跳转到app层时就关闭系统滴答中断:SysTick-》CTRL &= ~SysTick_CTRL_ENABLE_Msk; 2)在SystemInit函数关闭系统滴答中断:SysTick-》CTRL &= ~SysTick_CT
[单片机]
基于stm32做的遥控器源程序(按键和摇杆均有)
按键的话非常简单,定义一个函数,然后可以直接在主函数里实现,要确认好自己的蓝牙就可以,波特率也要一致才行。 int main(void) { delay_init(); LED_Init(); Key_Init(); uart_init(9600); while(1) { keys(); } } 摇杆的话,需要用到ADC算法,下面会分享一个ADC搜集数据的程序然后将搜集的数据加以利用就好了。 如下: void chuli(void ) { u16 x; u16 y; x = Get_Adc_Average(ADC_Channel_1 , 10);
[单片机]
如何从keil编译结果看程序占用STM32的flash和SRAM
Program Size: Code=114956 RO-data=20528 RW-data=808 ZI-data=702360 FromELF: creating hex file... ..\OBJ\MALLOC.axf - 0 Error(s), 0 Warning(s). Build Time Elapsed: 00:00:05 从上面的编译信息可以看出,我们的代码占用 FLASH 大小为: 135484字节( 114956 +20528 ),所用的 SRAM 大小为: 703168个字节(808 +702360 )。 这里我们解释一下,编译结果里面的几个数据的意义: Code:表示程序所占用 FLASH 的
[单片机]
STM32程序无法使用printf,产生停留BEAB BKPT 0xAB处问题的解决
在网上搜了下,发现有很多这样的问题,我也遇到了,最后解决了,我在此总结一下: 问题1(与编译软件无关):在程序中加入printf语句实现串口输出,但未写重定向函数fputc,出现编译无任何警号和错误直接下载无法运行,软件仿真可以运行至MAIN函数,硬件仿真在汇编窗口看到停留在“0x0800XXXX BEAB BKPT 0xAB //进入调试模式”处无法继续运行。 解决办法:编写fputc函数如下: 1 int fputc(int ch, FILE *f) 2 { 3 USART_SendData(USART1, (uint8_t) ch); 4 while (USART_GetFl
[单片机]
STM32串口程序(寄存器版)
#include My_Usart.h void Init_Usart(u32 bound) { RCC- APB2ENR |= 1 2; //使能GPIOA时钟 RCC- APB2ENR |= 1 14; //使能USART1时钟 GPIOA- CRH &= 0XFFFFF00F; //PA9 TX 复用推挽输出 GPIOA- CRH |= 0X000004B0;//PA10 RX 浮空输入 USART1- BRR = 0X1D4C; //配置波特率 USART1- CR1 |= 0X200C; //配置控制寄存器 //10000000001100 使能USART1 无奇偶校
[单片机]
STM32单片机解码NEC红外控制器C语言程序
简介:红外遥控器发射码值的协议有很多种,在百度文库里搜“史上最全的红外遥控器编码协议”,可以看到是有43种,但是我们今天是解码NEC红外协议的,几乎所有的开发板带的小遥控器都是这个协议的,我是用的定时器配合外部中断写的解码程序。 #include ir_exti.h //利用外部中断和定时器进行红外解码 //在51上学习的 u8 irtime;//定时器时间累加 u8 irflag;//接收到第一个下降沿的标志 u8 irdate;//接收下降沿次数的累加 u8 irtable ;//装每一次下降沿的时间 //u8 irdateok; u8 irtable2 ;//解码出地址和数据 地址 地址反码
[单片机]
STM8L的printf函数实现
串口通信是单片机学习的一个最基本、最重要的功能之一。串口可以间接的当做调试接口使用,实现单片机与电脑之间的通信。还可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。作为开发者,熟悉串口是必须的。 =========================================== STM8L的USART特性: 我们在使用串口的时候,主要关心:波特率、停止位、奇偶校验位。 再次就是怎样接收、发送数据。常用:阻塞式发送数据、中断方式接收数据。 ========================================== 在单片机的调试过程中经常会要适时地输出变量的值,这时printf函数是一个非
[单片机]
STM32通过两个按键变量控制多种花样灯亮法源程序
我写的一个矩阵按键,只用两个按键就可以实现控制多种led灯流水灯亮法 单片机源程序如下: #include sys.h #include delay.h #include usart.h #include led.h #include key.h int main(void) { u8 s=1; u8 m=1; HAL_Init(); //初始化HAL库 Stm32_Clock_Init(360,25,2,8); //设置时钟,180Mhz delay_init(180); //初始化延时函数 uart_init(115200); /
[单片机]