切换到宽版
  • 5338阅读
  • 14回复

[STM]STM8学习之——中断 [复制链接]

上一主题 下一主题
离线zeze10000
 

发帖
2858
M币
8559
专家
35
粉丝
112
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-06-15
STM8的中断比51的中断要强大的多。

STM8的外部引脚几乎都可以当做中断源使用。
不过同一组引脚要共用同一个中断向量,同一组引脚有多个开启了中断功能的话还需要判断是哪个脚触发。
最好是将外部中断放置在不同的端口组,便于区分。

外部中断的触发方式也比51要丰富。
有下降沿和低电平触发,说白了和低电平触发一样。
还有单独的下降沿和上升沿触发,重要的是还有一个上升沿和下降沿触发。

STM8的中断优先级也很有意思,不可改变的硬件优先级,不可屏蔽的中断。
不可屏蔽的中断有reset复位中断,来源有多个,最终都是通过拉低reset脚来实现,可以监控reset脚电平状态。
TRAP软件中断,这个不太会用,只知道汇编指令trap能触发这个中断。
TLI top level interrupt 最高级外部中断。
以上是不可屏蔽的中断,触发了就必须执行,我的理解是比最高优先级还要高。
软件优先级总共0~3级,数值越大优先级越高。
通过改变CPU状态寄存器的I0和I1位可以改变当前运行程序的软件优先级。
也就是所有运行的程序函数都有优先级,优先级放在I0,I1里。
开启中断的方法就是将main函数的优先级将为0,优先级高于0的中断就能打断main函数程序,进入中断。
在中断程序运行过程中不要轻易改变I0,I1的状态,一旦改变,程序的优先级就会随之改变,就有可能发生中断重入。
也就是在中断服务程序中不能执行关闭中断的操作。
在进入中断时,I0和I1会自动设定成中断的优先级,退出会恢复之前的优先级。

开启中断需要使用汇编指令rim。
在IAR环境中插入汇编语句的方法为asm("rim");
括号中双引号内就是要执行的汇编语句。
执行rim会将当前程序的中断优先级降到最低。
如果在中断服务程序中使用了该命令,中断服务程序的优先级将会降到最低,任意的中断都能将正在运行的中断服务程序打断,包括自己将自己打断,进入死循环。
sim指令是将当前程序软件优先级设为最高,也就是不能被中断,除非是不可屏蔽中断,比如reset。

好了,说了这么多还是进行小实验吧,有疑惑最好的解惑方法就是亲自验证一下。
大胆假设,小心求证。

这段代码试验了外部中断,TLI,TRAP中断
主要通过改变时钟分频观察LED闪烁频率判断中断的触发。

  1. /**中断实验************************/
  2. /*外部中断,TLI中断,TRAP中断     */
  3. /**********************************/
  4. #include<iostm8s105k4.h>
  5. #define LED PE_ODR_ODR5
  6. void delay() //延时函数
  7. {
  8.   int i,j;
  9.   i=32767;
  10.   j=2;
  11.   while(i--);
  12.   {
  13.     while(j--);
  14.   }
  15. }
  16. #pragma vector=EXTI2_vector  //PD引脚中断服务函数
  17. __interrupt void PC5_int()
  18. {
  19.   CLK_CKDIVR=0x00;   //时钟分频为0
  20. }
  21. #pragma vector=0x02         //TLI 外部最高中断
  22. __interrupt void TLI()
  23. {
  24.   CLK_CKDIVR=0x18;   //时钟分频为8
  25. }
  26. #pragma vector=0x01         //TRAP软件中断
  27. __interrupt void trap()
  28. {
  29.   CLK_CKDIVR=0x06;   //时钟分频为64
  30. }
  31. void init()
  32. {
  33. PE_DDR_DDR5=1; //PE5输出
  34. PE_CR1_C15= 1; //推挽输出
  35. PE_CR2_C25= 0; //低速率
  36. PC_DDR_DDR1=0; //输入模式
  37. PC_CR1_C11=1;  //上拉输入
  38. PC_CR2_C21=1;  //启用中断
  39. PD_DDR_DDR7=0; //输入模式
  40. PD_CR1_C17=1;  //上拉输入
  41. PD_CR2_C27=1;  //启用中断
  42. EXTI_CR1|=0x10;//PC上升沿触发
  43. }
  44. int main( void )
  45. {
  46.   init();
  47.   asm("rim");   //开中断
  48.   asm("trap");  //软件中断
  49.   while(1)
  50.   {
  51.     LED=~LED;
  52.     delay();
  53.   }
  54. }


最后留个小疑问。
不可屏蔽中断是不是不需要使用rim指令来开启?
进入中断服务函数后不想被其它不可屏蔽中断打断,如何处理?
使用rim指令关闭中断?

知道的小朋友请踊跃回答!




STM8首次学习实验~流水灯
http://bbs.mydigit.cn/read.php?tid=2452931

STM8学习之——中断
http://bbs.mydigit.cn/read.php?tid=2453643

STM8学习之——TIMER4定时器
http://bbs.mydigit.cn/read.php?tid=2456190

STM8学习之——timer1输入捕获
http://bbs.mydigit.cn/read.php?tid=2457109

STM8学习之——timer1外部时钟源模式2
http://bbs.mydigit.cn/read.php?tid=2459809

STM8学习之——timer1周期测量
http://bbs.mydigit.cn/read.php?tid=2461507

STM8学习之——周期测量的疑问
http://bbs.mydigit.cn/read.php?tid=2462114

STM8学习之——timer1频率占空比测量
http://bbs.mydigit.cn/read.php?tid=2464249

STM8学习之——timer1 PWM输出
http://bbs.mydigit.cn/read.php?tid=2467013

STM8学习之——AWU自动唤醒
http://bbs.mydigit.cn/read.php?tid=2477122

STM8学习之——BEEP资源
http://bbs.mydigit.cn/read.php?tid=2477224

STM8学习之——IWDG独立看门狗
http://bbs.mydigit.cn/read.php?tid=2477395

STM8学习之——WWDG窗口看门狗
http://bbs.mydigit.cn/read.php?tid=2477802

STM8学习之——UART串口
http://bbs.mydigit.cn/read.php?tid=2479924



本帖最近打赏记录:共2条打赏M币+16
夕阳飞雪 M币 +8 我这不是帮帮团,请原谅不能加更多的分,看看这人气与关注度,不知道你能坚持多久。 2018-06-18
66ok66 M币 +8 有点意思,补分了~ 2018-06-17
离线夕阳飞雪

发帖
1085
M币
1599
专家
8
粉丝
44
只看该作者 1楼 发表于: 2018-06-15
请登录后查看
离线zeze10000

发帖
2858
M币
8559
专家
35
粉丝
112
只看该作者 2楼 发表于: 2018-06-15
回 夕阳飞雪 的帖子
请登录后查看
离线zeze10000

发帖
2858
M币
8559
专家
35
粉丝
112
只看该作者 3楼 发表于: 2018-06-15
请登录后查看
离线夕阳飞雪

发帖
1085
M币
1599
专家
8
粉丝
44
只看该作者 4楼 发表于: 2018-06-16
回 zeze10000 的帖子
请登录后查看
离线netbeetle

发帖
702
M币
1011
专家
3
粉丝
12
只看该作者 5楼 发表于: 2018-06-16
回 夕阳飞雪 的帖子
请登录后查看
离线夕阳飞雪

发帖
1085
M币
1599
专家
8
粉丝
44
只看该作者 6楼 发表于: 2018-06-16
回 netbeetle 的帖子
请登录后查看
离线netbeetle

发帖
702
M币
1011
专家
3
粉丝
12
只看该作者 7楼 发表于: 2018-06-16
回 夕阳飞雪 的帖子
请登录后查看
离线66ok66

发帖
1356
M币
860
专家
10
粉丝
21
只看该作者 8楼 发表于: 2018-06-17
请登录后查看
[ 此帖被66ok66在2018-06-17 15:58重新编辑 ]
离线夕阳飞雪

发帖
1085
M币
1599
专家
8
粉丝
44
只看该作者 9楼 发表于: 2018-06-18
请登录后查看
快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个