您的位置:首页 > 编程语言

7、STM32 的串口编程(printf 重定向)

2016-11-27 13:48 267 查看
    

       在开发过程中,通常需要进行一些必要的 log 输出,在代码的关键地方输出 log 便于我们 DEBUG,也便于跟踪程序的运行状态, 最根本的方法就是通过串口输出。STM32 的串口资源比较丰富, 使用流程如下 :

l  配置时钟

Ø  初始化系统时钟 SystemInit();

Ø  使能串口映射到的GPIO端口时钟

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,  ENABLE);

Ø  使能串口时钟

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

Ø  使能端口复用时钟

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,   ENABLE);

2  初始化 GPIO 端口

Ø  配置发送端的 GPIO 口为复用推挽式输出模式

Ø  配置接收为浮空输入。

3  如果使用中断方式, 配置中断通道, 优先级、使能中断

4  串口配置

Ø  定义配置结构体 USART_InitTypeDef;

Ø  配置波特率、数据长度、奇偶校验、停止位等。

Ø  调用 USART_Init 函数初始化串口。

Ø  如果使用中断方式、这里还需要开启串口中断 USART_ITConfig, 同时需要配置中断优先级。(与前面的外部

   中断配置方式类似)

Ø  调用 USART_Cmd 函数使能串口

Ø  如果使用中断、调用 USART_ClearFlag 清除发送完成标志位

5  中断服务程序的编写(一般接收使用中断、发送不使用中断)

Ø  首先判断是否为接收中断

   USART_GetITStatus(USART2,USART_IT_RXNE) != RESET

Ø  清除中断
4000
标志

   USART_ClearITPendingBit(USART2,USART_IT_RXNE);

Ø  读取接收到的数据

   USART_ReceiveData(USART2)

6  数据的发送

Ø  调用函数 USART_SendData(USART2, data); 

Ø  等待发送完成

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

printf 和 scanf 的重定向

   通过上述的一系列配置之后,就可以使用串口进行输入输出了。但是这样的方式只能简单的进行输出,因为这里涉及到的是最底层的串口发送数据,不涉及任何的数据格式等转换。因此用起来还是很不方便,Keil 中可以对printf 进行重定向,这样就可以使用 c 标准库中的 printf 和 scanf 函数了。只需要重载一个fputc函数即可调用 printf 函数方便的打印信息了。如果需要使用 scanf
函数, 只需要实现一个 fgetc 函数即可。

int fputc(int ch, FILE *f)

{    

    /* 发送数据*/

    USART_SendData(USART2,(u8)ch);

 

    /*等待发送完毕*/

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

    return ch;

}

int fgetc(FILE *f)
{
    while(!(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == SET));
    

    return (USART_ReceiveData(USART2));
}

   最后需要设置一下, 在 keil 软件中项目的 optionfor target 中的 target 选项页面, 勾选右边CodeGeneration 窗口中的 UseMicro LIB

   


   当然在头文件中需要包含 #include “stdio.h”, 配置完毕之后就可以使用 printf 函数和 scanf 函数进行输出了。

源代码下载 :点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: