这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 急救!!!请大侠帮忙看看ARM-M3为什么无法进入定时器中断

共6条 1/1 1 跳转至

急救!!!请大侠帮忙看看ARM-M3为什么无法进入定时器中断

菜鸟
2013-10-12 10:43:26     打赏

static void BSP_NVICConfiguration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;  


  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);           //抢占式优先级别设置为无抢占优先级


  NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn ;     //指定中断源
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //指定响应优先级别1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;           //使能外部中断通道3
  NVIC_Init(&NVIC_InitStructure);
  
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn ;       //指定中断源
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;       //指定响应优先级别1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;          //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);    
  
  NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn ;    //指定中断源
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;        //指定响应优先级别1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //使能外部中断通道
  NVIC_Init(&NVIC_InitStructure);     
  


static void BSP_LedInit(void)
{
    GPIO_InitTypeDef  gpio_init;
    
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    
    gpio_init.GPIO_Pin   = GPIO_Pin_12 | GPIO_Pin_13 |GPIO_Pin_14 ;
    gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
    gpio_init.GPIO_Mode  = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOB, &gpio_init);        
    
    gpio_init.GPIO_Pin   = GPIO_Pin_15;
    gpio_init.GPIO_Speed = GPIO_Speed_50MHz;
    gpio_init.GPIO_Mode  = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &gpio_init);     
   
    GPIO_SetBits(GPIOB, GPIO_Pin_14);
    GPIO_ResetBits(GPIOB, GPIO_Pin_12|GPIO_Pin_13);
}

static void Tim1_Configuration(void)

{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;
  TIM_DeInit(TIM1); //重设为缺省值
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE);
  /*TIM1时钟配置*/
  TIM_TimeBaseStructure.TIM_Prescaler = 36000;                //psc预分频(时钟分频)72M/36k=2K
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   //向上计数
  TIM_TimeBaseStructure.TIM_Period = 1000;                    //arr 装载值 2k/1k=2hz 
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;       //设置了时钟分割 不懂得不管
  TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);                //初始化TIMx的时间基数单位


  /* Channel 1 Configuration in PWM mode 通道一的PWM */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;             //PWM模式2
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效  
  TIM_OCInitStructure.TIM_Pulse = 40;                          //占空时间  
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;     //输出极性
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;  //空闲状态下的非工作状态 
  TIM_OC3Init(TIM1,&TIM_OCInitStructure);                       //数初始化外设TIMx通道1
  
  TIM_ClearFlag(TIM1, TIM_FLAG_Update);                           //清除溢出中断标志
  TIM_ARRPreloadConfig(TIM1, DISABLE);                          //禁止ARR预装载缓冲器
  
  TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);            //TIM1 Interrupt enable
  //TIM_Cmd(TIM1,ENABLE);                                   //TIM1 Main Output Enable 使能TIM1外设的主输出
  TIM_CtrlPWMOutputs(TIM1,ENABLE);                    //TIM1 PWM Output Enable 使能TIM1外设的主输出


}


/*******************************************************************************
* Function Name : Task_TIM1
* Description : TIM任务
* Input : None
* Output : None
* Return : None
*******************************************************************************/
static void App_Task_TIM1(void* p_arg)
{
      (void) p_arg ;
      INT8U err;
      Sem_Task_TIM1=OSSemCreate(0);  
      while(1)
      {
            OSSemPend(Sem_Task_TIM1,0,&err);// waiting for SEMAPHORE
            ClockNum=0;
            TIM_Cmd(TIM1,DISABLE); 
            GPIO_ResetBits(GPIOB, GPIO_Pin_14);
            OSTimeDlyHMSM(0,0,1,0);           
            GPIO_SetBits(GPIOB, GPIO_Pin_14);
            OSTimeDlyHMSM(0,0,1,0);                  
      }
}


void TIM1_UP_IRQHandler(void) 
{         
     OSIntEnter();  
     ClockNum++;  
     if(ClockNum==1)
     {
      OSSemPost(Sem_Task_TIM1); // 发送信号量,这个函数并不会引起系统调度,所以中断服务函数一定要简洁。
     }
     TIM_ClearITPendingBit(TIM1,TIM_IT_Update); // 清除标志位
     OSIntExit();






关键词: 定时器中断    

菜鸟
2013-10-12 10:47:25     打赏
2楼

少加了一个函数, 我用外部触发中断来开启始终使能,单步调试能看到   TIM_Cmd(TIM1,ENABLE);  已经运行


static void App_Task_Key(void* p_arg)

{
      (void) p_arg ;
      INT8U err;
      Sem_Task_Key=OSSemCreate(0);  
      while(1)
      {
            OSSemPend(Sem_Task_Key,0,&err);// waiting for SEMAPHORE
            GPIO_ResetBits(GPIOB, GPIO_Pin_13);
            TIM_Cmd(TIM1,ENABLE);  
             OSTimeDlyHMSM(0,0,1,0);           
            GPIO_SetBits(GPIOB, GPIO_Pin_13);
            OSTimeDlyHMSM(0,0,1,0);                  
      }
}


void EXTI15_10_IRQHandler(void) 
{           
     OSIntEnter();                 
     OSSemPost(Sem_Task_Key); // 发送信号量,这个函数并不会引起系统调度,所以中断服务函数一定要简洁。
     EXTI_ClearITPendingBit(EXTI_Line14); // 清除标志位
     OSIntExit();
}

菜鸟
2013-10-12 14:10:36     打赏
3楼
自己找到问题了,都是马虎啊!

  TIM_DeInit(TIM1); //重设为缺省值
  RCC_APB2PeriphResetCmd(RCC_APB2Periph_TIM1, ENABLE);

应为

RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); 


院士
2013-10-12 21:58:41     打赏
4楼

嘿嘿


楼主下回可要细心啊~~

话说ST的库函数在这里设计的确有些复杂了。


高工
2013-10-12 22:21:36     打赏
5楼
,楼主在摸索中逐渐掌握要领。

高工
2013-10-13 13:12:33     打赏
6楼
这些固件库的函数长的都挺像的,呵呵

共6条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]