历史上的今天

今天是:2025年08月12日(星期二)

正在发生

2019年08月12日 | STM32-(10):Printf

发布者:Serendipitous55 来源: eefocus关键字:STM32  Printf 手机看文章 扫描二维码
随时随地手机看文章

学C语言的时候我们经常将printf作为打印输出,可以加格式转换符,比如十进制,十六进制,浮点输出,功能十分强大。在硬件进行调试的时候,也希望能输出这样一个结果,能够看到内部的ARM工作在什么状态,或者运行的结果,一般会用到数码管、液晶屏,但是控制起来麻烦,如果也能用到printf,那肯定很方便!

此时我们只需将printf重定向,原来是输出到屏幕,我们只需要重定向输出到串口。 串口只需要一个串口助手就能看到打印。


printf 是 标准的输入输出库 stdio.lib 内实现的, 这个 lib 库赖以支持的基础是一个文件流 FILE,文件流内有很多的底层函数,比如:_sys_exit _sys_open ,其中有一个底层函数是 int fputc(int ch,FILE*f),我们只需要修改 fputc 函数进行重定向就能将打印输出到串口。



//----------------头文件声明--------------------

#include"stm32f10x_lib.h" //包含所有的头文件

#include

//----------------函数声明--------------------

void Delay_MS(u16 dly);

void RCC_Configuration(void);

void GPIO_Configuration(void);

void USART_Configuration(u32 BaudRate);


/*******************************************************************************

* Function Name  : fputc

* Description    : 重定向这个C库(stdio)printf函数  文件流——》串口USART1

* Input          : ch,*f

* Output         : None

* Return         : None

*******************************************************************************/ 

int fputc(int ch,FILE *f)

{

//ch送给USART1

USART_SendData(USART1, ch);

//等待发送完毕

while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET) ;

//返回ch

return(ch);

}


/*******************************************************************************

* Function Name  : main

* Description    : Main program.

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/ 

int main(void)

{

u8 i,data;


RCC_Configuration();

GPIO_Configuration();

USART_Configuration(19600);


data='A';

for(i=0;i<30;i++)

{

USART_SendData(USART1, data);

data++;

while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET) ;

}

printf("ntwww.yxarm.net");

printf("nti value is   %d",i);

printf("nti value is   %o",i);

printf("nti value is   %d,  %d",i+i,i*i);

printf("nt-----------------------------");

}


/*******************************************************************************

* Function Name  : Delay_Ms

* Description    : delay 1 ms.

* Input          : dly (ms)

* Output         : None

* Return         : None

*******************************************************************************/

void Delay_MS(u16 dly)

{

u16 i,j;

for(i=0;i for(j=1000;j>0;j--);

}


/*******************************************************************************

* Function Name  : RCC_Configuration

* Description    : Configures the different system clocks.

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/

void RCC_Configuration(void)

{

//----------使用外部RC晶振-----------

RCC_DeInit(); //初始化为缺省值

RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟 

while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪

//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer

//FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state

RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK

RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 =  HCLK

RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ

RCC_PLLCmd(ENABLE); //Enable PLLCLK


while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock

while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source

//---------打开相应外设时钟--------------------

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能APB2外设的GPIOA的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能APB2外设的GPIOC的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

//GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);  

 

}


/*******************************************************************************

* Function Name  : GPIO_Configuration

* Description    : 初始化GPIO外设

* Input          : None

* Output         : None

* Return         : None

*******************************************************************************/ 

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;


  /* Configure USARTx_Tx as alternate function push-pull */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_Init(GPIOA, &GPIO_InitStructure);


  /* Configure USARTx_Rx as input floating */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOA, &GPIO_InitStructure);


}


void USART_Configuration(u32 BaudRate)

{

USART_InitTypeDef USART_InitStructure; 

USART_InitStructure.USART_BaudRate = BaudRate; 

USART_InitStructure.USART_WordLength = USART_WordLength_8b; 

USART_InitStructure.USART_StopBits = USART_StopBits_1; 

USART_InitStructure.USART_Parity = USART_Parity_No; 

USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 

USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;  

USART_Init(USART1, &USART_InitStructure);

USART_Cmd(USART1, ENABLE);

}


关键字:STM32  Printf 引用地址:STM32-(10):Printf

上一篇:STM32-(09):USART库函数方式编程
下一篇:STM32-(12):STM32硬件开发环境

推荐阅读

由中国电子信息产业发展研究院、中国人工智能产业创新联盟、四川省经济和信息化委员会、四川省科学技术协会、四川省贸促会共同主办的“2018中国人工智能国际合作大会” 在成都世纪城国际会议中心隆重召开。大会期间,《人工智能》杂志、《机器人产业》杂志联手发布了“2018人工智能商业价值TOP100”,著名人工智能独角兽深兰科技依托超强的AI产品开发能力...
据国外媒体报道,欧洲科学家正在研发可自我修复的柔性机器人。由欧盟委员会资助300万欧元的“自我修复的柔性机器人”(Self HEaling soft RObocs,简称SHERO)项目,正努力研制出一种机器人,这种机器人能够感知疼痛或损伤,然后在没有人类干预的情况下迅速自我修复。 该项目由布鲁塞尔自由大学(VUB)和剑桥大学共同牵头,并由机器人研究中心BruboTIcs...
根据官方公布的消息,此前传闻的超大杯版小米10——小米10至尊纪念版手机将于8月11日正式与大家见面。随着发布时间的临近,关于该机的爆料和预热也更加密集。现在有最新消息,近日小米创始人、小米集团董事长兼CEO雷军详细回答了有关该机的5个用户关心的核心问题。  根据雷军发布的问题和解答来看,这些问题分别涉及用户最为关心的命名、备货...
前面我们已经搭建好了三个不同版本的QT编译环境①qt-4.8.5-x11:依赖于x11的qt版本,在PC可以直接"./"运行②qt-4.8.5-x86:依赖与qvfb的qt版本,在PC机上可以使用"qvfb &", 然后“./ -qws”运行③qt-4.8.5-arm:arm上的QT版本,交叉编译后在arm上运行编译大概花了配置两天半的时间,期间还遇见一些问题,好在全部解决了,但是我们总不能每次搭环境都费这么...

史海拾趣

小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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