• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

STM8单片机相关问题?

fb4b43ef0e26d840 2018-07-07 浏览量:902

STM8单片机的中断优先级如何配置,STM8刚开始接触,而且相关资料比较少。

麻烦用过的大佬答疑一下。

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • STM8S的中断由中断控制器(ITC)控制。STM8所有IO都支持中断分为PA~PE 5个组每组IO对应一个中断服务函数(也就是每组IO只有一个向量)。STM8没有专门的中断状态寄存器所以只能通过刚进入中断就读取IDR来判断不过在某些情况下此种方法就不好用了,所以在设计的时候就要考虑清楚是不是会冲突.最好把有冲突的中断放到不同的组。
    STM8的外部中断采用软件优先级+硬件优先级的控制方法,来控制优先级分组.软件优先级优先于硬件优先级。硬件优先级由向量号确定向量号越小优先级越高如下面图中断映射,中断向量表。



    STM8软件优先级设置可以分为4个等级(0~3)实际上可设置的就三个等级:1~3。优先级顺序:0<1<2<33的优先级最高高优先级的中断可以打断低优先级的中断
    多个中断同时发生:在软件优先级相同的情况下由硬件优先级决定谁先响应.但是硬件优先级不可打断。也就是相同软件优先级的中断硬件优先级低的中断在执行了...此时来一个硬件优先级高的中断是不可以打断低优先级的中断的。STM8还有个TLI外部中断这个优先级可以打断软件优先级为3的中断TLI的优先级不可设置.(基本就是最高级别了除了RESET)。
    • 发布于 2018-07-09
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:7
  • STM8软件优先级设置可以分为4个等级(0~3)实际上可设置的就三个等级:1~3。优先级顺序:0<1<2<33的优先级最高高优先级的中断可以打断低优先级的中断
    • 发布于2018-07-07
    • 举报
    • 评论 1
    • 2
    • 0
fb4b43ef0e26d840 回复了 huihui163 :怎么配置尼,能贴出那几句配置代码吗?我是STM8小白,不懂。 回复

  • 以STM8S103为例,正点原子写过一个优先级设置函数:http://www.openedv.com/posts/list/17409.htm
    • 发布于2018-07-07
    • 举报
    • 评论 0
    • 1
    • 0

  • 可以参考一下这篇文章https://blog.csdn.net/xingzhibo/article/details/51438123
    • 发布于2018-07-07
    • 举报
    • 评论 0
    • 1
    • 0

  • STM8S的中断由中断控制器(ITC)控制。STM8所有IO都支持中断,分为PA~PE 5个组,每组IO对应一个中断服务函数(也就是每组IO只有一个向量)。

      stm8s中断优先级程序

      //软件中断优先级设置函数

      //vector:中断向量号(0~24)

      //prio:优先级(1~3),禁止设置为0

      //STM8的优先级分为软件优先级和硬件优先级,软件优先级优先于硬件优先级。

      //硬件优先级由向量号确定,向量号越小,优先级越高。

      //软件优先级可以通过本函数设置。

      //STM8软件优先级设置可以分为4个等级(0~3),实际上可设置的就三个等级:1~3

      //优先级顺序:0《1《2《3,3的优先级最高,高优先级的中断可以打断低优先级的中断

      //多个中断同时发生:在软件优先级相同的情况下,由硬件优先级决定谁先响应。

      void ITC_Set(u8 vector,u8 priority)

      {

      if(priority==0)return; //不能设置为优先级0

      if(priority==2)priority=0; //优先级2:00B

      if(vector《4)

      {

      ITC-》ISPR1&=~(3《《vector*2); //清除原来的设置

      ITC-》ISPR1|=priority《《vector*2; //设置优先级

      }else if(vector《8)

      {

      ITC-》ISPR2&=~(3《《(vector-4)*2); //清除原来的设置

      ITC-》ISPR2|=priority《《(vector-4)*2; //设置优先级

      }else if(vector《12)

      {

      ITC-》ISPR3&=~(3《《(vector-8)*2); //清除原来的设置

      ITC-》ISPR3|=priority《《(vector-8)*2; //设置优先级

      }else if(vector《16)

      {

      ITC-》ISPR4&=~(3《《(vector-12)*2); //清除原来的设置

      ITC-》ISPR4|=priority《《(vector-12)*2;//设置优先级

      }else if(vector《20)

      {

      ITC-》ISPR5&=~(3《《(vector-16)*2); //清除原来的设置

      ITC-》ISPR5|=priority《《(vector-16)*2;//设置优先级

      }else if(vector《24)

      {

      ITC-》ISPR6&=~(3《《(vector-20)*2); //清除原来的设置

      ITC-》ISPR6|=priority《《(vector-20)*2;//设置优先级

      }else if(vector《28)

      {

      ITC-》ISPR7&=~(3《《(vector-24)*2); //清除原来的设置

      ITC-》ISPR7|=priority《《(vector-24)*2;//设置优先级

      }else if(vector《32)

      {

      ITC-》ISPR8&=~(3《《(vector-28)*2); //清除原来的设置

      ITC-》ISPR8|=priority《《(vector-28)*2;//设置优先级

      }

      }

      //外部中断配置函数

      //GPIO:0~5(对应GPIO_A~GPIO_E和TLI)

      //TRIM:0~3(即00B~11B)

      //00,下降沿和低电平触发

      //01,仅上升沿触发

      //10,仅下降沿触发

      //11,上升沿和下降沿触发

      void EXTI_Config(u8 GPIOx,u8 TRIM)

      {

      TRIM&=0X03; //取低2位有效

      if(GPIOx《4) //GPIOA~D

      {

      EXTI-》CR1&=~(3《《GPIOx*2);

      //清除原来的设置

      EXTI-》CR1|=TRIM《《GPIOx*2;

      //设置触发方式

      }else if(GPIOx==GPIO_E)

      //GPIOE

      {

      EXTI-》CR2&=~(3《《0);

      //清除原来的设置

      EXTI-》CR2|=TRIM;

      //设置触发方式

      }else if(GPIOx==GPIO_TLI)

      //TLI触发方式设置

      {

      TRIM&=0X01;

      //仅最低位有效。

      EXTI-》CR2&=~(1《《2);

      //清除原来的设置

      EXTI-》CR2|=TRIM《《2;

      //设置TLI触发方式

      }

      }

    • 发布于2018-07-07
    • 举报
    • 评论 0
    • 0
    • 0

  • 可以参照原子的中断程序设置
    • 发布于2018-07-16
    • 举报
    • 评论 0
    • 0
    • 0

  • 其实stm8的中断和stm32中断是一样的控制方式,可以参照stm32的中断原理来控制
    • 发布于2018-07-20
    • 举报
    • 评论 0
    • 0
    • 0

  • stm8和stm32的中断差异不大,主要是中断数较少,没有stm32功能这么齐全的中断事件检测。
    • 发布于2018-07-31
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

STM8单片机相关问题?