OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5050|回复: 2

UCOS定时器捕获的中断问题

[复制链接]

1

主题

3

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2019-5-21
在线时间
12 小时
发表于 2021-10-21 11:28:26 | 显示全部楼层 |阅读模式
1金钱
请教一下各位大神,小弟写了一个用定时器捕获编码器脉冲,但加入操作系统UCOSiii的时候,发现只要采集的频率高到一定的时候,就会出现卡死的情况。在主程序中只有两个任务,一个是LED亮灭的任务,另一个是定时器采集完的数据进行计算得任务,中断就只有定时器的中断,其他都没有。现在不知道为什么会导致卡死。代码如下:

  1. //app_cfg.h文件
  2. #define  APP_TASK_LED_PRIO                                        3
  3. #define  APP_TASK_ENCODER_PRIO                              6
  4. #define  APP_TASK_START_STK_SIZE                     128
  5. #define  APP_TASK_LED_STK_SIZE                          128
  6. #define  APP_TASK_ENCODER_STK_SIZE               258
  7. //os_cfg_app.h文件
  8. #define  OS_CFG_INT_Q_SIZE                                100u               
  9. #define  OS_CFG_INT_Q_TASK_STK_SIZE       200u

  10. //app.c文件
  11. #include <includes.h>
  12. /**********************全局变量-每个任务间数据通信用************************/
  13. CPU_INT32U        encoderValue = 0x0;
  14. /*
  15. *********************************************************************************************************
  16. *                                                 TCB
  17. *********************************************************************************************************
  18. */
  19. static OS_TCB AppTaskStartTCB;     
  20. static OS_TCB AppTaskLedTCB;      
  21. OS_TCB AppTaskEncoderTCB;                        
  22. /*
  23. *********************************************************************************************************
  24. *                                                STACKS
  25. *********************************************************************************************************
  26. */
  27. static  CPU_STK  AppTaskStartStk[APP_TASK_START_STK_SIZE];        
  28. static  CPU_STK  AppTaskLedStk[ APP_TASK_LED_STK_SIZE ];
  29. static  CPU_STK  AppTaskEncoderStk[ APP_TASK_ENCODER_STK_SIZE ];
  30. /*
  31. *********************************************************************************************************
  32. *                                         FUNCTION PROTOTYPES
  33. *********************************************************************************************************
  34. */
  35. static  void  AppTaskStart  (void *p_arg);               
  36. static  void  AppTaskLed  ( void * p_arg );
  37. static  void  AppTaskEncoder    ( void * p_arg );
  38. /*
  39. *********************************************************************************************************
  40. *                                         main
  41. *********************************************************************************************************
  42. */
  43. int  main (void)
  44. {
  45.     OS_ERR  err;
  46.     OSInit(&err);                                                            
  47.     /* 创建起始任务 */
  48.     OSTaskCreate((OS_TCB     *)&AppTaskStartTCB,                             
  49.                              (CPU_CHAR   *)"App Task Start",                             
  50.                               (OS_TASK_PTR ) AppTaskStart,                              
  51.                              (void       *) 0,                                          
  52.                               (OS_PRIO     ) APP_TASK_START_PRIO,                        
  53.                               (CPU_STK    *)&AppTaskStartStk[0],                          
  54.                               (CPU_STK_SIZE) APP_TASK_START_STK_SIZE / 10,               
  55.                               (CPU_STK_SIZE) APP_TASK_START_STK_SIZE,                     
  56.                               (OS_MSG_QTY  ) 5u,                                         
  57.                               (OS_TICK     ) 0u,                                          
  58.                               (void       *) 0,                                          
  59.                               (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),  
  60.                               (OS_ERR     *)&err);                                       
  61.     OSStart(&err);                                                         
  62. }
  63. static  void  AppTaskStart (void *p_arg)
  64. {
  65.     CPU_INT32U  cpu_clk_freq;
  66.     CPU_INT32U  cnts;
  67.     OS_ERR      err;
  68.     (void)p_arg;
  69.     BSP_Init();                                             
  70.     CPU_Init();                                                  
  71.     cpu_clk_freq = BSP_CPU_ClkFreq();                           
  72.     cnts = cpu_clk_freq / (CPU_INT32U)OSCfg_TickRate_Hz;         
  73.     OS_CPU_SysTickInit(cnts);                                    
  74.     Mem_Init();                                                  
  75. #if OS_CFG_STAT_TASK_EN > 0u                                    
  76.     OSStatTaskCPUUsageInit(&err);                                
  77. #endif                                                           
  78.                                                                  
  79.     CPU_IntDisMeasMaxCurReset();                                
  80.     /* 配置时间片轮转调度 */               
  81.     OSSchedRoundRobinCfg((CPU_BOOLEAN   )DEF_ENABLED,         
  82.                                                         (OS_TICK       )0,                     
  83.                                                    (OS_ERR       *)&err );               
  84.                                  
  85.      /* 创建 AppTaskLed任务 */
  86.     OSTaskCreate((OS_TCB     *)&AppTaskLedTCB,                           
  87.                                 (CPU_CHAR   *)"App Task Led",                             
  88.                                 (OS_TASK_PTR ) AppTaskLed,                                
  89.                                 (void       *) 0,                                          
  90.                                (OS_PRIO     ) APP_TASK_LED_PRIO,                        
  91.                                (CPU_STK    *)&AppTaskLedStk[0],                          
  92.                                (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE / 10,               
  93.                                (CPU_STK_SIZE) APP_TASK_LED_STK_SIZE,                    
  94.                                (OS_MSG_QTY  ) 5u,                                         
  95.                                (OS_TICK     ) 0u,                                          
  96.                                (void       *) 0,                                          
  97.                                (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
  98.                                (OS_ERR     *)&err);                                       
  99.                                          
  100.        /* 创建 AppTaskEncoderTCB 任务 */
  101.     OSTaskCreate((OS_TCB     *)&AppTaskEncoderTCB,                             
  102.                               (CPU_CHAR   *)"App Task Encoder",                             
  103.                               (OS_TASK_PTR ) AppTaskEncoder,                              
  104.                               (void       *) 0,                                          
  105.                                (OS_PRIO     ) APP_TASK_ENCODER_PRIO,                        
  106.                                (CPU_STK    *)&AppTaskEncoderStk[0],                          
  107.                                (CPU_STK_SIZE) APP_TASK_ENCODER_STK_SIZE / 10,               
  108.                                (CPU_STK_SIZE) APP_TASK_ENCODER_STK_SIZE,                     
  109.                                (OS_MSG_QTY  ) 100u,                                         
  110.                                (OS_TICK     ) 0u,                                          
  111.                                (void       *) 0,                                          
  112.                                (OS_OPT      )(OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),  
  113.                                (OS_ERR     *)&err);                                       
  114.                                          
  115.     OSTaskDel ( 0, & err );                     
  116. }

  117. /*
  118. *********************************************************************************************************
  119. *                                          LED TASK
  120. *********************************************************************************************************
  121. */
  122. static  void  AppTaskLed( void * p_arg )
  123. {
  124.         OS_ERR err;

  125.         (void)p_arg;
  126.                  
  127.         while (DEF_TRUE) {   
  128.                
  129.                 macLED1_TOGGLE();
  130.                 OSTimeDlyHMSM ( 0, 0, 0, 100, OS_OPT_TIME_HMSM_STRICT, & err );   
  131.         }
  132. }

  133. /*
  134. *********************************************************************************************************
  135. *                                          Encoder TASK
  136. *********************************************************************************************************
  137. */
  138. static  void  AppTaskEncoder( void * p_arg )
  139. {
  140.         OS_ERR err;
  141.         CPU_TS         ts;
  142.         CPU_INT32U tim_PscClk;


  143.         (void)p_arg;
  144.         
  145.         tim_PscClk = 72000000 / (GENERAL_TIM_PSC + 1);
  146.                  
  147.         while (DEF_TRUE) {


  148.                 OSTaskSemPend((OS_TICK   )0,
  149.                                                 (OS_OPT    )OS_OPT_PEND_BLOCKING,
  150.                                                 (CPU_TS   *)&ts,
  151.                                                 (OS_ERR   *)&err);
  152.                         
  153.                 encoderValue =  tim_PscClk / (TIM_ICUserValueStructure.Capture_Period * (GENERAL_TIM_PERIOD + 1) +\
  154.                                                 (TIM_ICUserValueStructure.Capture_CcrValue + 1));
  155.         
  156.         }

  157. }

  158. //STM32的定时器用TIM3,计数器的时钟  72000000/(71+1) = 1000000Hz,即1us; 定时器周期0xffff即65535.产生一次中断的时间是1us*65535 = 65.535ms


  159. void GENERAL_TIM_INT_FUN(void)
  160. {
  161.         OS_ERR   err;
  162.         OSIntEnter();                                      
  163.                                                         
  164.         if(TIM_GetITStatus(GENERAL_TIM, TIM_IT_Update) != RESET)
  165.         {
  166.                 TIM_ICUserValueStructure.Capture_Period++;
  167.                 TIM_ClearITPendingBit(GENERAL_TIM, TIM_FLAG_Update);
  168.         }
  169.         
  170.         if(TIM_GetITStatus(GENERAL_TIM, GENERAL_TIM_IT_CCx) != RESET)
  171.         {
  172.                 if(TIM_ICUserValueStructure.Capture_StartFlag == 0)
  173.                 {
  174.                         TIM_SetCounter(GENERAL_TIM, 0);
  175.                         TIM_ICUserValueStructure.Capture_Period = 0;
  176.                         TIM_ICUserValueStructure.Capture_CcrValue = 0;
  177.                         TIM_ICUserValueStructure.Capture_StartFlag = 1;
  178.                 }
  179.                 else
  180.                 {
  181.                         TIM_ICUserValueStructure.Capture_CcrValue = GENERAL_TIM_GetCapturex_FUN(GENERAL_TIM);


  182.                         TIM_ICUserValueStructure.Capture_StartFlag = 0;
  183.                                 

  184.                                 OSTaskSemPost((OS_TCB  *)&AppTaskEncoderTCB,
  185.                                                                                          (OS_OPT   )OS_OPT_POST_NONE,
  186.                                                                                          (OS_ERR  *)&err);
  187.                         
  188.                 }
  189.                
  190.                 TIM_ClearITPendingBit(GENERAL_TIM, GENERAL_TIM_IT_CCx);
  191.         
  192.         }
  193.         
  194.         OSIntExit();                                       //退出中断
  195.                
  196. }
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

886

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1454
金钱
1454
注册时间
2020-8-19
在线时间
331 小时
发表于 2021-10-21 16:38:44 | 显示全部楼层
回复

使用道具 举报

4

主题

461

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1071
金钱
1071
注册时间
2021-4-26
在线时间
351 小时
发表于 2021-10-21 18:36:25 | 显示全部楼层
bangding
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 10:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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