注册 登录
查看: 724|回复: 12

[摄像头组] KL26在中断里面执行PWM更新就会死机,请问山外哥这个怎么解决

[复制链接]
发表于 2014-7-7 10:07:35 | 显示全部楼层 |阅读模式
  1. 第一段:PWM初始化
  2. void Motor_IO_Init(void)            //电机驱动初始化
  3. {
  4.     tpm_pwm_init(MOTOR_TPM, MOTOR_CH1, 2000, 0);        //电机使用定时器0,通道0~3,初始化频率2K,占空比0
  5.     tpm_pwm_init(MOTOR_TPM, MOTOR_CH2, 2000, 0);
  6.     tpm_pwm_init(MOTOR_TPM, MOTOR_CH3, 2000, 0);
  7.     tpm_pwm_init(MOTOR_TPM, MOTOR_CH4, 2000, 0);
  8. }
  1. 第二段:定时器中断初始化
  2. void My_Pit_Init(void)
  3. {
  4.     pit_init_ms(PIT0, 1);                               //定时器初始化     
  5.     set_vector_handler(PIT_VECTORn,PIT_Handler);    //设置PIT0的中断复位函数为 PIT0_IRQHandler
  6.     enable_irq (PIT_IRQn);                              //使能PIT0中断
  7. }
  1. 第三段:定时器中断函数
  2. void PIT_Handler(void)
  3. {
  4.     if(PIT_TFLG(PIT0) == 1)             //判断是否 PIT0 进入中断
  5.     {
  6.         DisableInterrupts;
  7.         PIT_Flag_Clear(PIT0);           //清中断标志位
  8. //  disable_irq(PIT_IRQn);          //PIT中断同时对PIT0 PIT1有效
  9. /******************中断程序开始*****************/
  10.         volatile static unsigned char times = 0;
  11.         times++;
  12.         
  13.         switch(times)
  14.         {
  15.           case 1:
  16.             AD_Calculate();             //陀螺仪及加速度计处理
  17.             led(LED0, LED_ON);
  18.             led(LED1, LED_OFF);
  19.             led(LED2, LED_OFF);
  20.             led(LED3, LED_OFF);
  21. //            tpm_pwm_duty(MOTOR_TPM,MOTOR_CH2,0);
  22.             break;
  23.             
  24.           case 2:
  25.             Pulse_Calculate();            
  26.           led(LED0, LED_OFF);
  27.           led(LED1, LED_ON);
  28.           led(LED2, LED_OFF);
  29.           led(LED3, LED_OFF);
  30. //          tpm_pwm_duty(MOTOR_TPM,MOTOR_CH2,250);
  31.             break;
  32.             
  33.           case 3:
  34. //          Speed_Calculate(angle,Gyro_Now);
  35.           led(LED0, LED_OFF);
  36.           led(LED1, LED_OFF);
  37.           led(LED2, LED_ON);
  38.           led(LED3, LED_OFF);
  39. //          tpm_pwm_duty(MOTOR_TPM,MOTOR_CH2,500);
  40.             break;
  41.             
  42.           case 4:
  43.             times = 0;
  44.           led(LED0, LED_OFF);
  45.           led(LED1, LED_OFF);
  46.           led(LED2, LED_OFF);
  47.           led(LED3, LED_ON);
  48. //          tpm_pwm_duty(MOTOR_TPM,MOTOR_CH2,1000);
  49.             
  50.             break;
  51.         }
  52. /******************中断程序结束*****************/
  53. //  PIT_Flag_Clear(PIT0);           //清中断标志位      
  54. //        enable_irq(PIT_IRQn);
  55.           EnableInterrupts;
  56.     }
  57. }
  1. 说明:只要注释掉PWM更新就不会死了tpm_pwm_duty(MOTOR_TPM,MOTOR_CH2,1000)
回复

使用道具 举报

发表于 2014-7-7 10:08:47 | 显示全部楼层
出现这问题,可以参考我们的IAR调试视频(K60视频),里面有针对这些内容来进行讲解的。

你在IAR里打开调用栈,然后截图调用栈的信息,上传上来,让我们看看是什么情况。
回复 支持 反对

使用道具 举报

发表于 2014-7-7 10:09:39 | 显示全部楼层
调用栈在 view —— call stack 里调出
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 10:16:12 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 10:08
出现这问题,可以参考我们的IAR调试视频(K60视频),里面有针对这些内容来进行讲解的。

你在IAR里打开调 ...

谢谢,我去试试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 10:22:34 | 显示全部楼层
山外哥就这个了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 10:23:56 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 10:09
调用栈在 view —— call stack 里调出

山外哥就这个了
回复 支持 反对

使用道具 举报

发表于 2014-7-7 10:25:32 | 显示全部楼层
木桥 发表于 2014-7-7 10:22
山外哥就这个了

占空比超过 100%
检测PWM的精度设置是否正确
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 10:28:14 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 10:25
占空比超过 100%
检测PWM的精度设置是否正确

好的,我去查查,非常感谢了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 10:34:31 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 10:25
占空比超过 100%
检测PWM的精度设置是否正确

谢谢山外哥,都怪自己对库不太熟悉
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-7 10:37:19 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 10:25
占空比超过 100%
检测PWM的精度设置是否正确


还想请教下山外哥,你是怎么通过栈看出里面端倪的
回复 支持 反对

使用道具 举报

发表于 2014-7-7 10:38:14 | 显示全部楼层
木桥 发表于 2014-7-7 10:37
还想请教下山外哥,你是怎么通过栈看出里面端倪的

卡死在断言失败,那么上一个函数是PWM占空比设置,那就是占空比超过100%
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-8 11:40:30 | 显示全部楼层
山外メ雲ジ 发表于 2014-7-7 10:38
卡死在断言失败,那么上一个函数是PWM占空比设置,那就是占空比超过100%

再请教一个问题:为什么我用
  1. uart_putchar (UART_GYRO,(char)databuf[i]);
这个函数发送数据,用串口助手接受但是接受的数据都是错误的
回复 支持 反对

使用道具 举报

发表于 2014-7-8 11:42:10 | 显示全部楼层
木桥 发表于 2014-7-8 11:40
再请教一个问题:为什么我用这个函数发送数据,用串口助手接受但是接受的数据都是错误的

UART_GYRO 配置对了没。波特率设置对了没?
databuf 的数据,你确定是对的?试下用 0xAA 代替,然后串口助手里十六进制显示
回复 支持 反对

使用道具 举报

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

本版积分规则

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