STM8L外部中断 为何 死循环 寄存器操作
STM8L 系列单片机是 ST公司推出的低功耗单片机,与STM8S系列相比功耗降低了很多,但内部结构也删减了很多,使用时一定要仔细阅读手册。 这是第一次使用STM8,实现功能不是很复杂就没想研究库函数,准备直接控制寄存器操作,没想到本人 因为中断问题纠结了大半天。
在外部中断中这一点很不同, STM8S自动清除外部中断,而STM8L是需要软件清除, 清除标志位的寄存器根据设置而不同,下面有说明。
下面以STM8L外部中断 PB1为例 说明外部中断 寄存器操作
设置外部中断有下面几步:
第一步、设置IO口为中断输入 通过设置 (PB_DDR |= 0X00; PB_CR1 |= 0X02; PB_CR2 |= 0X02;)
第二步、设置中断触发方式(00: Falling edge and low level;01: Rising edge only;10: Falling edge only;11: Rising and falling edge)
第三步、更改中断向量表 (stm8_interrupt_vector.c 文件中)
第四步、编写中断处理函数,记住在函数里面清除中断
第一步、设置IO口为中断输入
PB_DDR |= 0X00; // 输入
PB_CR1 |= 0X02; // 0000_0010
PB_CR2 |= 0X02; // 0000_0010 CR1与CR2结合确定为 上拉外部中断输入
第二步、设置中断触发方式 STM8L中 PB 与 PD 端口比较特殊可以有两种触发模式
EXTI_CONF= 0x00;
这两种触发模式通过寄存器 EXTI_CONF 进行设置
第一种方式 与A,C port一样通过下面两个寄存器设置触发模式 设置 寄存器EXTI_CONF[0]为0 ,表示Port B[3:0] 使用第一种方式(我在此命名为普通方式)
EXTI_CR1 寄存器设置 Port A, B, C and/or D external interrupts 的 3、2、1、0引脚
EXTI_CR2 寄存器设置 Port A, B, C and/or D external interrupts 的 7、6、5、4引脚
第二种方式 通过EXTI_CR3寄存器设置触发模式EXTI_CONF[0]为1 ,表示Port B[3:0] 使用第二种方式(我在此命名为特殊方式)
EXTI_CR3 寄存器的 [3:2] 位 设置 端口D 的触发模式
EXTI_CR3 寄存器的 [1:0] 位 设置 端口B 的触发模式
第三步、更改中断向量表
{0x82, KEY_Interrupt}, /* irq9 */
PB1普通模式中断向量号为9 ,其中 KEY_Interrupt 可以根据实际命名, 只要和后面写的中断函数名一致就可以。
为什么选择为9 看下面的图片就知道了。
第四步、编写中断处理函数
@far @interrupt void KEY_Interrupt(void)
{
LED1 = !LED1;
//EXTI_SR2 = 0x01; // 如果设置为 特殊模式 通过此寄存器 清除 中断标志位
EXTI_SR1 |=0x02; // 如果设置为 普通模式 通过此寄存器 清除 中断标志位
}
在这一步骤中有两点 说明:
1、如果中断执行函数不想在 stm8_interrupt_vector.c 文件中编写,需要在 stm8_interrupt_vector.c 文件中添加这样一个函数
@far @interrupt void KEY_Interrupt(void);
2、 EXTI_SR2 = 0x01; // 如果设置为 特殊模式 通过此寄存器 清除 中断标志位
EXTI_SR1 |=0x02; // 如果设置为 普通模式 通过此寄存器 清除 中断标志位
中断向量等级:
通过下面的第一个表格 可以知道 如果我们用普通中断模式 端口B1的中断 属于 EXTI1 (如果是PB2 属于EXTI2), 特殊模式 端口B的中断属于 EXTIB and EXTID,

知道这点 后我们结合手册中的中断向量 表就知道 我们应该在哪个位置写中断 入口函数名了。



