完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
1.STM32中与穿行通信相关的寄存器
1.USART_SR 状态寄存器,主要用来放置某些标志位 2.USART_DR 数据寄存器,用于存放数据 3.USART_BRR 波特率寄存器,设置波特率 对于用库函数来编写串行通信相关的代码来说,寄存器并不是我们所重点关注的内容,虽然他很重要。如需更多了解,可以查阅“STM32中文参考手册”等 2.波特率的计算 其中,Fpclkx是给串口的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1); USARTDIV是一个无符号定点数。我们只要得到USARTDIV 的值,就可以得到串口波特率寄存器USART1->BRR的值,反过来,我们得到USART1->BRR的值,也可以推导出USARTDIV:的值。但我们更关心的是如何从USARTDIV的值得到USART_BRR的值,因为一般我们知道的是波特率,和 PCLKx的时钟,要求的就是USART_BRR的值。 下面我们来介绍如何通过USARTDIV得到串口USART_BRR寄存器的值。假设我们的串口1要设置为115200的波特率,而PCLK2的时钟为72M。这样,我们根据上面的公式有: USARTDIV=72000000/(115200*16)=39.0625那么得到: DIV_Fraction=16*0.0625=1=0x01;然后分别把整数和小数送入波特率设置寄存器 这样,我们就得到了USART1->BRR 的值为0x0271。只要设置串口1的BRR寄存器值为0x0271就可以得到115200的波特率。 3.串口操作常用库函数 与之相关的库函数在“stm32f10x_uart.h”文件中有相关的函数声明。 对其中常用的库函数进行注释 void USART_Init();//串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能 void USART_StructInit(); void USART_ClockInit(); void USART_ClockStructInit(); void USART_Cmd();//使能串口 void USART_ITConfig();//使能相关中断 void USART_DMACmd(); void USART_SetAddress(); void USART_WakeUpConfig(); void USART_ReceiverWakeUpCmd(); void USART_LINBreakDetectLengthConfig(); void USART_LINCmd(); void USART_SendData();//发送数据到串口发送寄存器 uint16_t USART_ReceiveData();//接收数据,从DR读取接收到的数据 void USART_SendBreak(); void USART_SetGuardTime(); void USART_SetPrescaler(); void USART_SmartCardCmd(); void USART_SmartCardNACKCmd(); void USART_HalfDuplexCmd(); void USART_OverSampling8Cmd(); void USART_OneBitMethodCmd(); void USART_IrDAConfig(); void USART_IrDACmd(); FlagStatus USART_GetFlagStatus();//获取状态标志位 void USART_ClearFlag();//清除状态标志位 ITStatus USART_GetITStatus();//获取中断状态标志位 void USART_ClearITPendingBit();//清除中断状态标志位 下面着重分析串口初始化函数 void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct); 共有两个形参,第一个是串口标号,共有USART1、USART2、USART3、UART4、UART5这几个参数可供选择。 第二个参数为串口初始化结构体指针,下面来分析结构体中各成员变量 typedef struct { uint32_t USART_BaudRate; //波特率,其计算方法前文已经给出 uint16_t USART_WordLength; //字长 可以是8位或9位 uint16_t USART_StopBits; //停止位 uint16_t USART_Parity; //奇偶校验位 uint16_t USART_Mode; //串口模式 ,发送or接收使能,或者两个都打开 uint16_t USART_HardwareFlowControl; //硬件流,此参数很少使用 } USART_InitTypeDef; 4.(*)串口配置的一般步骤 1.串口时钟使能, GPIO时钟使能:RCC_APB2PeriphClockCmd(); 2.串口复位:USART_Delnit();//这一步不是必须的 3.GPIO端口模式设置:GPIO_lnit();模式设置可以参考STM32中文参考手册 4.串口参数初始化:USART_Init(); 5.使能串口:USART_Cmd(); 6.开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤) 1.NVIC_PriorityGroupConfig();//配置中断优先级分组,建议写在main函数开头,并且只写一次。 2.USART_ITConfig(); 3.NVIC_Init();//在misc.h文件中 typedef struct { uint8_t NVIC_IRQChannel; uint8_t NVIC_IRQChannelPreemptionPriority; uint8_t NVIC_IRQChannelSubPriority; FunctionalState NVIC_IRQChannelCmd; } NVIC_InitTypeDef; 其参数在stm32f10x.h中以IRQn结尾的参数 NVIC_IRQChannelCmd; ENABLE OR DISABLE 接下来两个是用来设置抢占优先级和子优先级,与其参数前面配置的分组有关 NVIC_IRQChannelPreemptionPriority; NVIC_IRQChannelSubPriority; 7.编写中断处理函数: USARTx_IRQHandler(); 在编写中断处理函数时,用ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT);来判断是否是此串口下触发了中断 接着使用USART_ReceiveData()来接收数据。 再把其发送出去 8.串口数据收发: void USART_SendData();//发送数据到串口, DR uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据 9.串口传输状态获取: FlagStatus USART_GetFlagStatus(USART TypeDef* USARTX,uint16_t USART _FLAG) void USART_ClearITPendingBit(USART_TypeDef*USARTX,uint16_t USART_IT); |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1990 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1777 浏览 1 评论
1242 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
823 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1797 浏览 2 评论
2029浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
932浏览 4评论
stm32f4下spi+dma读取数据不对是什么原因导致的?
333浏览 3评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
681浏览 3评论
667浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-3-5 04:55 , Processed in 0.656056 second(s), Total 43, Slave 38 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191