STM32
直播中

赵敏

8年用户 1157经验值
私信 关注
[问答]

STM32F030C8T6的定时器怎么不准怎么解决?

我用STM32F030C8T6我用定时器延时,SYStiCK想给别的用比如OS,反正留用。

我在初使化的时候我已经把APB时钟2分频别的地方要用。

  • if (HSEStatus == (uint32_t)0x01)
  •   {
  •     /* Enable Prefetch Buffer and set Flash Latency */
  •     FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

  •     /* HCLK = SYSCLK */
  •     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;

  •     /* PCLK = HCLK */
  •     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV2;  //    //24MHZ

  •     /* PLL configuration = HSE * 6 = 48 MHz */
  •     RCC->CFGR  = (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
  •     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);

  •     /* Enable PLL */
  •     RCC->CR |= RCC_CR_PLLON;

我的延时程序如下:

  • void TIM_Config(void)
  • {
  •   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  •     /* TIM3 clock enable */
  •   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  •   /* Compute the prescaler value */
  •   PrescalerValue = (uint16_t) (SystemCoreClock  / 1000000) - 1;
  •   /* Time base configuration */
  •   TIM_TimeBaseStructure.TIM_Period = 1;  //1 u second
  •   TIM_TimeBaseStructure.TIM_Prescaler = 23;//PrescalerValue;
  •   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  •   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
  •   TIM_TimeBaseInit(TIM3,  TIM_TimeBaseStructure);
  •   TIM_Cmd(TIM3, DISABLE);
  • }

  • void TimeDelay1us(uint16_t Times)
  • {
  •   TIM3->CR1 |= TIM_CR1_CEN;  //启动定时器
  •   while(Times--)
  •   {
  •      while((TIM3->SR   TIM_FLAG_Update) == RESET);
  •          TIM3->SR  = ~TIM_FLAG_Update;
  •   }
  •    TIM3->CR1  = ~TIM_CR1_CEN;  //关闭定时器
  • }

  • void Delay(uint16_t Times1)
  • {
  •         uint16_t dd,count;
  •         for(count=0;count

回帖(2)

宋玉红

2024-4-9 09:27:40
第一个是置1时为2US定时不是1US,第二,用的不是中断而是查询,延时底层函数数值应减很多。
举报

elecfans

2024-4-9 15:04:38
从您提供的代码段来看,您已经将APB时钟设置为2分频,并且启用了Prefetch Buffer和设置了Flash Latency。

如果您遇到定时器不准确的问题,可能有以下几个原因和解决方法:

1. 定时器时钟源设置不正确:确定您已经正确配置了定时器时钟源。在STM32F030C8T6中,定时器的时钟源可以选择为内部时钟(HSI)或外部时钟(HSE)。通过RCC_CFGR寄存器的相应位来设置。

2. 定时器预分频设置不正确:根据您的需求,确认您已经正确地设置了定时器的预分频值。定时器的计数频率将根据预分频值进行分频。

3. 定时器重装载值设置不正确:确定您已经正确设置了定时器的重装载值。重装载值决定了定时器溢出的时间。

4. 中断优先级设置不正确:如果您使用了定时器的中断功能,在配置NVIC时,请确保将定时器中断的优先级正确设置。

5. 系统时钟源频率设置不正确:如果您的系统时钟频率设置不正确,将会导致定时器计数速度不准确。请确认您已经正确设置了系统时钟源频率。

总之,要解决定时器不准确的问题,需要仔细检查您的定时器配置,并根据您的需求进行调整。另外,如果您遇到了特定的问题,请提供更多的代码和描述,以便我们更好地帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分