希望可以对 大家有帮助 -------- ForeverLongo
STM8L外部中断 为何 死循环 寄存器操作的更多相关文章
- 十天学会单片机Day1点亮数码管(数码管、外部中断、定时器中断)
1.引脚定义 P3口各引脚第二功能定义 标号 引脚 第二功能 说明 P3.0 10 RXD 串行输入口 P3.1 11 TXD 串行输出口 P3.2 12 INT0(上划线) 外部中断0 P3.3 1 ...
- LPC1768外部中断与GPIO中断
LPC1768的外部中断严格来说只有四个,分别是EINT0,EINT1,EINT2,EINT3,技术手册上有如下说明 控制这四个外部中断靠以下寄存器 这三个寄存器的0 1 2 3位分别代表中断的0 1 ...
- 嵌入式单片机,ATmega328P,外部中断INT0,INT1,INT2,中断标志位介绍
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- STM32-NVIC中断管理实现[直接操作寄存器]
源:stm32 NVIC中断管理实现[直接操作寄存器] cortex-m3支持256个中端,其中包含了16个内核中断,240个外部中断.stm32只有84个中断,包括16个内核中断和68个可屏 ...
- stm32寄存器版学习笔记03 外部中断
stm32的每个I/O口都可以作为中断输入,要把I/O口设置为外部中断输入,必须将I/O口设置为上拉/下拉输入 或 浮空输入(但浮空的时候外部一定要带上拉或下拉电阻,否则可能导致 中断不停的触发),干 ...
- STM32基本GPIO操作:按键输入(扫描+外部中断)
(涉及专有名词较多,难免解释不到位,若有错误还请指出,谢谢!) 硬件连接图如下: 一.扫描 思路是在main函数中通过死循环来扫描端口电平状态检测,以此判断按键是否按下.实现较为简单. 1.初始化(注 ...
- (3)STM32使用HAL库操作外部中断——实战操作
有了上一篇的基础入门知识,使用Cube创建一个简单的外部中断就容易多了. 一.Cube配置 需求:使用PD10作为外部中断(下降沿触发)控制LED(PD12-PD14) 1.选型 STM32-F4-D ...
- (2)STM32使用HAL库操作外部中断——理论讲解
1.中断触发过程 对主程序压栈--把中断服务函数的地址写入到程序计数器(PC)--执行中断服务函数 2.中断向量表 中断服务函数的地址在STM32的手册上的中断向量表中(如下是一部分): 如上表所示, ...
- 向linux内核中添加外部中断驱动模块
本文主要介绍外部中断驱动模块的编写,包括:1.linux模块的框架及混杂设备的注册.卸载.操作函数集.2.中断的申请及释放.3.等待队列的使用.4.工作队列的使用.5.定时器的使用.6.向linux内 ...
随机推荐
- 【玩转Golang】reflect.DeepEqual
如果有两个map,内容都一样,只有顺序不同 m1:=map[,,}; m2:=map[,,}; 我们怎么判断二者是否一致呢? 如果你打算这么写: fmt.Println("m1==m2&qu ...
- rdlc报表 矩阵控件下的按组分页
场景: 使用rdlc开发报表,例如订单产品报表,显示多个订单,一个订单有动态生成的固定的多个产品组成,同时统计每个订单里多个产品数量总数. 数据库层面分析: 此报表属于交叉报表,例如5个订单,3个产品 ...
- [转] fitnesse中的Map处理
http://blog.csdn.net/doubeizhucele/article/details/42263887 fintesse会把!{}标记的变量视为HashTable对象,展现到页面上的将 ...
- eclipse中断点不生效
摘录自:http://blog.sina.com.cn/s/blog_496117520100kw6b.html Eclipse下Debug时弹出错误“Unable to install breakp ...
- spring核心之AOP学习总结一
一:springAOP前置通知.后置通知以及最终通知 前置通知就是在切入点前面执行方面体,后置就是在后面,最终就是返回之后. 下面以一个日志记录的案例介绍: 1:创建controller类 /** * ...
- mysql初始化时报错bin/mysqld: error while loading shared libraries: libnuma.so.1: cannot open shared object file: No such file or directory的处理
问题描述: 今天新安装了一个linux虚拟机,然后安装mysql 5.7.21,在进行初始化的时候,报错 bin/mysqld: error : cannot open shared object f ...
- mysql数据库中查看当前使用的数据库是哪个数据库?
环境描述: mysql版本:5.5.57-log 操作系统版本:Red Hat Enterprise Linux Server release 6.6 (Santiago) 需求说明: 查看当前使用的 ...
- 将文件导入到SQL server数据库表中的字段中
一.在要执行的sql server数据库a中执行如下脚本,创建存储过程sp_textcopy /* 将二进制文件导入.导出到数据库相应字段列中 */ CREATE PROCEDURE sp_textc ...
- ASP.NET用DataSet导出到Excel
//读取临时文件 GYYW.DA.Common.Base_SqlDataBase daBZDM = new GYYW.DA.Common.Base_SqlDataBase(); DataS ...
- Java显示指定类型的文件
文件作为存储数据的单元,会根据数据类型产生很多分类,也就是所谓的文件类型.在对数据文件进行操作时,常常需要根据不同的文件类型来作不同的处理.本实例实现的是读取文件夹指定类型的文件并显示到表格控件中.这 ...