野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15514|回复: 2

如何在ucosii系统中进入定时器中断

[复制链接]
发表于 2016-1-9 16:24:55 | 显示全部楼层 |阅读模式
用设置断点的方法,怎么也进不了这个中断。
这是我的中断函数
  1. void TIM2_IRQHandler(void)
  2. {       
  3.   //OS_Enter_CRITICAL();  //保存全局中断标志,关总中断
  4.         OSIntNesting++;
  5.         //OS_EXIT_CRITICAL();   //恢复全局中断标志
  6.         if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)        //TIM_IT_Update
  7.         {                       
  8.                                
  9.                                 TIM2->CCR1 =148 ;//indexWave[pwm_index];        //根据PWM表修改定时器的比较寄存器值
  10.                                 TIM2->CCR2 = 148;//indexWave[pwm_index] ;
  11.                                 pwm_index++;
  12.                
  13. /*****************************先判断电机方向************************************/
  14.                                 if (FlagMotor)
  15.                                         NumMotor=180;
  16.                                 else
  17.                                         NumMotor=40;
  18.                                
  19. /*****************************电机停止程序**************************************/
  20.                                 if( ((pwm_index >= NumMotor)&& Trig_Laser4==1 )&& enable==0 )                        //
  21.                                 {
  22.                                         pwm_index=0;
  23.                                         TIM2->CCR1=0;
  24.           TIM2->CR1&=0x00;
  25.           enable=1;
  26.           backover=1;                                       
  27.                                 }
  28.                                

  29.                 TIM_ClearITPendingBit (TIM2, TIM_IT_Update);        //必须要清除中断标志位
  30.         }
  31. OSIntExit();
  32. }
复制代码
这是我的定时器配置
  1. void TIM2_Config_task(void *pdata)
  2. {  
  3.         while(1)
  4.   {               
  5.                
  6.                 GPIO_InitTypeDef GPIO_InitStructure;
  7.                
  8.           TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  9.           TIM_OCInitTypeDef  TIM_OCInitStructure;       
  10.                
  11.              /*******************TIM2_GPIO_Config任务******************/               
  12.                
  13.                 /* GPIOB clock enable */
  14.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  15.                 /*配置PWM到PA0,PA1上*/
  16.                 GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1 ;
  17.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  18.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  19.                 GPIO_Init(GPIOA, &GPIO_InitStructure);
  20.                
  21.                  
  22.               /*******************TIM2_Mode_Config任务*****************/               
  23.        
  24.                 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);                                         //使能TIM2时钟

  25.                 /* 基本定时器配置 */                 
  26.                 TIM_TimeBaseStructure.TIM_Period = 255;                                                                 //当定时器从0计数到255,即为266次,为一个定时周期589
  27.                 TIM_TimeBaseStructure.TIM_Prescaler = 493;                                                                    //设置预分频:
  28.                 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                        //设置时钟分频系数:不分频(这里用不到)
  29.                 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //向上计数模式
  30.                 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  31.                 /* PWM模式配置 */
  32.                 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                            //配置为PWM模式1
  33.                 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //使能输出
  34.                 TIM_OCInitStructure.TIM_Pulse = 0;                                                                                                          //设置初始PWM脉冲宽度为0       
  35.                 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;            //当定时器计数值小于CCR1_Val时为低电平

  36.                 TIM_OC1Init(TIM2, &TIM_OCInitStructure);                                                                                 //使能通道1
  37.        

  38.                 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable);                                                //使能预装载       
  39.        
  40.                 TIM_OC2Init(TIM2, &TIM_OCInitStructure);                    //使能通道2
  41.                 TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);                                                //使能预装载       
  42.        
  43.                 TIM_ARRPreloadConfig(TIM2, ENABLE);                                                                                                         //使能TIM2重载寄存器ARR

  44.                 /* TIM2 enable counter */
  45.                 TIM_Cmd(TIM2, ENABLE);                                                                                                   //使能定时器2       
  46.        
  47.                 TIM_ITConfig(TIM2,TIM_IT_Update, ENABLE);                                                                                //使能update中断
  48.                
  49. //                NVIC_Config_PWM();                                                                                                                                                                        //配置中断优先级       
  50.           OSTaskDel(OS_PRIO_SELF);
  51.          // OSTimeDly(1);
  52.   }
  53. }
复制代码
这是我的主函数

  1. int main(void)
  2. {
  3.         delay_init();                                                 //延时初始化
  4.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         //中断分组配置
  5.         //NVIC_Config_PWM();       
  6.         USART1_Init(115200);                                          //串口波特率设置
  7.         //LED_Init();                                                              //LED初始化?
  8.         Motor_GPIO_Config();                                    //初始化电机引脚
  9.        
  10.         OSInit();                                                                        //UCOS初始化
  11.         OSTaskCreate(start_task,(void*)0,
  12.                            (OS_STK*)&START_TASK_STK
  13.                      [START_STK_SIZE-1],
  14.                      START_TASK_PRIO);                          //创建开始任务
  15.         OSStart();                                                                       //开始任务
  16. }
复制代码
我在我在OS_CFG.H也使能了OS_TMR_EN。定义了#define  OS_TASK_TMR_PRIO      4 。之后编译器没有报错。
但是我为什么进不了中断呢???我这个工程在裸机的时候是没有问题,但是上拉额ucosii就是进不了中断。。。。。。
回复

使用道具 举报

发表于 2016-1-9 18:37:40 | 显示全部楼层
你的定时器初始化为什么要放在while循环里?这样会不停初始化的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-1-11 15:04:51 | 显示全部楼层
flyleaf 发表于 2016-1-9 18:37
你的定时器初始化为什么要放在while循环里?这样会不停初始化的

那我要每次开启定时器怎么办呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 03:55 , Processed in 0.026252 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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