为什么在stm32f103上运行的程序串口波特率115200,而在stm32f105上运行要设置38400才能接收正常数据。同时一样的延时函数,在stm32f103能准确延时一秒,而在stm32f105却不准确,延时了近3秒。我怀疑这两个芯片时钟配置不一样,有没有大知道这个
4条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
根据您的描述,您可能遇到了与微控制器(MCU)时钟配置相关的问题。STM32F103 和 STM32F105 都是 STMicroelectronics 的 Cortex-M3 系列微控制器,它们具有相似的架构,但是他们的默认系统时钟频率可能是不同的。这可能会导致串口波特率和延时函数表现不一致。
首先,让我们了解一下时钟配置的基本概念。STM32F1系列微控制器通常有多个时钟源,包括内部高速时钟HSI、内部低速时钟LSI、外部晶体振荡器HSE和PLL(锁相环)。系统时钟SYSCLK可以来自这些时钟源之一,或者是经过PLL倍频后的时钟。
对于串口波特率,它是基于系统时钟频率计算出来的。公式通常是:
[ 波特率 = \frac{SYSCLK}{(USART_BAUD_RATE_PRESCALER \times (USART_InitStruct->USART_BaudRate))} ]
其中,USART_BAUD_RATE_PRESCALER通常是PCLK2(APB2总线时钟),它的频率由SYSCLK除以相应的分频系数决定。
关于延时函数,它通常是基于某个定时器或者SysTick中断实现的。延时时间也是依赖于系统时钟频率。
解决这个问题的方法包括:
- 检查时钟配置:
- 查看每个MCU的时钟配置,确保它们都使用相同的时钟源和分频系数。
- 在
SystemInit()
函数中设置正确的时钟源和分频因子。例如,如果你想要在两个设备上都使用8MHz的HSE,并且通过PLL倍频到72MHz,代码可能类似这样:
// 假设HSE为8MHz RCC_OscInitTypeDef RCC_OscInitStruct = { .OscillatorType = RCC_OSCILLATORTYPE_HSE, .HSEState = RCC_HSE_ON, .HSEPredivValue = RCC_HSE_PREDIV_DIV1, .HSICalibrationValue = 6, }; // PLL配置 RCC_PLLInitTypeDef RCC_PLLInitStruct = { .PLLClockRange = RCC_PLLClockRange_3, .PLLMUL = RCC_PLL_MUL9, .PLL.PLLState = RCC_PLL_ON, .PLL.PLLSource = RCC_PLLSOURCE_HSE, }; // 初始化系统时钟 void SystemClock_Config(void) { // ... 其他初始化步骤 ... // 启动HSE HAL_RCC_OscConfig(&RCC_OscInitStruct); // 启动PLL HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5); }
-
调整串口波特率计算:
- 根据实际的系统时钟频率重新计算串口波特率预分频器值。
-
校准延时函数:
- 如果延时函数依赖于定时器或SysTick中断,那么需要根据实际的系统时钟频率重新计算计数器阈值。
为了更具体地帮助您,我需要查看具体的代码片段,特别是与时钟配置、串口配置和延时函数相关的部分。如果您能提供这些信息,我可以为您提供更精确的帮助。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报 编辑记录- 检查时钟配置:
悬赏问题
- ¥15 winFrom界面无法打开
- ¥15 crossover21 ARM64版本安装软件问题
- ¥15 mmo能不能做客户端怪物
- ¥15 osm下载到arcgis出错
- ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
- ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
- ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
- ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
- ¥15 QQ邮箱过期怎么恢复?
- ¥15 登录他人的vue项目显示服务器错误