搜索
查看: 1677|回复: 4

[求助] STM32F030C8T6的定时器怎么不准【解决】

[复制链接]

该用户从未签到

29

主题

461

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-4-2
发表于 2021-2-4 09:21:37 | 显示全部楼层 |阅读模式
我用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秒。而且好像我改变参数时间并不变求解。

回复

使用道具 举报

该用户从未签到

29

主题

461

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-4-2
 楼主| 发表于 2021-2-4 15:23:23 | 显示全部楼层
什么意思,怎么贴子突然多了,把我的求助贴压下来了
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

12

帖子

0

蝴蝶豆

中级会员

最后登录
2021-3-29
发表于 2021-2-4 23:17:35 | 显示全部楼层
我前几天刚发了个类似的贴子,发现是自己很弱智的把HSE的晶振频率搞错了,它是8MHz,我在程序里给了默认的25MHz。然后问题就很大
回复 支持 反对

使用道具 举报

该用户从未签到

29

主题

461

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-4-2
 楼主| 发表于 2021-2-6 09:22:36 | 显示全部楼层
zhongwn 发表于 2021-2-4 23:17
我前几天刚发了个类似的贴子,发现是自己很弱智的把HSE的晶振频率搞错了,它是8MHz,我在程序里给了默认的2 ...

谢谢回答
回复 支持 反对

使用道具 举报

该用户从未签到

29

主题

461

帖子

0

蝴蝶豆

金牌会员

最后登录
2023-4-2
 楼主| 发表于 2021-2-6 09:24:01 | 显示全部楼层
原因找到,一个是置1时为2US定时不是1US,第二,我用的不是中断而是查询,延时底层函数数值应减很多。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-30 01:12 , Processed in 0.168826 second(s), 34 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表