b站铁头山羊的STM32学习笔记4-USART,数据帧

通信模型以及数据帧

通信模型

通信分单工,半双工,全双工

单工:通信双发角色固定,一方始终是发送方,一方始终是接收方

半双工:通信双方角色不固定,但同一时间固定,比如现在A是发送方,B是接收方,过一段时间A可以作为接收方,B作为发送方,通信双方有一个管道,双方各执一个水龙头,管道空时,可以让A用这个管道向B送水,也可以让B用这个管道给A送水,但不能同时送水

全双工,通信双方可以同时作为发送者和接收者,通信双方有两个管道,1号管道A给B送,2号管道B给A送,

USART的TX端是发送引脚,RX端是接收引脚

数据帧

通信过程中以数据帧为单位进行收发

分为起始位,数据位,停止位,数据位中可以选择最后一位数据作为校验位(属于数据位)

起始位:发送方将线路拉低表示一帧到来(低电平),长度为1

数据位:低电平0,高电平1,总长度是8位或9位

校验位:奇偶校验,可以没有,也可以是数据位最后一位

停止位:发送方将线路拉高表示一帧结束(高电平),长度可以是0.5,1,2

空闲状态:高电平

奇偶校验规则:

之前又有个疑问:数据发过去后,接收方接到的是一堆二进制数,怎么还原为数据帧?高电平是1还是停止位还是空闲状态?低电平是0还是起始位?思考后认为:空闲状态为高电平,因为数据帧之前必有起始位(地点)电平,所以遇到低电平之前的高电平统统不是数据,而是空闲状态

接下来的是我的胡思乱想,本科阶段没有通信原理这种课程,单片机在这里只是提了一下格式,说停止位是为了区分数据帧的,但我想不明白为什么,只好设想一个原因:遇到低电平后表明一个数据帧到来,假如数据位为8位,那么低电平后连续数8个位,数据位就齐了,停止位则是防止数据位最后一位为0,恢复空闲状态需要一定时间,害怕下一次采样时这个低电平还没来得及恢复成高电平而被误认为是新的一帧到来,所以需要拉高,消除这个隐患。问文心一言,说不是这样,但问真实原因,也给不出,又没人可问,暂时记录下疑惑与假象,以后工作了看看能不能有师傅教。

同步通信与异步通信

同步通信:通信双方共用一个时钟,发送方发送一个数据,同步接收(接收方在共用时钟的情况下知道发送方发来数据了)。

异步通信:通信双方不共用一个时钟,发送方发送数据的时间不确定,接收方不知道数据会何时到来。

波特率

波特率:单位时间内发送的码元个数,这里一个码元就是1位,所以看成比特率应该也没问题

波特率9600:一秒发送9600个码元,也就是一秒发送9600个比特,每个比特的发送需要消耗0.104ms

硬件流控

发送方发送数据后,并不知道接收方是否已经接收并保存数据了,如果还没有接收并保存,发送方发送数据过快(比如发送方发送了10个帧,接收方只来得及保存了1个),可能会使旧数据因新数据覆盖而丢失数据,可以让接收方收到数据后返回一个应答表示数据已收到了,发送到收到答复才继续发。

带硬件流控的连线图:

这个是stm32的硬件流控说明和时序图

我对框图的理解:接收方接收数据寄存器为空时,rts为低电平,发送方cts收到低电平,us发送方把数据发给接收方,接收方完全接收这一帧后,把rts置高电平表示暂时无法接收数据,发送方cts收到高电平,于是暂停发送数据,等到接收方将输入数据寄存器的值读走后,接收方rts为低电平,发送方cts收到低电平,便可以进行下一个数据帧的发送

这是我自己的学习笔记,但如果有读者看到我又不对的地方请告诉我,以免更多读者被我误导,谢谢。

USART

框图(铁头山羊版)

铁头山羊的USART框图比参考手册里的要简单很多,参考手册的太复杂了,暂时先用铁头山羊的理解

CR配置寄存器

设置帧格式用的,UE:USART这个外设的总开关,TXE:TX开关,为1则使用,为0则不使用;r=RXE一样;M,STOP,PE,PS是设置数据帧格式的,如图

SR状态寄存器

TXE:发送数据寄存器空则置1

RXNE:接收数据寄存器非空(个人认为是满)则置1

TC:发送完成(发送数据寄存器已空切发送移位寄存器也已空)则置1

后面的是接收数据错误时置1,如图

IER中断使能寄存器

USART产生的所有中断共用一个中断通道

产生中断,有两种可能,一种是状态位置1则产生,一种是状态位和使能位与一下,若都为1才产生,后者多了一个中断屏蔽的作用,USART是后者,TXEIE与TXE与一下,若TXEIE为1(TXE中断使能或者说是"不屏蔽")且TXE为1(发送数据寄存器空)则与门输出为1,和其他线或之后为1,产生中断请求,后面的也类似,分别是接收数据寄存器非空的中断使能位,发送完成的中断使能,奇偶校验中断使能位,最后是出现错误产生中断的使能位,FE,NE,ORE是否产生中断是一体的,EIE为1则都能产生中断,为0则都不能产生中断

