STM32中如何使用printf()函数?

发布者:SereneSerenity最新更新时间:2021-07-08 来源: eefocus关键字:STM32  printf()函数  串口通信 手机看文章 扫描二维码
随时随地手机看文章

STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK)


在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。


下面就说一下使用printf需要做哪些配置。


有两种配置方法:


一、对工程属性进行配置,详细步骤如下


1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。


2、在main文件中重定义函数 如下:


// 发送数据


int fputc(int ch, FILE *f)


{


USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USART2 等


while (!(USART1->SR & USART_FLAG_TXE));


return (ch);


}


// 接收数据


int GetKey (void)


{


while (!(USART1->SR & USART_FLAG_RXNE));


return ((int)(USART1->DR & 0x1FF));


}


这样在使用printf时就会调用自定义的fputc函数,来发送字符。


3、在工程属性的 “Target" -> "Code Generation" 选项中勾选 "Use MicroLIB"”


MicroLIB 是缺省C的备份库,关于它可以到网上查找详细资料。


至此完成配置,在工程中可以随意使用printf向串口发送数据了。


二、第二种方法是在工程中添加“Regtarge.c”文件


1、在main文件中包含 “stdio.h” 文件


2、在工程中创建一个文件保存为 Regtarge.c , 然后将其添加工程中


在文件中输入如下内容(直接复制即可)


#include


#include


#pragma import(__use_no_semihosting_swi)


extern int SendChar(int ch); // 声明外部函数,在main文件中定义


extern int GetKey(void);


struct __FILE


{


int handle; // Add whatever you need here


};



FILE __stdout;


FILE __stdin;


int fputc(int ch, FILE *f)


{


return (SendChar(ch));


}


int fgetc(FILE *f)


{


return (SendChar(GetKey()));


}


void _ttywrch(int ch)


{


SendChar (ch);


}


int ferror(FILE *f)


{ // Your implementation of ferror


return EOF;


}


void _sys_exit(int return_code)


{


label: goto label; // endless loop


}


3、在main文件中添加定义以下两个函数


int SendChar (int ch)


{


while (!(USART1->SR & USART_FLAG_TXE)); // USART1 可换成你程序中通信的串口


USART1->DR = (ch & 0x1FF);


return (ch);


}


int GetKey (void)


{


while (!(USART1->SR & USART_FLAG_RXNE));


return ((int)(USART1->DR & 0x1FF));


}


至此完成配置,可以在main文件中随意使用 printf 。

关键字:STM32  printf()函数  串口通信 引用地址:STM32中如何使用printf()函数?

上一篇:煤矿数字通信系统设计
下一篇:STM32使用FSMC总线方式控制LCD的方法

推荐阅读最新更新时间:2024-10-29 11:49

STM32小知识】DMA入门
DMA 全称 Direct Memory Access(直接存储器访问), 是STM32的一个外设,它的特点在于: 在不占用CPU的情况下将数据从存储器直接搬运到外设,或者从外设直接搬运到存储器,当然也可以从存储器直接搬运到存储器。 比如在需要串口发送大量数据的时候,CPU只需要发起DMA传输请求,然后就可以去做别的事情了,DMA会将数据传输到串口发送,DMA传输完之后会触发中断,CPU如果有需要,可以对该中断进行处理,这样一来CPU的效率是不是大大提高了? 在STM32L431RCT6中有 2 个 DMA 外设:DMA1 和 DMA2,每个DMA外设有 7 个通道,每个通道都是独立的,配置DMA的时候有几个关键点:
[单片机]
STM32-跑马灯实验代码分析
工程建立的主要步骤 1.新建3个文件夹:USER、SYSTEM、HARDWARE 2.新建led.c、led.h和test.c 3.在Target目录树上右击Manage Component,新建USER、SYSTEM、HARDWARE,并添加相关C文件(具体见前文MDK使用方法与技巧),跟前面一样HARDWARE组添加led.c文件。 4.在Options for Target ‘Target 1’对话框C/C++选项卡中Include Pathes里添加头文件路径。(这个不可少,否则编译出错,见前文MDK使用方法与技巧,led.h文件不可漏掉) 5.使用SWD方式下载,具体见MDK使用方法与技巧,注意res
[单片机]
STM32中NVIC的个人理解
STM32有43个channel的settable的中断源;AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先 级的4 bits。这4个bits用于分配preemption优先级和sub优先级,在STM32的固件库中定义如下 /* Preemption Priority Group -------------------------------------------------*/ #define NVIC_PriorityGroup_0 ((u32)0x700) /* 0 bits for pre-emption priority
[单片机]
关于STM32开发板晶振相关的问题汇总
1、自己做了个STM32的板子,,但是手里没有8M的晶振,所以就用了,12M的,,但是不正常,上电之后PA15和PA14接的是两个led,PA15接的led常亮,PA14接的的led不亮,,而且芯片下载程序又能下载,应该不是芯片坏的问题吧,,而且不管我些什么程序进去,两个脚的状态都不变,,我怀疑是电路有问题,,可是我仔细检查了电路和板子,都没问题,,JTAG正常使用。我用的是12M的晶振,这会有影响吗?感觉不管下什么程序进去感觉芯片好像没有运行。 答:如果使用12M的晶振,那么要修改启动文档中的关于RCC的语句。 因为如果你使用库文件的话,ST的库,默认外部晶振是8M,所以如果你不修改RCC部分的语句,会造成CPU不启动,
[单片机]
STM32的理解
现谈一点单片机的简单知识及STM32相比于其他单片机的优势。单片机最小系统需要有晶振电路,复位电路,电源供电以及接地,简单来说单片机就是通过芯片来控制外围电路的一个微型控制器。相比较于Arduino,AVR,K60,STM32拥有更丰富的外设,这就意味着它有更强大的功能,完成更多的实验。同时STM32拥有更快的图像采集速度。再来随便讲一些有关单片机的简单知识:晶振——一个用于给整个单片机计时的元器件,同时STM32其他部位上还有一些时钟,用于控制该部分是否工作。一些其他程序:看门狗——用于检测程序的运行是否正常,在自己的程序“跑飞”的时候能够及时将程序复位。中断——在自己的程序运行的时候突然有另一个程序介入,自己的程序中断,运行介
[单片机]
STM32之独立看门狗 学习笔记
一、独立看门狗概述: 独立看门狗其实就是一个独立于主时钟的定时复位狗。一旦开启独立看门狗,它就会根据自己设定的时间不断倒数,倒数到0后就开始复位。 二、关于喂狗: 喂狗就是让狗去吃东西,分心后,这只狗就得重新倒数。 三、stm32看门狗示例程序: #include led.h #include delay.h #include key.h #include sys.h #include usart.h void IWDG_Init(u8 prer,u16 rlr) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使
[单片机]
STM32之中断与事件---一个使用GPIO作为外部中断的示例
1.GPIO的正确设置 GPIO_InitTypeDef GPIO_InitStructure; /* Enable GPIOD clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); /* Configure PD.03, PC.04, as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOD, &GPIO_InitSt
[单片机]
基于Linux 下ARM 和单片机的串口通信设计
0 引言 数据采集系统中由于单片机侧重于控制,数据处理能力较弱,对采集的数据进行运算处理比较繁琐,如果通过串口与上位机通信,利用上位机强大的数据处理能力和友好的控制界面对数据进行处理和显示则可以提高设计效率。串口通信以其简单的硬件连接,成熟的通信协议,成为上下位机之间通信的首选。移植了Linux 操作系统的s3c2440 可以在Linux 环境下操作串口,降低了串口操作的难度,可以使开发者集中精力开发大规模的应用程序,而不必在操作底层设计上耗费时间。 1 硬件连接 s3c2440 是三星公司生产的基于ARM9 核的处理器,采用3.3 V 电压供电; C8051Fxxx 系列单片机是美国CYGNAL 公司推出的与8051 兼容
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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