当前位置: 首页 > news >正文

STM32串口工作原理

        STM32的串口是相当丰富的,功能也很强劲。最多可提供5 路串口,有分数波特率发生器、支持单线光通信和半双工单线通讯、支持LIN、智能卡协议和IrDA SIRENDEC 规范(仅串口3支持)、具有DMA等。

        串口最基本的设置,就是波特率的设置。STM32的串口使用起来还是蛮简单的,只要你开启了串口时钟,并设置相应IO口的模式,然后配置一下波特率,数据位长度,奇偶校验位等信息,就可以使用了。下面,我们就简单介绍下这几个与串口基本配置直接相关的寄存器。

1,串口时钟使能。串口作为STM32的一个外设,其时钟由外设始终使能寄存器控制,这里我们使用的串口1是在APB2ENR寄存器的第14位。除了串口1的时钟使能在APB2ENR寄存器,其他串口的时钟使能位都在APB1ENR。

2,串口复位。当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先
执行复位该外设的操作。串口1的复位是通过配置APB2RSTR 寄存器的第14位来实现的。

 3,串口波特率设置。每个串口都有一个自己独立的波特率寄存器USART BRR,通过设置该寄存器达到配置不同波特率的目的。该寄存器的各位描述如下:

 

4.串口控制。STM32 的每个串口都有3个控制寄存器USART CR1~3 ,串口的很多配置 都是通过这 3个寄存器来设置的。

5,数据发送与接收。STM32的发送与接收是通过数据寄存器USART _DR来实现的,这是一个双寄存器,包含了TDR和RDR当向该寄存器写数据的时候,串口就会自动发送,当收到数据的时
候,也是存在该寄存器内。

可以看出,虽然是一个32 位寄存器,但是只用了低9位(DR[8:0]),其他都是保留。 DR[8:0]为串口数据,包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口。RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。

当使能校验位(USART CR1 种PCE 位被置位)进行发送时,写到MSB的值(根据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位该取代。当使能校验位进行接收时,读到的MSB位是接收到的校验位。

6. 串口的状态可以通过状态寄存器 USART SR 读取串口状态。

这里我们关注一下两个位,第5、6 位RXNE 和TC。
RXNE(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取USART DR,通过读USART DR可以将该位清零,也可以向该位写0,直接清除。
TC(发送完成),当该位被职位的时候,表示USARTDR内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1:读USART SR,写USARTDR。2:直接向该位写0。

void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissar
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp;//得到整数部分
fraction=(temp-mantissa)*16://得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENRI=1<<2;//使能PORTA口时钟
RCC->APB2ENRI=1<<14;//使能串口时钟
GPIOA->CRH&=0XFFFFF00F;
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTRI=1<<14;//复位串口1
RCC->APB2RSTR&=~(1<<14)://停止复位
//波特率设置
USART1->BRR=mantissa;//波特率设置
USART1->CR1|=0X200C;//1位停止,无校验位,USART1->CR1|=1<<8;//PE中断使能
USART1->CR11=1<<5;//接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1 IRQChannel,2);//组2,最低优先级
}

初始化串口硬件设备,启用中断:

配置步骤:

(1)打开GPI0和USART1的时钟
(2)设置USART1两个管脚GPI0模式
(3)配置USART1数据格式、波特率等参数
(4)使能USART1接收中断功能
(5)最后使能USART1功能

http://www.lryc.cn/news/398143.html

相关文章:

  • STM32杂交版(HAL库、音乐盒、闹钟、点阵屏、温湿度)
  • 多输入多输出 | Matlab实现Transformer多输入多输出预测
  • Linux文件编程(标准C库)
  • 生产英特尔CPU处理器繁忙的一天
  • MVC拦截器、ThreadLocal来进行登录拦截
  • 小程序问题
  • arm 版的 deb、rpm、AppImage 都有什么区别
  • docker中mysql设置lower_case_table_names配置的坑
  • python日志记录工具:loguru日志库使用
  • python入门基础知识·二
  • 深度学习中的正则化技术 - 噪声鲁棒性篇
  • 如何通过 Java 来完成 zip 文件与 rar 文件的解压缩?
  • C 语言中的联合(Union)的用途是什么?
  • 汽车电子助力转向系统研究
  • 大数据学习之 scala基础(补充)
  • 正向传播和反向传播
  • 前端文件下载的方式
  • 视图库对接系列(GA-T 1400)十六、视图库对接系列(本级)通知(订阅回调)
  • Python | Leetcode Python题解之第230题二叉搜索树中第K小的元素
  • Python酷库之旅-第三方库Pandas(018)
  • 九科bit-Worker RPA 内容学习
  • vscode编译环境配置-golang
  • 【JavaEE】网络编程——UDP
  • JAVA毕业设计147—基于Java+Springboot的手机维修管理系统(源代码+数据库)
  • 力扣第228题“汇总区间”
  • 部署大语言模型并对话
  • WebSocket、socket.io-client
  • Maven 仓库
  • 给后台写了一个优雅的自定义风格的数据日志上报页面
  • 【React Native优质开源项目】