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

作者: fengye5340
上传时间为: 2014-12-08 05:17 PM
2014-12-08
阅读:

        在“玩转”了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机串口调试助手上。

实验现象如下:

代码地址链接

http://www.eeboard.com/bbs/thread-39696-1-1.html

摩尔吧视频地址链接

http://www.moore8.com/courses/306

全部评论 ()
条评论
写评论

创建讨论帖子

登录 后参与评论
系统提示