你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030C8T6的定时器怎么不准【解决】

[复制链接]
ddllxxrr 提问时间:2021-2-4 09:21 /
我用STM32F030C8T6我用定时器延时,SYSTICK想给别的用比如OS,反正留用。

我在初使化的时候我已经把APB时钟2分频别的地方要用。
  1. if (HSEStatus == (uint32_t)0x01)
  2.   {
  3.     /* Enable Prefetch Buffer and set Flash Latency */
  4.     FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

  5.     /* HCLK = SYSCLK */
  6.     RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
  7.       
  8.     /* PCLK = HCLK */
  9.     RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV2;  //    //24MHZ

  10.     /* PLL configuration = HSE * 6 = 48 MHz */
  11.     RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
  12.     RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);   
  13.             
  14.     /* Enable PLL */
  15.     RCC->CR |= RCC_CR_PLLON;
复制代码



我的延时程序如下:
  1. void TIM_Config(void)
  2. {
  3.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  4.     /* TIM3 clock enable */
  5.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  6.   /* Compute the prescaler value */
  7.   PrescalerValue = (uint16_t) (SystemCoreClock  / 1000000) - 1;
  8.   /* Time base configuration */
  9.   TIM_TimeBaseStructure.TIM_Period = 1;  //1 u second
  10.   TIM_TimeBaseStructure.TIM_Prescaler = 23;//PrescalerValue;
  11.   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  12.   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
  13.   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  14.   TIM_Cmd(TIM3, DISABLE);
  15. }

  16. void TimeDelay1us(uint16_t Times)
  17. {
  18.   TIM3->CR1 |= TIM_CR1_CEN;  //启动定时器
  19.   while(Times--)
  20.   {
  21.      while((TIM3->SR & TIM_FLAG_Update) == RESET);
  22.          TIM3->SR &= ~TIM_FLAG_Update;
  23.   }
  24.    TIM3->CR1 &= ~TIM_CR1_CEN;  //关闭定时器
  25. }

  26. void Delay(uint16_t Times1)
  27. {
  28.         uint16_t dd,count;
  29.         for(count=0;count<Times1;count++)
  30.         {
  31.              for(dd=1;dd<1000;dd++)
  32.              TimeDelay1us(1);
  33.         }        
  34.         
  35. }

  36. void delay_us(uint16_t Times2)
  37. {
  38.           uint16_t count;
  39.         for(count=0;count<Times2;count++)
  40.         {
  41.               TimeDelay1us(1);
  42.         }        
  43. }

  44. void delay_ms(uint16_t Times3)
  45. {
  46.           uint16_t count;
  47.           for(count=0;count<Times3;count++)
  48.           Delay(1);
  49. }
复制代码
我运行了一下,怎么将4秒,而我定时是1秒。而且好像我改变参数时间并不变求解。

收藏 评论4 发布时间:2021-2-4 09:21

举报

4个回答
ddllxxrr 回答时间:2021-2-4 15:23:23
什么意思,怎么贴子突然多了,把我的求助贴压下来了
zhongwn 回答时间:2021-2-4 23:17:35
我前几天刚发了个类似的贴子,发现是自己很弱智的把HSE的晶振频率搞错了,它是8MHz,我在程序里给了默认的25MHz。然后问题就很大
ddllxxrr 回答时间:2021-2-6 09:22:36
zhongwn 发表于 2021-2-4 23:17
我前几天刚发了个类似的贴子,发现是自己很弱智的把HSE的晶振频率搞错了,它是8MHz,我在程序里给了默认的2 ...

谢谢回答
ddllxxrr 回答时间:2021-2-6 09:24:01
原因找到,一个是置1时为2US定时不是1US,第二,我用的不是中断而是查询,延时底层函数数值应减很多。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版