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

STM32F407定时器定时时间问题

[复制链接]
taoshengyijiu-3 提问时间:2015-9-23 16:25 /
使用STM32F407的TIM2定时器,使用内部时钟APB1,不分频(晶振25MHz),AHB也不分频,SYSCLK为25MHz,故APB1的时钟为25MHz,作为CK_INT,
由于禁止从模式,所以CK_PSC=CK_INT,设置PSC预分频器为24999,即分频25000,得到的CK_CNT为1KHz,设置技术CNT及自动重载寄存器为1000,向下递减模式,按理说应该1s产生一次中断,但实际上是2s产生一次中断。很郁闷啊……
  1. #include<stm32f4xx.h>
  2. /*
  3.   定时器中断
  4.   SYSCLK:HSE---25MHz
  5.   PE2:output
  6. */
  7. int flag=0;
  8. /*
  9.   configuration system clock
  10.   SYSCLK---HSE---25MHz
  11.   AHB not divided     APB1 AND APB2 not divided
  12.   AHB:25MHz    APB1:25MHz
  13. */
  14. void config_clock()
  15. {
  16.   RCC->CR |= RCC_CR_HSEON;                                      //HSE oscillator ON
  17.   while((RCC->CR & RCC_CR_HSERDY) != RCC_CR_HSERDY)             //HSE oscillator ready
  18.     ;
  19.   RCC->CFGR &= ~RCC_CFGR_PPRE1;                                 //reset PPRE1(APB1 PRESC)
  20.   RCC->CFGR |= RCC_CFGR_PPRE1_DIV1;                             //HCLK not divided
  21.   RCC->CFGR &= ~RCC_CFGR_SW;                                    //reset SW register
  22.   RCC->CFGR |= RCC_CFGR_SW_0;                                   //select HSE as SYSCLK
  23.   
  24.   RCC->APB1RSTR |= RCC_APB1RSTR_TIM2RST;                        //reset TIM2
  25.   RCC->APB1RSTR &= ~RCC_APB1RSTR_TIM2RST;                       //don't reset TIM2
  26.   RCC->AHB1RSTR |= RCC_AHB1RSTR_GPIOERST;                       //reset GPIOE
  27.   RCC->AHB1RSTR &=~RCC_AHB1RSTR_GPIOERST;                       //don't reset GPIOE
  28.   RCC->AHB1RSTR |= RCC_AHB1RSTR_GPIOCRST;                       //reset GPIOC
  29.   RCC->AHB1RSTR &= ~RCC_AHB1RSTR_GPIOCRST;                      //don't reset GPIOC
  30.   
  31.   RCC->AHB1ENR |= RCC_AHB1ENR_GPIOEEN;                          //enable GPIOE clock
  32.   RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;                           //enable TIM2 clock
  33.   
  34. }

  35. /*
  36.   configuration GPIOs
  37.   PE2 as output
  38. */
  39. void config_GPIOs()
  40. {
  41.   GPIOE->ODR |= GPIO_ODR_ODR_2;                                 //set output data register 1
  42.   GPIOE->MODER |= GPIO_MODER_MODER2_0;                          //set PE2 as output mode
  43. }

  44. /*
  45.   configuration TIM2
  46. */
  47. void config_TIM2()
  48. {
  49.   TIM2->CR1 &= ~TIM_CR1_ARPE;                               //TIM2_ARR register is buffered
  50.   TIM2->CR1 &= ~TIM_CR1_CMS;                               //Edge-aligned mode
  51.   TIM2->CR1 |= TIM_CR1_DIR;                                //counter used as downcounter
  52.   TIM2->CR1 |= TIM_CR1_URS;                                //only counter overflow/underflow-->interrupt/DMA request
  53.   //TIM2->CR1 &= ~TIM_CR1_UDIS;                              //enable update
  54.   
  55.   TIM2->SMCR &= ~TIM_SMCR_SMS;                             //slave mode disabled use internal clock
  56.   
  57.   TIM2->CNT = 500;
  58.   TIM2->PSC = 24999;                                       //Prescaler value(CK_CNT:0.5KHz)
  59.   TIM2->ARR = 500;                                         //auto-reload register
  60.   
  61.   TIM2->EGR |= TIM_EGR_UG;
  62.   
  63.   TIM2->SR &= ~TIM_SR_UIF;
  64.   TIM2->DIER |= TIM_DIER_UIE;                              //Update interrupt enable
  65.   
  66.   TIM2->CR1 |= TIM_CR1_CEN;                               //counter enable
  67. }



  68. void main()
  69. {
  70.   config_clock();
  71.   config_GPIOs();
  72.   NVIC_EnableIRQ(TIM2_IRQn);
  73.   NVIC_SetPriority(TIM2_IRQn,5);
  74.   config_TIM2();
  75.   while(1)
  76.   {
  77.   }
  78. }


  79. void TIM2_IRQHandler()
  80. {
  81.   TIM2->SR &= ~TIM_SR_UIF;                              //clear interrupt flag
  82.   if(flag)
  83.   {
  84.     GPIOE->ODR &= ~GPIO_ODR_ODR_2;
  85.     flag=0;
  86.   }
  87.   else
  88.   {
  89.     GPIOE->ODR |= GPIO_ODR_ODR_2;
  90.     flag=1;
  91.   }
  92. }
复制代码

收藏 评论2 发布时间:2015-9-23 16:25

举报

2个回答
taoshengyijiu-3 回答时间:2015-9-23 16:26:29
TIM2->ARR = 500;
这里改成500就会产生1s的中断,即LED每隔1s亮一下
taoshengyijiu-3 回答时间:2015-9-24 10:29:40
没有人用寄存器写遇到这样的问题吗
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版