你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

物联网之STM32开发三(USART串口)

[复制链接]
STMCU 发布时间:2020-9-27 12:49
STM32-USART串口的应用内容概要:

串行通信的基本概念


串口寄存器介绍


STM32实现串口数据的收发


HAL串口库函数的使用及printf的实现


串行通信的基本概念:

内容概要:

通信的基本概念

USART介绍

串口的电路连接

串口的通信协议

同步通信和异步通信:


通信,最少要有两个对象,一个收,一个发。


同步通信:一般情况下同步通信指的是通信双方根据同步信号进行通信的方式。比如通信双方有一个共同的时钟信号,大家根据时钟信号的变化进行通信。


1_meitu_1.jpg


异步通信:是指数据传输速度匹配依赖于通信双方有自己独立的系统时钟,大家约定好通信的速度。异步通信不需要同步信号,但是并不是说通信的过程不同布。


2_meitu_2.jpg


串行通信和并行通信的区别:


串行通信:指的是同一时刻只能收或发一个bit位信息。因此只用1根信号线即可。

并行通信:指的是同一时刻可以收或发多个bit位的信息,因此需要多根信号线才行。


3_meitu_3.jpg


                         -串行传输:数据按位顺序传输。                                                                  -并行传输:数据各个位同时传输。

                         -优点:占用引脚资源少                                                                                  -优点:速度快

                         -缺点:速度相对较慢                                                                                      -缺点:占用引脚资源多


单工、半双工、全双工:

单工:要么收,要么发,只能做接收设备或者发送设备。比如收音机  

半双工:可以收,可以发,但是不能同时收发, 比如对讲机  

全双工:可以在同一时刻既接收,又发送。 手机


4_meitu_4.jpg


常见通信总结:


5_meitu_5.jpg


USART基本概念:


通用同步异步收发器(USART)灵活地与外部设备进行全双工数据通信,满足外部设备对工业标准NRZ异步串行数据格式的要求。USART通过小数波特率发生器提供了多种波特率。它支持同步单向通信和半双工单线通信;还支持LIN(局域互联网络),智能卡协议与IrDA(红外数据协会)SIR ENDEC规范,以及调制解调操作(CTS/RTS)。而且,它还支持多处理器通信。

USART支持同步模式,因此USART 需要同步始终信号USART_CK(如STM32 单片机),通常情况同步信号很少使用,因此USART和一般单片机UART使用方式是一样的,都使用异步模式。



串口电路连接:

6_meitu_6.jpg


7_meitu_7.jpg



STM32f051串口:STM32F051内置多达两个通用同步 / 异步收发器( USART1 和 USART2 ),通信速度可达 6 Mbit / s


8_meitu_8.jpg



9_meitu_9.jpg



串口通信协议介绍:


10_meitu_10.jpg



波特率:

在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,既每秒传送的二进制位数,其单位为bps(bits per second)。它是衡量串行数据速度快慢的重要指标。


国际上规定一个标准的波特率系列: 110、300、600、1200、1800、2400、4800、9600、115200、14.4Kbps、19.2Kbps、……

例如:115200bps、指每秒传送115200位。通信双方必须设置同样的同学速率才能正常通信

注意:实际的数据没这么多,还包括起始位,结束位,校验位



STM32 USART寄存器介绍

内容概要:

控制寄存器——USART_CR  

状态寄存器——USART_SR  

数据寄存器——USART_DR  

波特率寄存器——USART_BRR

串口寄存器-USART_CR1:

11_meitu_11.jpg



串口寄存器-USART_CR2:


12_meitu_12.jpg


                                                          13_meitu_13.jpg

串口寄存器-USART_BRR:


14_meitu_14.jpg


串口寄存器-USART_ISR:


15_meitu_15.jpg


串口数据的发送和接收:


16_meitu_16.jpg



串口寄存器-USART_TDR:


17_meitu_17.jpg



串口寄存器-USART_RDR:


18_meitu_18.jpg



STM32实现串口数据的收发

内容概要:

串口硬件原理图

CubeMX中串口的配置

串口发送一个字符

串口接收一个字符

串口硬件原理图:


19_meitu_19.jpg



注意:如果无法识别串口,清装好ch340串口驱动



CubeMX中串口的配置:



20_meitu_20.jpg



21_meitu_21.jpg


串口数据的发送和接收:


22_meitu_22.jpg



串口发送一个字符:



  1. void  Uart_Putchar(uint8_t ch)
  2. {
  3.         while(!(USART1->ISR &(1<<7)));   //等待发送寄存器空
  4.         USART1->TDR = ch;       //发送字符
  5. }

  6. void Uart_Putstring(uint8_t  *str)        
  7. {
  8.         while(*str != '\0')
  9.         {
  10.                 Uart_Putchar(*str);               
  11.                 str++;
  12.         }
  13. }
复制代码



串口接收一个字符:



  1. uint8_t Uart_Getchar(void)
  2. {
  3.         while(!(USART1->ISR & (1<<5)));  //等待收到一个字符的数据
  4.         
  5.         return  USART1->RDR;    //返回收到的字符
  6. }
复制代码

HAL串口库函数的使用及printf的实现

HAL库中串口的收发函数:


  1. Stm32f0xx_hal_uart.c  文件中

  2. 串口的发送函数

  3. HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

  4. 串口的接收函数

  5. HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)
复制代码

printf()实现串口重定向:



  1. ​​printf函数调用的是c库中的fputc函数。因此我们如果重新写了fputc函数,就可以改变printf函数的功能,可以向串口打印输出。

  2. int fputc(int ch,FILE *f){        
  3.     while((USART1->ISR&(1<<7)) == 0);        
  4.     USART1->TDR=(uint8_t)ch;
  5.     return ch;
  6. }
复制代码







收藏 1 评论0 发布时间:2020-9-27 12:49

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版