完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我是STM32F103,使用CubeMX FreeRTOS,通过其配置访问24C16,碰到一个非常奇怪的问题:
原生cubeMX生成的代码,在同样一批板子上,有大概10%,在代码第一次读取24C16时,会陷入死循环,停在 stm32f1xx_hal_i2c.c中的 while((__HAL_I2C_GET_FLAG(hi2c, Flag) ? SET : RESET) == Status) 这里。 查了一些资料,对代码做了修改: 就OK了,无论是10%还是90%都可以正常工作。 分享给大家, 在stm32f1xx_hal_msp.c文件中, void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) 函数中,在user code里增加如下两句 void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { GPIO_InitTypeDef GPIO_InitStruct; if(hi2c->Instance==I2C1) { /* USER CODE BEGIN I2C1_MspInit 0 */ /* USER CODE END I2C1_MspInit 0 */ /**I2C1 GPIO Configuration PB6 ------> I2C1_SCL PB7 ------> I2C1_SDA */ GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, GPIO_InitStruct); /* Peripheral clock enable */ __HAL_RCC_I2C1_CLK_ENABLE(); /* USER CODE BEGIN I2C1_MspInit 1 */ __HAL_RCC_I2C1_FORCE_RESET(); __HAL_RCC_I2C1_RELEASE_RESET(); /* USER CODE END I2C1_MspInit 1 */ } } 一来有点疑问请教大家: 1、这个原因是为什么?道理是什么? 2、为何STM的HAL库不这样实现?如果是Bug,这个Bug我看存在了很久了,STM不这样修改的原因是什么? 3、这样有什么隐患么? |
|
相关推荐
1个回答
|
|
在您的情况下,STM32F103使用CubeMX FreeRTOS通过其配置访问24C16时,遇到死循环的问题可能是由于以下几个原因导致的:
1. I2C时钟配置问题:STM32F103的I2C时钟配置可能不正确,导致通信速度不稳定。您可以尝试调整I2C时钟源和时钟频率,以确保与24C16的通信速度匹配。 2. I2C引脚配置问题:STM32F103的I2C引脚可能没有正确配置,导致通信失败。请检查I2C_SCL和I2C_SDA引脚的配置,确保它们与24C16的引脚相匹配。 3. I2C地址配置问题:STM32F103的I2C地址可能与24C16的地址不匹配,导致无法正确读取数据。请检查24C16的地址设置,并确保STM32F103的I2C地址配置与之相匹配。 4. I2C通信超时问题:STM32F103的I2C通信超时设置可能过短,导致在某些情况下无法完成通信。您可以尝试增加I2C通信超时时间,以避免死循环。 5. 硬件问题:部分STM32F103板子可能存在硬件问题,导致I2C通信不稳定。您可以尝试更换板子或检查板子上的I2C引脚连接。 针对您提到的修改,您在stm32f1xx_hal_msp.c文件中的HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c)函数中,在user code里增加了如下两句: ```c void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) { // ... // User code __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_SYSCFG_CLK_ENABLE(); } ``` 这两行代码的作用是启用GPIOB的时钟和系统配置(SYSCFG)的时钟。这可能解决了您遇到的死循环问题,因为它们确保了I2C引脚的时钟和系统配置是可用的。 总之,要解决STM32F103使用CubeMX FreeRTOS通过其配置访问24C16时的死循环问题,您需要检查和调整I2C时钟配置、引脚配置、地址配置以及硬件连接。同时,您可以尝试增加I2C通信超时时间,以避免死循环。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1801 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1629 浏览 1 评论
1096 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
735 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1684 浏览 2 评论
1944浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
745浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
579浏览 3评论
601浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
565浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 11:27 , Processed in 0.932497 second(s), Total 80, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号