查看: 2939|回复: 0

STM32 Nucleo初级例程3:串口驱动实现(printf打印字符)

[复制链接]
  • TA的每日心情
    开心
    2018-9-18 06:28
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-12-8 17:17:11 | 显示全部楼层 |阅读模式
    分享到:
    在“玩转”了STM32-NUCLEO-072RB上的LED点灯以后,学习其他模块就变得非常容易了。这篇文章讲一下串口驱动代码的实现。实现串口驱动后,就可以借助串口调试助手来查看MCU发送过来的各种信息,方便对MCU进行高级、复杂的程序开发和调试。这部分内容分为两大部分,先来讲解一下串口基本知识和STM32的串口模块及用到的串口库函数,再来看一下在KEIL-MDK里面的代码实现。
    一、串口及几个常用概念
             串口通信也称异步串行通信,是计算机、仪器仪表必备的一种简单通信接口,可以实现两个仪器或PC机之间近距离(15米)低速(100k)通信,采用三线方式(收,发,地线)的全双工方式进行。 串口通信要考虑几个重要参数:波特率数据位停止位奇偶校验
    波特率:表示每秒钟传送的bit 的个数!常见波特率:2400/9600/115200
    数据位:发送的数据位数,常用7位/9位/8
    停止位:用于表示单个包的最后一位。典型的值为1位/1.5 位/2
    奇偶校验:串口通信中一种简单的数据检错方式,常用:奇校验/偶校验/
    这些是串口基本内容,针对不同的MCU,实现的功能也有所不同,下面看一下具体的STM32F072RB的串口模块功能
    二、STM32F072RBT6串口模块介绍
    STM32F072RBT6具有4路USART 接口,特点如下:
    1、提供硬件的CTS, RTS and RS485 DE 信号
    2、支持多处理器通信、同步通信、单线半双工模式和DMA连续通信
    3、支持多种通信协议
    更深入的特性,如下图:

    串口的结构框图是这样的:

    一般我们用串口时,采用USART1和USART2就足够了,一个和电脑通信,一个和仪器通信。和电脑通信时,要有硬件的232通信通道,现在电脑端都带有232接头。对于电路板卡或者套件或开发平台,有些增加了232通信电路,有些仅有TXD/RXD引脚线排针。针对前者,采用正常的232通信电缆就可以;对于后者,需要采用USB转TTL线的方式。此STM32-NUCLEO-072RB开发平台属于后者,它在ST-LINKV2-1仿真器部分实现了虚拟串口,同时也引出了TXD/RXD引脚,也可以采用其他引脚。它在与电脑通信时,就要通过仿真器或者一个USB转TTL线来连接。下面看一下具体的硬件电路。
    三、STM32-NUCLEO-072RB开发板硬件串口通信通道:
    1、利用ST-LINK/V2-1虚拟串口通信:

    2、利用MCU的引脚+USB转TTL线实现串口通信
    STM32072RB的具有四个串口,引脚可以重映射,使用PA0/PA1 , PA2/PA3, PA9/PA10,PA14/PA15, PB10/PB11, PC4/PC5, PC10/PC11引脚均可以实现串口通信。

    下面看一下STM32的串口库函数内容
    四、STM32 串口库函数介绍
    串口库函数内容定义在:stm32f0xx_usart.c/stm32f0xx_usart.h文件中,    要理解串口结构体:USART_InitTypeDef的内容

    这个结构体定义了串口几个参数内容。下面看一下USART_InitTypeDef的各个成员定义。

    在编程时,只要根据定义进行相应设置就行了。下面是常用的串口库函数:
    串口初始化函数:USART_Init()
    void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
    串口使能:USART_Cmd()
    void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState);
    串口发送函数USART_SendData()
    void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
    串口接收函数:USART_ReceiveData ()
    uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
    打开串口中断USART_ITConfig()
    void USART_ITConfig(USART_TypeDef* USARTx, uint32_t USART_IT, FunctionalState NewState);
    清除标志位USART_ClearFlag()
    void USART_ClearFlag(USART_TypeDef* USARTx, uint32_t USART_FLAG);
    查询串口状态:USART_GetFlagStatus()
    查询接收数据寄存器是否非空
    USART_GetFlagStatus(USART1, USART_FLAG_RXNE)
    查询发送数据寄存器是否已空
    USART_GetFlagStatus(USART1, USART_FLAG_TXE)
    下面是定义的一些串口发送和接收寄存器状态位,这些非常重要

    有了这些库函数和宏定义,看一下具体的串口驱动代码实现
    五、KEIL-MDK工程软件代码实现
    1、Keil-mdk工程模板中加入UART.C文件,在includes.h文件中加入UART.H头文件

    2、 UART.H头文件里面增加端口PA9/PA10的宏定义

    3、串口端口初始化和串口模块初始化Uart_Init()函数的代码实现:


    4、串口发送和接收字符函数及printf()重定向函数代码实现

    实现了printf()函数以后,就可以像TurboC语言那样输出格式化字符或者字符串到电脑上了。
    5、main.c主函数代码实现:

    在主函数里面,配置好初始化代码后,先向PC机发送两个字符串,然后利用查询方式接收PC发送来的非空字符,再将字符回传显示到PC机串口调试助手上。
    实验现象如下:

    代码地址链接
    https://www.eeboard.com/bbs/thread-39696-1-1.html
    摩尔吧视频地址链接
    https://www.moore8.com/courses/306
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 02:42 , Processed in 0.127679 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.