历史上的今天
今天是:2024年10月12日(星期六)
2019年10月12日 | STM32F103学习笔记——串口通信
2019-10-12 来源:eefocus
在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的备份库,关于它可以到网上查找详细资料。
二、第二种方法是在工程中添加“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波特率设置
史海拾趣
|
学习MISRA C之一:“安全第一”的C语言编程规范 C语言是开发嵌入式应用的主要工具,然而C语言并非是专门为嵌入式系统设计,相当多的嵌入式系统较一般计算机系统对软件安全性有更苛刻的要求。1998 年,MISRA指出,一些在C看来可以接受,却存在安全隐 ...… 查看全部问答> |
|
摘要:介绍了基于PDIUSBD12芯片的USB设备硬件组成,详细论述了USB枚举的具体过程和 基于PDIUSBD12的MCU固件编程思想,给出了部分单片机C程序代码,分析了制约实际数据传输速 率的原因,并提出了解决方法。… 查看全部问答> |
|
小弟课题实验,512K*8的内存,采用19地址线的SRAM,不想借用P1口,因为还有别的用处```关于页面管理的方法也不是很懂``` 初步采用8255.但是没有什么概念```8155可以么? 在线等待,谢谢 … 查看全部问答> |
|
【求助】为DELL PowerEdge 860添加硬盘,什么样的sata盘都可以吗? 被朋友托了下周去IDC为DELL PowerEdge 860的服务器加块硬盘,但之前我没有去过IDC. RT,想了解一下是不是什么样的sata盘都可以吗,需要单买盘架吗? 另外,去之前要注意些什么事情?… 查看全部问答> |
|
想做一个云台解码器,看到pelco-d的官方文档时,并没有发现有诸如“巡航”等功能的指令。那么这些功能要执行,究竟要接收到什么命令?还是这些指令的“解释权”由产品的厂家实现?望不吝赐教… 查看全部问答> |
|
以下用的是行列翻转法测矩阵键盘,下面只是一个子程序,但是不能实现功能。 我看别人写的程序都是用的行扫描法,理论上来说行列扫描也可以的。 请各位帮个忙查查错,我搞了几天了,实在弄不明白。 void keyscan(){ uchar h,l,temp; &n ...… 查看全部问答> |
|
又到了一年一度的电子设计大赛时刻,可是电源模块实在是最简单,又是最基础最重要的模块。 目的:希望用线性稳压芯片LM337.LM317搭建可调模块,它具有纹波小,效率低特点 问题:搭建的LM317电路接负载时,输入正常,电压幅度不变。搭建的LM337电 ...… 查看全部问答> |




