串口通信—串口发送和接收代码讲解

  USART 初始化结构体详解

  标准库函数对每个外设都建立了一个初始化结构体,比如USART_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如USART_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。

  初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如了。初始化结构体定义在stm32f10x_usart.h 文件中,初始化库函数定义在stm32f10x_usart.c 文件中,编程时我们可以结合这两个文件内注释使用。

  

 

  USART_BaudRate:波特率设置。一般设置为2400、9600、19200、115200。标准库函数会根据设定值计算得到USARTDIV 值,从而设置USART_BRR 寄存器值。

  USART_WordLength:数据帧字长,可选8 位或9 位。它设定USART_CR1 寄存器的M 位的值。如果没有使能奇偶校验控制,一般使用8 数据位;如果使能了奇偶校验则一般设置为9 数据位。

  USART_StopBits:停止位设置,可选0.5 个、1 个、1.5 个和2 个停止位,它设定USART_CR2 寄存器的STOP[1:0]位的值,一般我们选择1 个停止位。

  USART_Parity : 奇偶校验控制选择, 可选USART_Parity_No( 无校验) 、USART_Parity_Even( 偶校验) 以及USART_Parity_Odd( 奇校验) , 它设定USART_CR1 寄存器的PCE 位和PS 位的值。

  USART_Mode:USART 模式选择,有USART_Mode_Rx 和USART_Mode_Tx,允许使用逻辑或运算选择两个,它设定USART_CR1 寄存器的RE 位和TE 位。

  USART_HardwareFlowControl:硬件流控制选择,只有在硬件流控制模式才有效,可选有⑴使能RTS、⑵使能CTS、⑶同时使能RTS 和CTS、⑷不使能硬件流。

  当使用同步模式时需要配置SCLK 引脚输出脉冲的属性,标准库使用一个时钟初始化结构体USART_ClockInitTypeDef 来设置,该结构体内容也只有在同步模式才需要设置。

  

 

  USART_Clock:同步模式下SCLK 引脚上时钟输出使能控制,可选禁止时钟输出(USART_Clock_Disable)或开启时钟输出(USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟。它设定USART_CR2 寄存器的CLKEN 位的值。

  USART_CPOL:同步模式下SCLK 引脚上输出时钟极性设置,可设置在空闲时SCLK 引脚为低电平(USART_CPOL_Low)或高电平(USART_CPOL_High)。它设定USART_CR2 寄存器的CPOL 位的值。

  USART_CPHA:同步模式下SCLK 引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕获数据(USART_CPHA_1Edge)或在时钟第二个变化沿捕获数据。它设定USART_CR2 寄存器的CPHA 位的值。USART_CPHA 与USART_CPOL 配合使用可以获得多种模式时钟关系。

  USART_LastBit:选择在发送最后一个数据位的时候时钟脉冲是否在SCLK 引脚输出, 可以是不输出脉冲(USART_LastBit_Disable) 、输出脉冲(USART_LastBit_Enable)。它设定USART_CR2 寄存器的LBCL 位的值。

  USART1 接发通信实验

  USART 只需两根信号线即可完成双向通信,对硬件要求低,使得很多模块都预留USART 接口来实现与其他模块或者控制器进行数据传输,比如GSM模块,WIFI 模块、蓝牙模块等等。在硬件设计时,注意还需要一根“共地线”。

  我们经常使用USART 来实现控制器与电脑之间的数据传输。这使得我们调试程序非常方便,比如我们可以把一些变量的值、函数的返回值、寄存器标志位等等通过USART发送到串口调试助手,这样我们可以非常清楚程序的运行状态,当我们正式发布程序时再把这些调试信息去除即可。

  我们不仅仅可以将数据发送到串口调试助手,我们还可以在串口调试助手发送数据给控制器,控制器程序根据接收到的数据进行下一步工作。

  首先,我们来编写一个程序实现开发板与电脑通信,在开发板上电时通过USART 发送一串字符串给电脑,然后开发板进入中断接收等待状态,如果电脑有发送数据过来,开发板就会产生中断,我们在中断服务函数接收数据,并马上把数据返回发送给电脑。

  硬件设计

  为利用USART 实现开发板与电脑通信,需要用到一个USB 转USART 的IC,我们选择CH340G 芯片来实现这个功能,CH340G 是一个USB 总线的转接芯片,实现USB 转USART、USB 转lrDA红外或者USB 转打印机接口,我们使用其USB 转USART 功能。具体电路设计见图 21-9。

  我们将CH340G 的TXD 引脚与USART1 的RX 引脚连接,CH340G 的RXD 引脚与USART1 的TX 引脚连接。CH340G 芯片集成在开发板上,其地线(GND)已与控制器的GND 连通。

  

图 21-9 USB 转串口硬件设计

 

  软件设计

  这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。我们创建了两个文件:bsp_usart.c 和bsp _usart.h 文件用来存放USART 驱动程序及相关宏定义。

  编程要点

  使能RX 和TX 引脚GPIO时钟和USART 时钟;

  初始化GPIO,并将GPIO 复用到USART 上;

  配置USART 参数;

  配置中断控制器并使能USART 接收中断;

  使能USART;

  在USART 接收中断服务函数实现数据接收和发送。

  代码分析

  GPIO 和USART 宏定义

  

 

  使用宏定义方便程序移植和升级 。开发板中的CH340G 的收发引脚默认通过跳帽连接到USART1,如果想使用其他串口,可以把CH340G 跟USART1 直接的连接跳帽拔掉,然后再把其他串口的IO 用杜邦线接到CH340G的收发引脚即可。

  这里我们使用USART1,设定波特率为115200,选定USART 的GPIO为PA9 和PA10。

  

 

  在中断章节已对嵌套向量中断控制器的工作机制做了详细的讲解,这里我们就直接使用,配置USART 作为中断源,因为本实验没有使用其他中断,对优先级什么具体要求。

  

 

  使用GPIO_InitTypeDef 和USART_InitTypeDef 结构体定义一个GPIO 初始化变量以及一个USART 初始化变量,这两个结构体内容我们之前已经有详细讲解。

  调用RCC_APB2PeriphClockCmd 函数开启GPIO 端口时钟,使用GPIO 之前必须开启对应端口的时钟。使用RCC_APB2PeriphClockCmd 函数开启USART 时钟。

  使用GPIO 之前都需要初始化配置它,并且还要添加特殊设置,因为我们使用它作为外设的引脚,一般都有特殊功能。我们在初始化时需要把它的模式设置为复用功能。这里把串口的Tx 引脚配置为复用推挽输出,Rx 引脚为浮空输入,数据完全由外部输入决定。

  接下来,我们配置USART1 通信参数为:波特率115200,字长为8,1 个停止位,没有校验位,不使用硬件流控制,收发一体工作模式,然后调用USART 初始化函数完成配置。

  程序用到USART 接收中断,需要配置NVIC,这里调用NVIC_Configuration 函数完成配置。配置完NVIC 之后调用USART_ITConfig 函数使能USART 接收中断。

  最后调用USART_Cmd 函数使能USART,这个函数最终配置的是USART_CR1 的UE位,具体的作用是开启USART 的工作时钟,没有时钟那USART 这个外设自然就工作不了。

  

 

  Usart_SendByte 函数用来在指定USART 发送一个ASCLL 码值字符,它有两个形参,第一个为USART,第二个为待发送的字符。它是通过调用库函数USART_SendData 来实现的,并且增加了等待发送完成功能。通过使用USART_GetFlagStatus 函数来获取USART事件标志来实现发送完成功能等待,它接收两个参数,一个是USART,一个是事件标志。这里我们循环检测发送数据寄存器为空这个标志,当跳出while 循环时说明发送数据寄存器为空这个事实。

  Usart_SendString 函数用来发送一个字符串,它实际是调用Usart_SendByte 函数发送每个字符,直到遇到空字符才停止发送。最后使用循环检测发送完成的事件标志TC 来实现保证数据发送完成后才退出函数。

  

 

  这段代码是存放在stm32f4xx_it.c 文件中的,该文件用来集中存放外设中断服务函数。当我们使能了中断并且中断发生时就会执行这里的中断服务函数。

  我们在代码清单 21-3 使能了USART 接收中断,当USART 有接收到数据就会执行USART_IRQHandler 函数。USART_GetITStatus 函数与USART_GetFlagStatus 函数类似用来获取标志位状态,但USART_GetITStatus 函数是专门用来获取中断事件标志的,并返回该标志位状态。使用if 语句来判断是否是真的产生USART 数据接收这个中断事件,如果是真的就使用USART 数据读取函数USART_ReceiveData 读取数据到指定存储区。然后再调用USART 数据发送函数USART_SendData 把数据又发送给源设备,即PC 端的串口调试助手。

  

 

  首先我们需要调用USART_Config 函数完成USART 初始化配置,包括GPIO 配置,USART 配置,接收中断使能等等信息。

  接下来就可以调用字符发送函数把数据发送给串口调试助手了。最后主函数什么都不做,只是静静地等待USART 接收中断的产生,并在中断服务函数把数据回传。

  下载验证

  保证开发板相关硬件连接正确,用USB 线连接开发板的USB 转串口跟电脑,在电脑端打开串口调试助手并配置好相关参数:115200 8-N-1,把编译好的程序下载到开发板,此时串口调试助手即可收到开发板发过来的数据。我们在串口调试助手发送区域输入任意字符,点击发送按钮,马上在串口调试助手接收区即可看到相同的字符。

  

视频资料

(stm32 USART串口应用)
http://www.makeru.com.cn/live/1392_1164.html?s=45051

PWM脉宽调制技术
http://www.makeru.com.cn/live/4034_2146.html?s=45051
基于STM32讲解串口操作
http://www.makeru.com.cn/live/1758_490.html?s=45051
通过Z-stack协议栈实现串口透传
http://www.makeru.com.cn/live/1758_330.html?s=45051

(stm32直流电机驱动)
http://www.makeru.com.cn/live/1392_1218.html?s=45051

posted @ 2019-12-30 11:28  国产零零柒  阅读(1396)  评论(0编辑  收藏