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

串⼝通信—串⼝发送和接收代码讲解
  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 循环时说明发送数据寄存器为空这个事实。aqsh-012
  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 端的串⼝调试助⼿。

本文发布于:2024-09-23 15:30:14,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/3/216708.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:函数   发送   中断
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议