一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

stm8s中断优先级程序的理解及设置方法

来源:http://www.elecfans.com/emb/xitong/20171118582064.html 发布时间:2017-11-20

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

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

  STM8没有专门的中断状态寄存器,所以只能通过刚进入中断就读取IDR来判断,不过在某些情况下,此种方法就不好用了,所以在设计的时候就要考虑清楚,是不是会冲突。最好把有冲突的中断放到不同的组。STM8的外部中断采用软件优先级+硬件优先级的控制方法,来控制优先级分组。软件优先级优先于硬件优先级。

  硬件优先级由向量号确定,向量号越小,优先级越高。STM8软件优先级设置可以分为4个等级(0~3),实际上可设置的就三个等级:1~3优先级顺序:0《1《2《3,3的优先级最高,高优先级的中断可以打断低优先级的中断

  多个中断同时发生:在软件优先级相同的情况下,由硬件优先级决定谁先响应。但是硬件优先级不可打断。也就是相同软件优先级的中断,硬件优先级低的中断在执行了。此时来一个硬件优先级高的中断是不可以打断低优先级的中断的。

  STM8还有个TLI外部中断,这个优先级可以打断软件优先级为3的中断,TLI的优先级不可设置。(基本就是最高级别了,除了RESET)

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

       STM8没有专门的中断状态寄存器,所以只能通过刚进入中断就读取IDR来判断,不过在某些情况下,此种方法就不好用了,所以在设计的时候就要考虑清楚,是不是会冲突。最好把有冲突的中断放到不同的组。

  STM8的外部中断采用软件优先级+硬件优先级的控制方法,来控制优先级分组。软件优先级优先于硬件优先级。硬件优先级由向量号确定,向量号越小,优先级越高如下面图中断映射,中断向量表。

中断映射-电子元器件采购网

  STM8软件优先级设置可以分为4个等级(0~3),实际上可设置的就三个等级:1~3。优先级顺序:0《1《2《3,3的优先级最高,高优先级的中断可以打断低优先级的中断

  多个中断同时发生:在软件优先级相同的情况下,由硬件优先级决定谁先响应。但是硬件优先级不可打断。也就是相同软件优先级的中断,硬件优先级低的中断在执行了。此时来一个硬件优先级高的中断是不可以打断低优先级的中断的。STM8还有个TLI外部中断,这个优先级可以打断软件优先级为3的中断,TLI的优先级不可设置。(基本就是最高级别了,除了RESET)。

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触发方式

  }

  }

了解更多相关设计技术信息,请点击华强旗舰电子圈(http://www.hqbuy.com/dzq/dzqsy.html)!

声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: