[STM8] STM8S103进入中断后无法退出,求助

[复制链接]
 楼主| wuxin999 发表于 2015-10-25 10:28 | 显示全部楼层 |阅读模式
小弟新学STM8,看到定时器部分时候用定时器4写了个LED的演示程序,烧录后发现LED并不能正常闪烁,完整的程序如下:1  stm8_interrupt_vector.c程序

  1. /*        BASIC INTERRUPT VECTOR TABLE FOR STM8 devices
  2. *        Copyright (c) 2007 STMicroelectronics
  3. */
  4. //这里使用的是定时器4
  5. typedef void [url=home.php?mod=space&uid=1095855]@far[/url] (*interrupt_handler_t)(void);

  6. struct interrupt_vector {
  7.         unsigned char interrupt_instruction;
  8.         interrupt_handler_t interrupt_handler;
  9. };

  10. @far [url=home.php?mod=space&uid=422518]@interrupt[/url] void NonHandledInterrupt (void)
  11. {
  12.         /* in order to detect unexpected events during development,
  13.            it is recommended to set a breakpoint on the following instruction
  14.         */
  15.         return;
  16. }


  17. extern void _stext();     /* startup routine */
  18. @far @interrupt void timer4_out (void);
  19. struct interrupt_vector const _vectab[] = {
  20.         {0x82, (interrupt_handler_t)_stext}, /* reset */
  21.         {0x82, NonHandledInterrupt}, /* trap  */
  22.         {0x82, NonHandledInterrupt}, /* irq0  */
  23.         {0x82, NonHandledInterrupt}, /* irq1  */
  24.         {0x82, NonHandledInterrupt}, /* irq2  */
  25.         {0x82, NonHandledInterrupt}, /* irq3  */
  26.         {0x82, NonHandledInterrupt}, /* irq4  */
  27.         {0x82, NonHandledInterrupt}, /* irq5  */
  28.         {0x82, NonHandledInterrupt}, /* irq6  */
  29.         {0x82, NonHandledInterrupt}, /* irq7  */
  30.         {0x82, NonHandledInterrupt}, /* irq8  */
  31.         {0x82, NonHandledInterrupt}, /* irq9  */
  32.         {0x82, NonHandledInterrupt}, /* irq10 */
  33.         {0x82, NonHandledInterrupt}, /* irq11 */
  34.         {0x82, NonHandledInterrupt}, /* irq12 */
  35.         {0x82, NonHandledInterrupt}, /* irq13 */
  36.         {0x82, NonHandledInterrupt}, /* irq14 */
  37.         {0x82, NonHandledInterrupt}, /* irq15 */
  38.         {0x82, NonHandledInterrupt}, /* irq16 */
  39.         {0x82, NonHandledInterrupt}, /* irq17 */
  40.         {0x82, NonHandledInterrupt}, /* irq18 */
  41.         {0x82, NonHandledInterrupt}, /* irq19 */
  42.         {0x82, NonHandledInterrupt}, /* irq20 */
  43.         {0x82, NonHandledInterrupt}, /* irq21 */
  44.         {0x82, NonHandledInterrupt}, /* irq22 */
  45.         {0x82, timer4_out}, /* irq23 */
  46.         {0x82, NonHandledInterrupt}, /* irq24 */
  47.         {0x82, NonHandledInterrupt}, /* irq25 */
  48.         {0x82, NonHandledInterrupt}, /* irq26 */
  49.         {0x82, NonHandledInterrupt}, /* irq27 */
  50.         {0x82, NonHandledInterrupt}, /* irq28 */
  51.         {0x82, NonHandledInterrupt}, /* irq29 */
  52. };
