TA的每日心情 | 开心 2018-9-18 06:28 |
---|
签到天数: 2 天 连续签到: 1 天 [LV.1]初来乍到
|
在“玩转”了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 |
|