打印
[STM32]

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

[复制链接]
549|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ddllxxrr|  楼主 | 2021-2-4 09:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ddllxxrr 于 2021-2-6 09:28 编辑

我用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<Times1;count++)
        {
             for(dd=1;dd<1000;dd++)
             TimeDelay1us(1);
        }        
        
}

void delay_us(uint16_t Times2)
{
          uint16_t count;
        for(count=0;count<Times2;count++)
        {
              TimeDelay1us(1);
        }        
}

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

使用特权

评论回复

相关帖子

沙发
ddllxxrr|  楼主 | 2021-2-6 08:11 | 只看该作者
本帖最后由 ddllxxrr 于 2021-2-6 08:55 编辑

计算错误加程序上的事。结贴

使用特权

评论回复
板凳
cainiao518| | 2021-2-6 09:47 | 只看该作者
ddllxxrr 发表于 2021-2-6 08:11
计算错误加程序上的事。结贴

正确的程序是怎么样的呢

使用特权

评论回复
地板
ddllxxrr|  楼主 | 2021-2-6 14:05 | 只看该作者
这就是正确程序,定时是2US,由于没有用中断,延时有伤停补时,最后是350正好是1秒,亲测!!!

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;  //2 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 TimeDelay2us(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<Times1;count++)
        {
             for(dd=0;dd<350;dd++)  //必须延这么多才到1秒
             TimeDelay2us(1);
        }       
       
}

void delay_us(uint16_t Times2)   //2倍
{
          uint16_t count;
        for(count=0;count<Times2;count++)
        {
              TimeDelay2us(1);
        }       
}

void delay_ms(uint16_t Times3)
{
          uint16_t count;
          for(count=0;count<Times3;count++)
          Delay(1);
}

使用特权

评论回复
评论
xyz549040622 2021-2-8 20:13 回复TA
2us能反应过来吗? 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:http://shop34182318.taobao.com/ http://shop562064536.taobao.com

2392

主题

6936

帖子

66

粉丝