完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本篇文章是我前段时间发布在其他不公开平台上的原创文章,今天拿过来和大家分享一下。
这几天在配置串口时出现了一些令人不解的问题,鬼魅般的不行啊!真是令人头疼!因为再一次遇到了这个问题,故想有必要做一个记录。 先说一下配置USART1的过程吧。 ①配置串口1时钟,在APB2上 ②复用功能连上IO引脚 ③ 配置GPIO为复用模式、推挽、50MHz、上拉 ④配置串口波特率为指定波特率、 8位数据长度、1位停止位、无校验、无流控制、串口模式为接收和发送 ⑤使能串口 ⑥配置串口中断包括 中断通道、抢占优先级、响应优先级、通道使能 ⑦配置串口接收中断使能、发送中断使能 至此串口配置完毕。 在主函数中放上串口发送函数(一秒发一次),开始调试,现象如下: 首先将断点放在发送中断和接收中断处理的地方,每隔一秒会进入发送中断中,但是最前两次状态寄存器中的值是正常的,之后会出现其他异常状态,此时将发送中断处理处的断点去除,程序会每隔一秒进入接收中断,因为本人并没有发送数据给这串口,但确实进入的接收中断,故才有了开头时的不解。 由于先前也出现过这样的情况,上一次是在串口5上而这一次在串口1上,上一次花了好几个晚上加班检查到底是那个地方出了问题。 从老项目上的代码进行对比发现似乎都是一样的,百度各种寻找解决办法,并没有发现有哪不对。最后实在没办法,把官方demo例程拿出来研究了,看了一遍又一遍,然后按照例程重新写了一遍。哈,没问题了。 贴出代码: /*! * @brief 串口1 IO初始化 * @param * @return NONE * @note PA9-TXD,PA10-RXD */ void USART_COM1IOInit(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, DISABLE); //!<串口1时钟初始化 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //!<串口1时钟初始化 GPIO_PinAFConfig(GPIOA, 9, GPIO_AF_USART1); //! GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //!<接收和发送均设为复用模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //!<无上拉也无下拉 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStructure); } /*! * @brief 串口1 中断初始化 * @param * @return NONE * @note */ void USART1InterruptInit(uint32 pri) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =pri; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(USART1, USART_IT_TC, ENABLE);//!<使能USART1发送中断 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//!<使能USART1接收中断 } /*! * @brief 将UART1初始化到指定的波特率上 * @param baud_value:波特率 pri:优先级 * @return NONE * @note PC串口 */ void USART1_Init(uint32 baud_value,uint32 pri) { USART_InitTypeDef USART_InitStructure; USART_COM1IOInit(); USART_InitStructure.USART_BaudRate = baud_value; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART1, &USART_InitStructure); //!<串口1初始化 USART_Cmd(USART1, ENABLE); //!<使能串口1 USART1InterruptInit(pri); //!<串口1中断配置 } 以上为本人修改过后可用初始化代码。 经过仔细对比调试过后,最终把问题锁定在了那个IO口上拉下拉的配置上。本来配置为上拉串口异常,改为无上拉也无下拉之后程序正常了。按照常理来说,既然已经配置成复用推挽了,拉上或下拉就无所谓了,看来这个地方又是芯片给留出了一个坑,恰巧让俺跳进去了两次。程序正常之后,将那个配置重新改为上拉,程序还是正常。这个坑隐藏得好深! 都进去过两次了,想仔细了解清楚,便去请教了大神同事,来解惑啦。 之前没有重视这个问题,我本来以为会跟外围电路设计有关。同事否定了我的观点,正常设计的外围电路对芯片的影响基本没有。这个现象估计与芯片内部设计有关,由于官方例程中使用的配置为无上拉也无下拉,故推荐保持该配置。 问题解决了,才能好好睡觉,准备下班。。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1763 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1617 浏览 1 评论
1059 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
723 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1670 浏览 2 评论
1932浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
725浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
564浏览 3评论
591浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
549浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 03:24 , Processed in 0.746328 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号