|
使用STM32G473的时候发现一个奇怪的问题,我的板子使用外部8MHZ晶振,配置为PLL作为系统时钟,时钟频率100MHZ,使用TIM1_CH1捕获GPS模块的秒脉冲,在捕获中断里面开启定时器3计时,同时PA3配置为LPUART1 RX,接收串口数据,发现定时3要配置为1009毫秒才不会溢出,计时一秒的误差达到9毫秒,明显不正常。在调试过程中我发现不接上PA3的串口设备,定时器3定时误差很小只有微妙级,把这个串口设备接到USART2 RX上定时器3的误差也很小。说明和串口设备无关。和PA3引脚配置有关。后来我把PA3引脚配置为开漏输入 一般IO,定时器3的定时误差还是很大。这个STM32G473的芯片BUG吗?请问有哪位大佬碰到过这个问题。 |
stm32g474RE 输出4相波形,如何精准输出ADC触发的问题。
stm32h7 定时器输出比较模式+dma,生成脉冲异常
STM32CubeMX配置STM32F103C8T6 RTC分频器问题
STSPIN32G4 STM32G431VBTx CAN FIFO发送数据帧随机变远程帧
请问 使用MC SDK6.4版本,芯片选的时STM32G431CBUx系列,再配置电流采样时候,选择片内运放,外部增益网络,为啥会报错呀
定时器输出PWM控制电机的问题
求simulink开发STM32的支持包离线版本
stm32u575 gpdma burst length=1 配置其他数值不工作
stm32 can偶现导致其他设备发送数据异常
TIM 单脉冲输出后的电平如何设置?
微信公众号
手机版
问题已解决,程序没有问题,是电路板上一个没使用但是贴上去的电源芯片控制引脚没有控制,默认浮空输入,输出电平不确定,影响了单片机定时器的时钟,至于为什么会影响定时器的时钟,原因不明,目前的解决方案就是拆掉芯片或者把电源芯片使能引脚置低,关闭输出。谢谢厂家的关注与支持。
感觉你目前最大的疑惑就是PA3做串口时或做输入时影响到TIM2的计数了。
所说的那个秒脉冲信号特征大致是怎样的?
它作为TIM3的计数时钟是多少?对你说的定时3要配置为1009毫秒才不会溢出不太理解?
什么叫才不会溢出呢? 芯片的完整料号是多少?
是不是中断优先级的问题导致的

PA3是不是有什么隐藏功能,需要禁止掉,我现在一接上PA3,计时器误差就很大,不接上就是正常的。
[md]我把所有的使能中断和中断执行函数都注释掉了,还是不行,这个BUG好像和程序没关系,在线调试的时候反复复位程序都不行,时间误差一直存在,只有不接PA3,掉电在上电,时间误差才没有。
[md]尝试更换时钟源试一下有没有偏差
使用内部16MHz的晶振也试了,感觉和外部晶振的偏差差不多。这是配置时钟的代码。
void SystemClock_Config(void) { LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG); LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); LL_PWR_DisableUCPDDeadBattery(); NVIC_DisableIRQ(SysTick_IRQn);
if 1
LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); while(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) { } LL_PWR_SetRegulVoltageScaling(LL_PWR_REGU_VOLTAGE_SCALE1); LL_RCC_EnableIT_HSERDY(); LL_RCC_HSE_Enable(); while(LL_RCC_IsActiveFlag_HSERDY() != 1) {
} / Main PLL configuration and activation / LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSE, LL_RCC_PLLM_DIV_2, 50, LL_RCC_PLLR_DIV_2);
else
LL_FLASH_SetLatency(LL_FLASH_LATENCY_4); while(LL_FLASH_GetLatency() != LL_FLASH_LATENCY_4) { } LL_PWR_EnableRange1BoostMode(); LL_RCC_HSI_Enable(); / Wait till HSI is ready / while(LL_RCC_HSI_IsReady() != 1) { }
LL_RCC_HSI_SetCalibTrimming(64); LL_RCC_PLL_ConfigDomain_SYS(LL_RCC_PLLSOURCE_HSI, LL_RCC_PLLM_DIV_4, 50, LL_RCC_PLLR_DIV_2);
endif
LL_RCC_PLL_Enable(); LL_RCC_PLL_EnableDomain_SYS(); while(LL_RCC_PLL_IsReady() != 1) { }
LL_RCC_SetSysClkSource(LL_RCC_SYS_CLKSOURCE_PLL); LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_2); while(LL_RCC_GetSysClkSource() != LL_RCC_SYS_CLKSOURCE_STATUS_PLL) { }
LL_RCC_SetAHBPrescaler(LL_RCC_SYSCLK_DIV_1); LL_RCC_SetAPB1Prescaler(LL_RCC_APB1_DIV_1); LL_RCC_SetAPB2Prescaler(LL_RCC_APB2_DIV_1);
/ Set systick to 1ms in using frequency set to 100MHz / // LL_Init1msTick(100000000);
/ Update CMSIS variable (which can be updated also through SystemCoreClockUpdate function) / LL_SetSystemCoreClock(100000000); }
[md]谢谢反馈~!