因为USART产生的所有中断都是同一个中断源,会进入同一个中断服务函数,所以中断服务函数需要有多个if判断一下中断是由谁产生的,不是if,else而是多个if,因为接收数据时可能会出现多个错误

BRR波特率寄存器

框图里看出:时钟先除以分频器再除以16=波特率,所以波特率寄存器值=时钟除以波特率再除以16即可,得到的值转化为二进制放入BRR,BRR低四位是小数部分,高12位是整数部分

不同USART时钟可能不同

<think>好的,我现在需要帮助用户查找关于STM32外部中断EXTI的教程或笔记,特别是铁头山羊的相关内容。根据用户提供的引用,引用2和3提到了铁头山羊STM32学习笔记,其中引用2是关于中断、NVIC和EXTI的,而引用3是关于GPIO工作模式的。用户的问题主要集中在EXTI中断配置上,所以应该重点参考引用2。 首先,我需要确认用户提到的铁头山羊笔记内容是否涵盖EXTI的配置步骤。根据引用2的标题,确实涉及了中断、NVIC和EXTI,所以这部分内容应该有用。接下来,我需要整理出EXTI配置的关键步骤,包括GPIO初始化、EXTI线路配置、中断优先级设置(NVIC)以及中断服务函数的编写。 用户可能需要的步骤包括: 1. GPIO模式设置:输入模式,如上拉或下拉,根据硬件设计选择。 2. EXTI线路配置:将GPIO引脚连接到EXTI线路,可能需要使用AFIO来重映射。 3. 触发边沿选择:上升沿、下降沿或双边沿触发。 4. NVIC配置:设置中断优先级,启用对应的中断通道。 5. 编写中断服务函数:处理中断事件,清除中断标志位。 另外,用户提供的引用3提到GPIO的内部结构,如施密特触发器和输入/输出寄存器,这些可能影响中断响应的稳定性,所以在配置GPIO时需要注意这些硬件特性。 需要确保步骤中提到的寄存器操作和库函数(如HAL库或标准外设库)的正确性。例如,使用HAL_GPIO_Init函数配置GPIO,以及EXTI_InitTypeDef结构体来设置EXTI参数。同时,中断服务函数的命名需要符合标准,比如EXTI0_IRQHandler对应EXTI线路0的中断。 可能的问题点:用户是否使用特定的开发库(如HAL库或标准库)?不同库的函数名称和配置方法可能不同,但用户提供的引用中没有明确说明,因此可能需要通用步骤,或者指出不同库之间的差异。 最后,生成的相关问题需要围绕EXTI配置的细节、常见问题、应用场景等,帮助用户进一步理解。例如,如何选择触发边沿,如何防止抖动,EXTI与其他中断的优先级处理等。</think>### STM32 EXTI外部中断配置教程 根据铁头山羊STM32学习笔记[^2][^3],STM32的EXTI(外部中断)配置主要涉及GPIO工作模式、中断触发条件及NVIC优先级设置。以下是关键步骤: --- #### **1. GPIO模式配置** - **输入模式选择**:将GPIO设置为**浮空输入(Input floating)**或**上拉/下拉输入**,具体根据硬件电路设计决定。例如,按键通常配置为上拉输入,默认高电平,按下后接地触发低电平[^3]。 - **内部结构影响**:GPIO内部包含施密特触发器,用于信号整形,确保中断触发稳定性。 ```c // 示例:配置PA0为上拉输入(HAL库) GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); ``` --- #### **2. EXTI线路配置** - **映射GPIO到EXTI**:通过AFIO(复用功能IO)将GPIO引脚连接到EXTI线路。例如,PA0对应EXTI0,PB0也对应EXTI0,需通过AFIO选择具体引脚。 - **触发条件设置**:选择**上升沿(Rising Edge)**、**下降沿(Falling Edge)**或双边沿触发。 ```c // 示例:配置PA0为EXTI0,下降沿触发(标准库) EXTI_InitTypeDef EXTI_InitStruct = {0}; EXTI_InitStruct.EXTI_Line = EXTI_Line0; EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling; EXTI_InitStruct.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStruct); ``` --- #### **3. NVIC中断优先级配置** - **启用中断通道**:通过NVIC(嵌套向量中断控制器)设置中断优先级。例如,EXTI0的中断通道为`EXTI0_IRQn`[^2]。 - **优先级分组**:建议使用`HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4)`设置优先级分组。 ```c // 示例:配置EXTI0中断优先级(HAL库) HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); ``` --- #### **4. 编写中断服务函数** - **函数命名规则**:中断服务函数需与向量表定义一致,例如EXTI0的中断函数为`EXTI0_IRQHandler`。 - **清除中断标志**:在函数内必须调用`__HAL_GPIO_EXTI_CLEAR_IT()`或手动清除标志位,避免重复触发。 ```c // 示例:EXTI0中断服务函数 void EXTI0_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) { // 处理中断事件(如计次) __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); } } ``` --- #### **常见问题** 1. **中断未触发**:检查GPIO模式、EXTI线路映射是否正确,NVIC是否启用。 2. **信号抖动**:硬件添加电容滤波,或软件去抖动(如延时检测)。 3. **多引脚共用EXTI线**:同一EXTI线(如EXTI0)只能处理一个引脚的中断,需避免冲突。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值