历史上的今天
今天是:2025年05月18日(星期日)
2020年05月18日 | STM8学习笔记---串口printf函数的实现
2020-05-18 来源:eefocus
在使用单片机的时候,串口是要经常使用的功能,特别是在调试代码的过程中,经常需要使用串口打印出某些变量值,来判断程序执行流程是否正常。但是单片机默认情况下没有printf函数,如果需要使用printf函数的功能,就需要自己在串口代码中配置。下面总结一下如何在STM8单片机中使用printf函数功能。
首先按照常规方法先初始化串口
void Uart1_IO_Init( void )
{
PD_DDR |= ( 1 << 5 ); //输出模式 TXD
PD_CR1 |= ( 1 << 5 ); //推挽输出
PD_DDR &= ~( 1 << 6 ); //输入模式 RXD
PD_CR1 &= ~( 1 << 6 ); //浮空输入
}
//baudrate 为需要设置的波特率
void Uart1_Init( unsigned int baudrate )
{
unsigned int baud;
baud = 16000000 / baudrate;
Uart1_IO_Init();
UART1_CR1 = 0;
UART1_CR2 = 0;
UART1_CR3 = 0;
UART1_BRR2 = ( unsigned char )( ( baud & 0xf000 ) >> 8 ) | ( ( unsigned char )( baud & 0x000f ) );
UART1_BRR1 = ( ( unsigned char )( ( baud & 0x0ff0 ) >> 4 ) );
UART1_CR2_bit.REN = 1; //接收使能
UART1_CR2_bit.TEN = 1; //发送使能
UART1_CR2_bit.RIEN = 1; //接收中断使能
}
首先设置IO口,然后设置串口相关寄存器。设置好之后串口就可以使用了,但是这时候还不能使用printf函数功能,要使用printf函数,需要重新定向putchar函数。设置代码如下:
#include "stdio.h"
int putchar( int ch )
{
while( !( UART1_SR & 0X80 ) ); //循环发送,直到发送完毕
UART1_DR = ( u8 ) ch;
return ch;
}
将putchar添加到串口文件中,然后将函数里面的寄存器设置为串口1,添加头文件stdio.h,这时候就可以使用printf函数了。
下来再主函数中使用printf打印数据就可以了
void main( void )
{
unsigned int i = 0;
SysClkInit();
__asm( "sim" );
LED_GPIO_Init();
Uart1_Init(9600);
__asm( "rim" );
LED = 0;
while( 1 )
{
LED = !LED;
printf( "%drn", i++ );
delay_ms( 500 );
}
}
0.5s改变一次LED灯的状态,然后打印一个数字。串口打印效果如下:
史海拾趣
|
各位大虾们,我刚上班不久,单片机知识只限于书本的知识,根本没实际经验,现在碰到一个设计一个单片机控制系统的难题,望各位哥哥姐姐们帮偶看下,能不能讲的详细些(最好帮我出个电路原理图),在此先谢过了~ 开关量:69个 38输入31输出 温度模拟量3路 ...… 查看全部问答> |
|
做个家用带有温湿度测试仪的电子表,原理图、PCB在17楼,欢迎讨论 这个应用很简单,取代家用的电子表,除了具有普通电子表具有的显示时间,报警功能外,添加温度和湿度显示,这样可以随时了解室内的温湿度状况。市场挺好。… 查看全部问答> |
|
我在看书看到这样一段话: 对于arm指令集来说,PC指向当前指令的下两条指令的地址,由于ARM指令是字对齐的,PC值的第0位和第一位总为0, 这句话全不懂,谁能解释下呢… 查看全部问答> |
|
应用API: BOOL ReadFile( HANDLE hFile, //端口句柄 LPVOID lpBuffer, //接收缓冲的指针 DWORD nNumberOfBytesToRead, //要读取的字节长度 LPDWORD lpNumberOfBytesRead, //P ...… 查看全部问答> |
|
好不容易把EBOOT整出来了,可是用它通过USB下载NK.BIN时,却出现以下提示信息,然后就没有了,请问有谁遇到过这种情况或者请高手帮我分析一下原因所在。谢谢啦! Ethernet Boot Loader Configuration: 0) IP address: 192.168.0.15 1) Subnet ma ...… 查看全部问答> |
|
WinCE6.0 设备挂载点命名方法是怎么用的?? 如: \\$device\\COM23 , 是怎么在CE6.0注册在使用的? 比如说注册表是怎么写的?, 或者是那里需要怎么操作?才能实现这样设备挂载点命名方法? 跪求高人指点!!… 查看全部问答> |
|
请问mw5一定要用TI的通讯模块吗?如果用wavecom的通讯模块,我该如何对ril进行处理 请问mw5一定要用TI的通讯模块吗?如果用wavecom的通讯模块,我该如何对ril进行处理?哪怕是给个思路也好,谢谢… 查看全部问答> |
|
spartan 6 warning HDLCompiler:89 在spartan 6 中,我调用了一个除法器,结果出现如下warning: HDLCompiler:89 - \"E:\\qiaodong\\FPGA\\test_FPGA\\test_div\\top.vhf\" Line 53: <div_lx16> remains a black-box since it has no binding entity. 如何解决? ...… 查看全部问答> |
|
先前使用的都是51单片机,用它编写小程序实在再方便不过了,但是那次将项目的总程序量增加到5个K我就对文件和软件的格式发傻了,各种不规范,各种无用功,从那时开始我就萌生了关注单片机的软件工程的想法,直到最近接触MSP430单片机,尤其是看到《 ...… 查看全部问答> |




