zoukankan      html  css  js  c++  java
  • (stm32f103学习总结)—printf重定向

    一、printf重定向简介

      我们知道C语言中printf函数默认输出设备是显示器,如果要实现在 串口或者LCD上显示,必须重定义标准库函数里调用的与输出设备相关的函数。比如使用printf输出到串口,需要将fputc里面的输出指向串口, 这一过程就叫重定向。 那么如何让STM32使用printf函数呢?

    int fputc(int ch,FILE *p) //函数默认的,在使用printf函数时自动调用

    {

      USART_SendData(USART1,(u8)ch);

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

      return ch;

    }

    二、printf函数格式

    printf("<格式化字符串>", <参量表>);

    //.h文件
    1
    #ifndef __usart_H 2 #define __usart_H 3 4 #include "system.h" 5 #include "stdio.h" 6 7 void USART1_Init(u32 bound); 8 9 10 #endif
    
    
    //.c文件
     1 #include "usart.h"         
     2 
     3 int fputc(int ch,FILE *p)  //函数默认的,在使用printf函数时自动调用
     4 {
     5     USART_SendData(USART1,(u8)ch);    
     6     while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
     7     return ch;
     8 }
     9 
    10 /*******************************************************************************
    11 * 函 数 名         : USART1_Init
    12 * 函数功能           : USART1初始化函数
    13 * 输    入         : bound:波特率
    14 * 输    出         : 无
    15 *******************************************************************************/ 
    16 void USART1_Init(u32 bound)
    17 {
    18    //GPIO端口设置
    19     GPIO_InitTypeDef GPIO_InitStructure;
    20     USART_InitTypeDef USART_InitStructure;
    21     NVIC_InitTypeDef NVIC_InitStructure;
    22     
    23     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    24     RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
    25     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);     //打开时钟
    26  
    27     
    28     /*  配置GPIO的模式和IO口 */
    29     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX               //串口输出PA9
    30     GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    31     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;        //复用推挽输出
    32     GPIO_Init(GPIOA,&GPIO_InitStructure);  /* 初始化串口输入IO */
    33     GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX             //串口输入PA10
    34     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;          //模拟输入
    35     GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
    36     
    37 
    38    //USART1 初始化设置
    39     USART_InitStructure.USART_BaudRate = bound;//波特率设置
    40     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    41     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    42     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    43     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
    44     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
    45     USART_Init(USART1, &USART_InitStructure); //初始化串口1
    46     
    47     USART_Cmd(USART1, ENABLE);  //使能串口1 
    48     
    49     USART_ClearFlag(USART1, USART_FLAG_TC);
    50         
    51     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断
    52 
    53     //Usart1 NVIC 配置
    54     NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
    55     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
    56     NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;        //子优先级3
    57     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    58     NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器、    
    59 }
    60 
    61 /*******************************************************************************
    62 * 函 数 名         : USART1_IRQHandler
    63 * 函数功能           : USART1中断函数
    64 * 输    入         : 无
    65 * 输    出         : 无
    66 *******************************************************************************/ 
    67 void USART1_IRQHandler(void)                    //串口1中断服务程序
    68 {
    69     u8 r;
    70     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
    71     {
    72         r =USART_ReceiveData(USART1);//(USART1->DR);    //读取接收到的数据
    73         USART_SendData(USART1,r);
    74         while(USART_GetFlagStatus(USART1,USART_FLAG_TC) != SET);
    75     } 
    76     USART_ClearFlag(USART1,USART_FLAG_TC);
    77 }     
     // main文件
    1
    #include "system.h" 2 #include "SysTick.h" 3 #include "led.h" 4 #include "usart.h" 5 6 7 /******************************************************************************* 8 * 函 数 名 : main 9 * 函数功能 : 主函数 10 * 输 入 : 无 11 * 输 出 : 无 12 *******************************************************************************/ 13 int main() 14 { 15 u8 i=0; 16 u16 data=1234; 17 float fdata=12.34; 18 char str[]="Hello World!"; 19 SysTick_Init(72); 20 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断优先级分组 分2组 21 LED_Init(); 22 USART1_Init(9600); 23 24 while(1) 25 { 26 i++; 27 if(i%20==0) 28 { 29 led1=!led1; 30 31 printf("输出整型数data=%d ",data); 32 printf("输出浮点型数fdata=%0.2f ",fdata); 33 printf("输出十六进制数data=%X ",data); 34 printf("输出八进制数data=%o ",data); 35 printf("输出字符串str=%s ",str); 36 37 } 38 delay_ms(10); 39 } 40 }
  • 相关阅读:
    Oracle
    Oracle入门
    数据库测试的测试点
    overload重载与override重写的区别
    Java接口的default关键字用法解释
    pytest执行入口
    Gradle的安装与基本配置
    玩转HTML5+跨平台开发[5] HTML表单标签
    玩转HTML5+跨平台开发[4] HTML表格标签
    玩转HTML5+跨平台开发[3] HTML列表标签
  • 原文地址:https://www.cnblogs.com/zhj868/p/12661131.html
Copyright © 2011-2022 走看看