完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
芯片:STM32F103C8T6环境:STM32CubeMX和STM32CubeIDE库:STM32F1HAL问题:tiM2定时5秒->UART1 printf打印浮点数,偶尔出现数据丢失。(printf打印放在main里面没有这个情况)
例子如 float A=25.6666;float B=24.7777;实际打印出来:第一种情况:A=2.0000;B=0.0000;第二种情况:A=-2.0000; B=-26815615859885194199148049996411692254958731641184786755447122887443528060147093953603748596333806855380063716372972101707507765623893139892867298012168192.000000 偶尔会出现以上情况,除此之外正常打印浮点数。 void MX_TIM2_Init(void) { / USER CODE BEGIN TIM2_Init 0 / / USER CODE END TIM2_Init 0 / TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0}; / USER CODE BEGIN TIM2_Init 1 / / USER CODE END TIM2_Init 1 / htim2.Instance = TIM2; htim2.Init.Prescaler = 6400-1; htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 50000-1; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_Base_Init( htim2) != HAL_OK) { Error_Handler();} sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource( htim2, sClockSourceConfig) != HAL_OK) { Error_Handler();} sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization( htim2, sMasterConfig) != HAL_OK) { Error_Handler();} / USER CODE BEGIN TIM2_Init 2 / / USER CODE END TIM2_Init 2 / } void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM2) { / USER CODE BEGIN TIM2_MspInit 0 / / USER CODE END TIM2_MspInit 0 / / TIM2 clock enable / __HAL_RCC_TIM2_CLK_ENABLE(); / TIM2 interrupt Init / HAL_NVIC_SetPriority(TIM2_IRQn, 11, 0); HAL_NVIC_EnableIRQ(TIM2_IRQn);/ USER CODE BEGIN TIM2_MspInit 1 / / USER CODE END TIM2_MspInit 1 / } } void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle) { if(tim_baseHandle->Instance==TIM2) { / USER CODE BEGIN TIM2_MspDeInit 0 / / USER CODE END TIM2_MspDeInit 0 / / Peripheral clock disable / __HAL_RCC_TIM2_CLK_DISABLE(); / TIM2 interrupt Deinit / HAL_NVIC_DisableIRQ(TIM2_IRQn);/ USER CODE BEGIN TIM2_MspDeInit 1 / / USER CODE END TIM2_MspDeInit 1 / } } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == htim2.Instance) {float A=25.6666;float B=24.7777; if(printSoftwareVersion==1) { printSoftwareVersion=0; printf("Software Version: M01_200mA_V03 rn");} if(printEnabled==1) { printf("T-Set:%.4f rn",A); printf("T-Act:%.4f rn",B); } } } |
|
相关推荐
2个回答
|
|
重定向的时候要有一个while 函数等待发送完成之后再发送另一个字节,都是这样处理的。
|
|
|
|
STM32F1HAL TIM2定时printf打印出现丢数值的原因可能有以下几点:
1. **中断优先级问题**:如果TIM2定时器中断的优先级设置得太低,可能会导致在执行printf函数时被其他更高优先级的中断打断,从而导致数据丢失。 2. **缓冲区溢出**:如果UART1的发送缓冲区满了,而新的数据还在尝试发送,可能会导致数据丢失。可以尝试增加缓冲区的大小或者优化发送逻辑。 3. **浮点数精度问题**:在某些情况下,浮点数的精度可能会导致打印结果与预期不符。可以尝试使用更高精度的浮点数类型,例如double。 4. **printf函数实现问题**:如果使用的printf函数实现有问题,可能会导致数据丢失。可以尝试使用其他库中的printf函数,例如Newlib或者使用HAL库提供的HAL_UART_Transmit()函数实现自定义的printf函数。 5. **定时器配置问题**:检查TIM2定时器的配置是否正确,确保定时器能够正确地触发中断。 为了解决这个问题,可以尝试以下方法: 1. **调整中断优先级**:确保TIM2定时器中断的优先级足够高,以避免被其他中断打断。 2. **优化UART发送逻辑**:确保UART发送缓冲区有足够的空间,或者在发送数据之前检查缓冲区是否已满。 3. **使用更高精度的浮点数**:尝试使用double类型代替float类型,以提高精度。 4. **使用其他库的printf函数**:尝试使用其他库中的printf函数,或者使用HAL库提供的HAL_UART_Transmit()函数实现自定义的printf函数。 5. **检查定时器配置**:确保TIM2定时器的配置正确,能够正确地触发中断。 通过以上方法,应该能够解决STM32F1HAL TIM2定时printf打印出现丢数值的问题。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1609 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1540 浏览 1 评论
970 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
681 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1587 浏览 2 评论
1861浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
643浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
515浏览 3评论
528浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
503浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 14:44 , Processed in 0.838631 second(s), Total 50, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号