2   此处是MAIN.C文件

  1. void init_io(void)
  2. {
  3.         PB_CR1 &= ~(1<<5);
  4.         PB_CR2 &= ~(1<<5);
  5.         PB_DDR |= (1<<5);
  6.         PB_ODR = 0xff;
  7. }
  8. void init_timer4 (void)
  9. {
  10.         TIM4_PSCR = 0x02;
  11.         TIM4_ARR = 0xFA;
  12.         TIM4_CNTR = 0xFA;
  13.         TIM4_IER |= (1<<0);
  14. }
  15. @far @interrupt void timer4_out (void)
  16. {
  17.         count++;
  18. }
  19. void init_clk (void)
  20. {
  21.         CLK_CMSR = 0xe1;
  22.         CLK_CKDIVR =((0x11<<3)|(0x01));//8|2
  23.         CLK_PCKENR1 |= (1<<4);
  24. }//1M
  25. void main (void)
  26. {
  27.         _asm("sim");
  28.         init_io();//板上一个LED,初始化LED输出的接口
  29.         init_clk();//初始化系统时钟
  30.         init_timer4();//初始化定时器4
  31.         TIM4_CR1 = (1<<0);
  32.         _asm("rim");
  33.         while(1)
  34.         {
  35.                 if(count>1000)//当定时器中断服务程序的计数大于1000的时候执行括号内的程序
  36.                 {
  37.                         PB_ODR^=(1<<5);//LED接口取反
  38.                         count = 0;//计数清零
  39.                 }
  40.         }
  41. }
单步运行的时候发现程序一直运行在中断服务程序@far @interrupt void timer4_out (void)中,count一直在加1,无法跳出中断服务程序。
昨天看了一晚上,实在看不出是语法错误还是规格数理解有问题,请各位帮忙看看,找找问题在哪里。
huangcunxiake 发表于 2015-10-25 14:57 | 显示全部楼层
退出就是清除中断标志啊,然后重启中断服务。
643757107 发表于 2015-10-25 15:00 | 显示全部楼层
有没有清除中断标志啊。
huangcunxiake 发表于 2015-10-25 15:28 | 显示全部楼层
楼主随便先找个别人写的能用的,慢慢修改。
NE5532 发表于 2015-10-25 16:30 | 显示全部楼层
中断标志没清,当然一直在里面转。
gmm2015 发表于 2015-10-26 09:24 | 显示全部楼层
没清中断标志位
 楼主| wuxin999 发表于 2015-10-26 14:45 | 显示全部楼层
huangcunxiake 发表于 2015-10-25 14:57
退出就是清除中断标志啊,然后重启中断服务。

这个到没有,因为学习的时候例程是把LED接口取反直接放在中断服务程序里的,所以还不知道这一说,谢谢
 楼主| wuxin999 发表于 2015-10-26 14:46 | 显示全部楼层
643757107 发表于 2015-10-25 15:00
有没有清除中断标志啊。

这个没有,多谢指点
 楼主| wuxin999 发表于 2015-10-26 14:47 | 显示全部楼层
huangcunxiake 发表于 2015-10-25 15:28
楼主随便先找个别人写的能用的,慢慢修改。

恩,我现在正在学习中,还没涉及到具体项目,这是在学习中遇到的问题:)
 楼主| wuxin999 发表于 2015-10-26 14:47 | 显示全部楼层
NE5532 发表于 2015-10-25 16:30
中断标志没清,当然一直在里面转。

恩,谢谢,多谢指点
 楼主| wuxin999 发表于 2015-10-26 14:48 | 显示全部楼层

恩,多谢指点:)
309030106 发表于 2015-10-28 19:52 | 显示全部楼层
一般退出中断要清除中断标志的
FireRiver9 发表于 2015-10-28 21:07 | 显示全部楼层
楼主到底是不是中断标志位没清
huangcunxiake 发表于 2015-10-28 21:22 | 显示全部楼层
进入中断后,先关闭中断,然后清理标志,之后处理中断程序,然后重启中断退出。
 楼主| wuxin999 发表于 2015-11-10 12:42 | 显示全部楼层
FireRiver9 发表于 2015-10-28 21:07
楼主到底是不是中断标志位没清

是中断标志没清
 楼主| wuxin999 发表于 2015-11-10 12:43 | 显示全部楼层
309030106 发表于 2015-10-28 19:52
一般退出中断要清除中断标志的

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

本版积分规则

个人签名:少年不识愁滋味,爱上层楼。爱上层楼,为赋新词强说愁。而今识尽愁滋味,欲说还休。欲说还休,却道天凉好个秋!

1

主题

93

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部