STM32中printf与scanf的实现问题
(2018-03-13 16:11:16)
标签:
it |
分类: STM32、LPC1768及其他单片机版 |
#include "sys.h"
#include "usart3.h"
#include "stdarg.h"
#include "stdio.h"
#include "string.h"
#include "timer.h"
//串口发送缓存区
__align(8) u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];
//发送缓冲,最大USART3_MAX_SEND_LEN字节
//串口接收缓存区
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];
//接收缓冲,最大USART3_MAX_RECV_LEN个字节.
//通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.
//如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到
//任何数据,则表示此次接收完毕.
//接收到的数据状态
//[15]:0,没有接收到数据;1,接收到了一批数据.
//[14:0]:接收到的数据长度
vu16 USART3_RX_STA=0;
void USART3_IRQHandler(void)
{
}
//初始化IO 串口3
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率
void usart3_init(u32 pclk1,u32 bound)
{
}
//串口3,printf 函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)
{
}
=================================================================
#include "sys.h"
#include "usart.h"
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#pragma import(__use_no_semihosting)
//解决HAL库使用时,某些情况可能报错的bug
int _ttywrch(int ch)
{
}
//标准库需要的支持函数
struct __FILE
{
};
// FILE is typedef’ d in stdio.h.
FILE __stdout;
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int x)
{
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{
}
#endif
//////////////////////////////////////////////////////////////////
#if EN_USART1_RX
//如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
u8 USART_RX_BUF[USART_REC_LEN];
//接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15, 接收完成标志
//bit14, 接收到0x0d
//bit13~0,
接收到的有效字节数目
u16 USART_RX_STA=0; //接收状态标记
void USART1_IRQHandler(void)
{
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
#endif
#if SYSTEM_SUPPORT_OS
//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
#endif
}
#endif
//初始化IO 串口1
//pclk2:PCLK2时钟频率(Mhz)
//bound:波特率
void uart_init(u32 pclk2,u32 bound)
{
#if EN_USART1_RX
//如果使能了接收
#endif
}
=================================================================
STM32中printf与scanf的重定向问题:http://blog.csdn.net/l_yankui/article/details/53452738
关于STM32中 printf 与 scanf 的重定向问题在此我仅对不使用 "USE MircoLIB"
的情况做整理(针对Keil RVMDK开发环境)。
① :首先需要在 usart.h 中包含 “stdio.h” 头文件
② :在 usart.c 中,加入如下代码块,以此避免使用半主机模式,并重定向 printf 和scanf
函数;
#if 1
#pragma import (__use_no_semihosting_swi)
//标准库需要的支持函数,use_no_semihosting_swi以避免使用半主机模式
struct __FILE
{
};
FILE __stdout;
FILE __stdin;
//重定向Printf函数
int fputc(int ch,FILE *f)
{
}
//重定向Scanf函数
int fgetc(FILE *f)
{
}
void _ttywrch(int ch)
{
}
int _ferror(FILE *f) {
}
//定义_sys_exit()以避免使用半主机模式
void _sys_exit(int return_code){
label:goto label;
}
#endif
③ :在 usart.c 中添加SendChar()与GetKey()函数
[plain] view plain copy
int SendChar(int ch)
{
}
int GetKey(void)
{
}
完成以上三步,即可实现printf()函数与scanf()的串口重定向,将标准输入输出流的来源或去向改为串口。
关于第二步所使用的避免使用半主机模式的代码,其实Kei已经为我们写好了一个Retarget.c文件,在Keil/ARM/Startup目录下.
另外本文针对的开发环境为Keil
RVMDK,本人在Emblocks开源开发工具中实验时,本方法是无法实现printf和Scanf的重定向的,以及在开源工具下如何"Use
microLIB"的问题都有待进一步探讨。
前一篇:Linux应用编程注意汇总