基于STM8的外部中断实验
STM8L学习笔记:外部中断
External interrupt control register 1 (EXTI_CR1)
地址偏移量:0x00 复位值:0x00
7
6
5
4
3
2
1
0
RW
RW
RW
RW
RW
RW
RW
RW
P3IS[1:0]
P2IS[1:0]
P1IS[1:0]
P0IS[1:0]
每个端口的 bit3
每个端口的 bit2
每个端口的 bit1
P5IS[1:0]
P4IS[1:0]
每个端口的 bit7
每个端口的 bit6
每个端口的 bit5
每个端口的 bit4
的外部中断触发方式 的外部中断触发方式 的外部中断触发方式 的外部中断触发方式
设置位。(当 CCR 寄存 设置位。(当 CCR 寄存 设置位。(当 CCR 寄存 设置位。(当 CCR 寄存
I1 和 I0 都 被 置 1 时 I1 和 I0 都 被 置 1 时 都 被 置 1 时 (level 3-- 都 被 置 1 时 (level 3--
(level 3-- 软 件 优 先 级 (level 3--软 件 优 先 级 软件优先级使能,CCR 软件优先级使能,CCR
使能,CCR 寄存器复 使能,CCR 寄存器复 寄存器复位值两位都 寄存器复位值两位都
位值两位都是 1),这 位值两位都是 1),这 是 1),这些位只能被 是 1),这些位只能被
些位只能被写)。
些位只能被写)
写)
写)
需要注意的是,
需要注意的是,
需要注意的是,
需要注意的是,
在 Port F[3:0] 与 Port 在 Port E[3:0] 与 Port 在 Port D[3:0] 与 Port 在 Port B[3:0] 与 Port
STM8S单片机外部中断唤醒
STM8S单片机外部中断唤醒
一、STM8S 外部中断进行唤醒
先了解一下STM8S的中断资源
再看看STM8S的中断管理。
STM8S采用软件优先级和硬件优先级来控制一个中断的响应,先比较软件优先级只有当软件优先级一致时才会比较硬件优先级,由于硬件优先级具有唯一性,这样便保证了某一时刻定会只有一个中断被处理。
要使用外部中断,只需简单的配置一下EXTI_CR1寄存器,并将主程序main的软件优先级置为0即可。
默认情况下自复位开始,主程序的软件优先级被设置为3,处于最高软件优先级,仅有TRAP,TLI,RESET中断能够打断,其余的中断都是不会被响应的。
为了防止中断过程中被别的优先级高的中断所打断,可以将当前优先级置为最高3级。
代码如下:
main.c代码
//EXTI_CR1|=EXTI_CR1_PBIS_R;//PB5TRINT高电平触发
EXTI_CR1|=EXTI_CR1_PCIS_R;//PC3上升沿触发
//#defineEXTI_CR1_PCIS_R(1《《4)
RIM;//开全局中断,必须要有这句,否则只会响应不可屏蔽中断
//#defineHALT_asm(“halt”)
//#defineRIM_asm(“rim”)
//#defineSIM_asm(“sim”)
GPIO_Init(GPIOC,TRINT,GPIO_MODE_IN_PU_IT);//使能对应的IO口中断
stm8s_it.c代码
//收发中断(PC3)BJ8F101。
燕山大学仪表专业stm8实习之根据按键中断改变时钟周期
根据按键中断《GPIOC,(GPIO_PIN_1)被设为外部中断设置。
按键改变时钟周期注意要将按键TLI和C1相连?****************************************************************************** *//* Includes ------------------------------------------------------------------*/#include "stm8s.h"#include "stm8s_gpio.h"#include "stm8s_clk.h"#include "stm8s_exti.h"#define BUTTON_PORT (GPIOC)#define BUTTON1_PIN (GPIO_PIN_1)#define BUTTON2_PIN (GPIO_PIN_2)#define BUTTON3_PIN (GPIO_PIN_3)#define LEDS_PORT (GPIOD)#define LED1_PIN (GPIO_PIN_0)#define LED2_PIN (GPIO_PIN_2)#define LED3_PIN (GPIO_PIN_3)bool ButtonPressed = FALSE;ErrorStatus status = FALSE;//设置外部中断为C端口,该函数为中断响应函数@far @interrupt void EXTI_PORTC_IRQHandler (void){unsigned char i,j,k;i=GPIO_ReadInputPin (GPIOC,BUTTON1_PIN);j=GPIO_ReadInputPin (GPIOC,BUTTON2_PIN);k=GPIO_ReadInputPin (GPIOC,BUTTON3_PIN);if(i==0){CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1);}if(j==0){CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV2);}if(k==0)CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV4);}}void Delay(u16 nCount){/* Decrement nCount value */while (nCount != 0){nCount--;}}void main(void){/* Initialization of I/O in Input Mode with Interrupt */GPIO_Init(BUTTON_PORT, (BUTTON1_PIN|BUTTON2_PIN|BUTTON3_PIN), GPIO_MODE_IN_FL_IT);GPIO_Init(GPIOD, (LED1_PIN | LED2_PIN | LED3_PIN ), GPIO_MODE_OUT_PP_LOW_FAST );/* Initialization of the Interrupt sensitivity *///EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONL Y);/* Enable general interrupts */enableInterrupts();CLK_DeInit();CLK_CCOConfig(CLK_OUTPUT_CPU);CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, DISABLE);while (1){int i=0;GPIO_WriteReverse(GPIOD, LED1_PIN | LED2_PIN | LED3_PIN);for ( i = 0; i < 2; i++){Delay((u16)60000);}}}#ifdef USE_FULL_ASSERT/*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval* None*/void assert_failed(u8* file, u32 line){/* User can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* Infinite loop */while (1){}}#endif/*** @}*//******************* (C) COPYRIGHT 2009 STMicroelectronics *****END OF FILE****/。
单片机实验之外部中断应用实验
一、实验目的1、掌握中断系统外部中断源的使用方法。
2、掌握延时程序的编程及使用方法。
3、掌握Proteus软件与Keil软件的使用方法。
4、掌握单片机系统的硬件和软件设计方法。
二、设计要求1、用Proteus软件画出电路原理图,在单片机的P1.0口线上接按键K0 ,作为外部中断源0使用,用于开启波形,在单片机的 P1.1口线上接按键K1,作为外部中断源1使用,用于关闭波形。
2、在单片机的P1.2口线上产生周期50mS的连续方波,在P1.2口线上接示波器观察波形。
三、电路原理图六、实验总结通过本实验能够准确安排各种类型的中断服务程序入口,中断源提出中断申请后,却执行到相应的中断服务程序。
弄清楚了中断服务程序与子程序的共同点和不同点。
七、思考题1、在P1.2口线上产生周期为100mS,占空比为2:5的连续矩形波,要求只采用按键K0来控制其开启和关闭。
答:程序见程序清单。
四、实验程序流程框图和程序清单。
1、在单片机的P1.2口线上产生周期50mS的连续方波。
P1.0口线上接按键K0 ,作为外部中断源0使用,用于开启波形, P1.1口线上接按键K1,作为外部中断源1使用,用于关闭波形。
汇编程序:ORG 0000H START: LJMP MAINORG 0003HLJMP EXT0ORG 000BHLJMP TTCOORG 0013HLJMP EXT1ORG 0100HMAIN: MOV TMOD, #01HMOV TCON, #01HMOV IE, #87HMOV TH0, #9EHMOV TL0, #58HSETB PX1HERE: LJMP HEREEXT0: SETB TR0RETIEXT1: CLR TR0RETITTCO: CPL P1.2MOV TH0, #9EHMOV TL0, #58HRETIENDC语言程序:#include<reg51.h>sbit P12=P1^2;main(){TMOD=0X01;EA=1;EX0=1;EX1=1;ET0=1;PX1=1;TCON=0X01;TH0=0X9E;TL0=0X58;while(1);}void EXT0() interrupt 0{ TR0=1;}void EXT1() interrupt 2{ TR0=0;}void TTC0() interrupt 1{ P12=!P12; TH0=0X9E;TL0=0X58;}2、在P1.2口线上产生周期为100mS,占空比为2:5的连续矩形波,要求只采用按键K0来控制其开启和关闭。
外部中断的实验报告
一、实验目的1. 理解外部中断的概念和作用。
2. 掌握外部中断的编程方法。
3. 熟悉中断处理程序的设计和调试。
二、实验原理外部中断是指由外部设备或信号产生的中断,用于处理与CPU无关的事件。
在微机系统中,外部中断通常用于处理输入/输出设备的中断请求。
外部中断分为可屏蔽中断和不可屏蔽中断两种类型。
三、实验环境1. 开发平台:Keil uVision 52. 微控制器:STM32F103C8T63. 外部设备:按钮、LED灯4. 连接方式:通过GPIO引脚连接四、实验步骤1. 设计外部中断电路(1)将按钮连接到STM32F103C8T6的GPIO引脚,例如PA0引脚。
(2)将LED灯连接到STM32F103C8T6的另一个GPIO引脚,例如PB0引脚。
2. 编写外部中断初始化程序(1)在Keil uVision 5中创建一个新项目,并添加STM32F103C8T6的起始代码。
(2)在主函数中编写初始化程序,包括以下步骤:a. 配置PA0引脚为输入模式,设置为浮空输入。
b. 配置PB0引脚为输出模式,用于控制LED灯。
c. 使能中断,设置中断优先级。
d. 配置NVIC(嵌套向量中断控制器)以允许外部中断。
3. 编写外部中断处理程序(1)在项目中添加一个新的C文件,用于编写外部中断处理程序。
(2)编写外部中断处理函数,当按钮按下时,触发中断,控制LED灯闪烁。
a. 初始化外部中断处理函数,设置中断优先级和中断触发方式。
b. 在外部中断处理函数中,编写LED灯控制代码,实现LED灯闪烁。
4. 编译并下载程序(1)编译项目,生成.hex文件。
(2)将.hex文件下载到STM32F103C8T6开发板上。
5. 测试实验结果(1)将按钮按下,观察LED灯是否闪烁。
(2)松开按钮,LED灯停止闪烁。
五、实验结果与分析1. 实验结果实验过程中,当按钮按下时,LED灯闪烁;松开按钮后,LED灯停止闪烁。
实验结果表明,外部中断能够正确地处理外部设备的中断请求,并控制LED灯的亮灭。
关于STM8S外部中断问题
关于STM8S 外部中断问题!怎么识别是具体哪个引脚引起的中断!![复制链接]Junsea电梯直达 1楼发表于 2010-12-11 10:41:48 | 只看该作者 举个例子,在PC 口有的PC0和PC1两个信号都要求能够中断。
而STM8S 对应PC 口只有一个 中断向量,我要怎么才能够知道具体是有PC0引起的中断呢?还是PC1引起的中断呢?我也看了坛子里面的一些相关的帖子,大致有这么一种方法,进入中断后读取IO 口的电平状态 以判断是哪个IO 口引起的中断。
但是我有个疑问,假定设置为下降沿触发中断。
PC0先出现下降沿,系统进入中断, 如果在这个时间段,PC1也出现下降沿,在中断里面再读PC0和PC1电平状态,仍然不能够判别是由PC0引起的中断,还是由PC1触发的中断啊!!回复举报论坛公益广告:使用360产品将会被封锁ID 。
Junsea2楼 楼主| 发表于 2010-12-11 11:39:22 | 只看该作者顶一下。
回复举报公益广告:发表新主题时,务必起一个能说明帖子内bigZ 3楼发表于 2010-12-11 13:09:03 | 只看该作者不建议这样用最好一个PC ,一个PD ,每个口只开放一个中断回复举报公益广告:本论坛不得使用、宣传Q群Junsea4楼楼主|发表于2010-12-11 13:28:46 |只看该作者当然能够这样最好,只是现在的项目的硬件已经做好了,之前没有用中断,用的查询,发现有时候可能会出现跟不上的情况!所以想采用中断来做!!回复举报公益广告:发表招聘帖子需要缴费,有需要snoopyzz5楼发表于2010-12-11 13:34:21 |只看该作者不要用else或switch不就行了if(PC0==0){}if(PC1==0){}...回复举报公益广告:广告只能发在本Junsea6楼 楼主| 发表于 2010-12-11 13:45:51 | 只看该作者楼上,程序当然可以这么写,只是我说的那种情况:PC0先出现下降沿,系统进入中断,在执行if (PC1==0)之前,PC1也出现下降沿, 那么if (PC0==0){……}能够运行if (PC1==0){……}也能够运行并没有达到只执行i f (PC0==0){……}的目的啊?回复举报本论坛禁止与网站产品有冲突的广bigZ7楼 发表于 2010-12-11 17:52:54 | 只看该作者这种情况下为什么非要只执行一个呢既然同是发现都为0,同时执行不就行了回复举报snoopyzz8楼 发表于 2010-12-11 19:28:19 | 只看该作者 {char status = PC_IDR;if( status&BIT(0) ){//PC0}if( status&BIT(1) ){//PC1}}如果两个都能进入....说明基本同时(<中断响应+中断跳转+局部变量赋值时间),理所当然全部应该执行回复举报Junsea9楼 楼主|发表于 2010-12-11 23:14:24 | 只看该作者如楼上所说,是可以两个都响应。
单片机外部中断实训报告
一、实训目的1. 理解单片机外部中断的概念和作用。
2. 掌握单片机外部中断的配置方法。
3. 学会编写外部中断服务程序。
4. 通过实际操作,提高单片机编程和调试能力。
二、实训内容1. 单片机外部中断原理2. 单片机外部中断配置3. 外部中断服务程序编写4. 实验验证与调试三、实训环境1. 单片机开发板:选用STC89C52单片机。
2. 仿真软件:Proteus。
3. 实验工具:示波器、电源、连接线等。
四、实训步骤1. 理解单片机外部中断原理外部中断是单片机中断系统中的一种,用于响应外部事件。
当外部事件发生时,单片机会暂停当前程序,转去执行外部中断服务程序。
外部中断有多个中断源,如INT0、INT1等。
2. 单片机外部中断配置(1)设置外部中断触发方式:根据需要选择上升沿触发、下降沿触发或双边沿触发。
(2)设置外部中断优先级:根据实际需求设置中断优先级。
(3)设置外部中断使能:通过设置IE寄存器使能外部中断。
3. 外部中断服务程序编写编写外部中断服务程序,用于处理外部中断事件。
在服务程序中,完成相关处理逻辑,如记录外部事件发生次数、控制LED灯闪烁等。
4. 实验验证与调试(1)搭建实验电路:将单片机开发板与外部设备(如按钮)连接,设置好外部中断配置。
(2)在Proteus中搭建仿真电路,编写代码。
(3)下载代码到单片机开发板,观察实验现象。
(4)根据实验现象,调试程序,确保外部中断功能正常。
五、实验结果与分析1. 实验现象:按下外部按钮,单片机进入外部中断服务程序,控制LED灯闪烁。
2. 分析:通过设置外部中断触发方式、优先级和使能,成功实现外部中断功能。
在服务程序中,完成相关处理逻辑,达到预期效果。
六、实训总结1. 通过本次实训,掌握了单片机外部中断的配置方法,学会了编写外部中断服务程序。
2. 熟悉了外部中断在实际应用中的重要作用,提高了单片机编程和调试能力。
3. 在实训过程中,遇到了一些问题,如外部中断响应不及时、LED灯闪烁不稳定等。
stm8中断使用
stm8中断使用工程应用分析最近的一个项目中用到了stm8s,一个比较重要的知识点就是中断的使用。
暂且称stm8s这边做从机,要进行双机通信。
stm8s作“从机”接收数据,也可以发送数据给主机。
自定了一个通信协议,一个CLK线,一个DAT线,CLK线总是由主机边控制。
类似于I2C通信,CLK为高时,DAT由高到底表示开始。
CLK 位高时,DAT由低到高表示结束。
CLK为高电平时,DAT线数据为保持,为低电平时允许数据跳变。
实际的时序图如下:我这边接收数据其实有很多种方法,比如:1.可以在程序主循环while(1)中每一次周期监视检测电平的变化,来达到判断信号的目的2.采用延时,很多常用的通信会采用,比如我们接收数据,在高电平读数据,传送16位数据,得到第一个CLK高电平之后,可以直接延时固定间隔时间读,就可以得到下一个高电平时DAT数据,以此类推3.采用中断,不依赖于时间,完全依赖于硬件检测电平变化4.采用中断加延时的方法评价:1的方法,对时间要求比较高,因为有传输速度的要求,电平变化本来比较快,应尽可能缩短主循环一次执行时间,后续添加其他功能会有影响2的方法,对时间要求比较高,双机通信,一对一尚可,如果一对很多,不稳定,待验证3的方法,完全依赖于自身的硬件,比较稳定4的方法,依然存在2的缺点,情况类似最终实现方法DAT触发条件为上升沿和下降沿,CLK触发条件为上升沿DAT触发,检测DAT电平,只有开始和结束符合条件,所以可以用这个来判断开始位和结束位。
CLK上升沿触发中断,读DAT,可以保证肯定是在高电平时读的数据。
俩个中断同时开启,最终的操作还是简单的,参考代码如下:上面的firstStepin++这种做法如果一次出错,就乱了,还需要改进。
-------------------------------------------------------------------------分割线---------------------------------------------------------------------------------stm8的中断具体使用方法和常规的中断使用类似,首先要关闭全局中断,然后初始化中断用到的GPIO口,设置输入输出,是否可以中断,然后设置触发条件,用到多于一个中断,就要设置优先级。
STM8教程实验4-外部中断+按键
例程四按键中断其实在上个例程就说那个中断的,但不是重点说,例程四就重点说下这个中断的设置,主要是针对外部中断,对于其他的中断,到时在相应的模块里面会说的。
在STM8S207RB这个芯片里面有很多IO口都可以触发中断的。
主要是GPIO_A,GPIO_B,GPIO_C,GPIO_D,GPIO_E,这五组IO口都可以触发外部中断,所以大家以后要设计电路的话,必须先要查看先对应的文档来看下,了解清楚芯片的资料才好设置。
其实大家学会调用库里面的函数的话,这些初始化相当来说就很容易的了。
以上外部中断的设置来自“STM8寄存器.pdf”文档第74页下面看下电路图先吧,只要当你清楚电路具体的链接,才能完成相对应的初始化。
用到内部的资源"stm8s_clk.h""stm8s_exti.h""stm8s_gpio.h""stm8s_uart1.h""stm8s_clk.c""stm8s_exti.c""stm8s_gpio.c""stm8s_uart1.c"看完了电路图,照样是先看主函数在主函数里面最重要的是Buttom_Init();的初始化,其他的初始话上前几个例程已经有介绍过,相信大家也很清楚了。
下面重点讲下Buttom_Init()。
函数原型:第一条语句是设置Buttom1和Buttom2相对应的IO为上拉输入;第二条语句是设置GPIOD,也即是按键,为下降沿触发中断。
__enable_interrupt();这条语句是开总中断,在上一个例程里面说过了,以后凡是有触发中断的都要用上这条语句,所以说这条语句很重要的。
下面讲下外部中断常用的几个函数,这些函数都是库有的,可以直接调用的。
这个函数是设置哪组GPIO口为哪种方式触发中断的,触发方式有以下几种下降沿和顶电平触发,只有上升沿触发,只有下降沿触发,上升沿和下降沿触发这4种。
STM8S单片机外部中断唤醒
STM8S单片机外部中断唤醒
STM8S单片机外部中断唤醒
一、STM8S 外部中断进行唤醒
先了解一下STM8S的中断资源
再看看STM8S的中断管理。
STM8S采用软件优先级和硬件优先级来控制一个中断的响应,先比较软件优先级只有当软件优先级一致时才会比较硬件优先级,由于硬件优先级具有唯一性,这样便保证了某一时刻定会只有一个中断被处理。
要使用外部中断,只需简单的配置一下EXTI_CR1寄存器,并将主程序main的软件优先级置为0即可。
默认情况下自复位开始,主程序的软件优先级被设置为3,处于最高软件优先级,仅有TRAP,TLI,RESET中断能够打断,其余的中断都是不会被响应的。
为了防止中断过程中被别的优先级高的中断所打断,可以将当前优先级置为最高3级。
代码如下:
main.c代码
//EXTI_CR1|=EXTI_CR1_PBIS_R;//PB5TRINT高电平触发
EXTI_CR1|=EXTI_CR1_PCIS_R;//PC3上升沿触发
//#defineEXTI_CR1_PCIS_R(1《《4)
RIM;//开全局中断,必须要有这句,否则只会响应不可屏蔽中断//#defineHALT_asm(“halt”)
//#defineRIM_asm(“rim”)
//#defineSIM_asm(“sim”)
GPIO_Init(GPIOC,TRINT,GPIO_MODE_IN_PU_IT);//使能对应的IO口中断
stm8s_it.c代码
//收发中断(PC3)BJ8F101。
外中断实验报告
外中断实验报告1. 实验目的本实验的目的是通过外中断的实验,加深对中断概念的理解,并掌握在单片机中使用外中断的方法和技巧。
2. 实验原理外中断是单片机系统中常用的一种中断方式。
当外部输入信号满足一定条件时,可以触发中断请求,从而打断当前正在执行的程序,转而执行中断服务程序。
外中断可以有效地处理实时性要求较高的任务。
3. 实验材料和器件本次实验所需材料和器件如下: - 单片机开发板 - 电脑 - 连接线4. 实验步骤4.1 准备工作首先,将单片机开发板与电脑通过连接线连接好,确保通信正常。
4.2 硬件连接将外部输入信号源连接至单片机的外部中断引脚,确保输入信号与单片机能够正常连接。
4.3 软件编程在单片机开发板上,选择合适的编程软件进行编程。
根据单片机的型号和开发板的特点,选择相应的编程语言进行编写。
4.4 编写中断服务程序根据实验要求,编写一个中断服务程序。
该程序在接收到外部中断请求时,能够对请求进行响应,并执行相应的操作。
4.5 编译和下载编译程序,生成可执行文件,并将该文件下载到单片机开发板上。
4.6 实验操作打开外部输入信号源,触发外部中断请求。
观察单片机开发板的输出,验证中断服务程序是否正确执行。
5. 实验结果与分析根据实验操作,我们成功触发了外部中断请求,并且中断服务程序正确执行。
这表明我们的实验设计和实施都是成功的。
6. 实验总结通过本次实验,我们深入了解了外中断的概念和原理,并通过实际操作掌握了外中断的使用方法和技巧。
外中断在单片机系统中具有广泛的应用场景,通过合理利用外中断,能够提高单片机系统的实时性能。
7. 实验注意事项•在进行硬件连接时,应确保信号连接正确,避免因连接错误导致中断请求无法触发。
•在编写中断服务程序时,应注意处理中断请求的时序和优先级,确保程序的正确性和可靠性。
•在实验过程中,应注意保护实验设备和材料,避免损坏或丢失。
8. 参考资料[1] 单片机原理与应用教程 [2] 51单片机外部中断原理及应用。
stm8s外部中断
stm8s外部中断
stm8s外部中断
stm8s外部中断相关的寄存器除了io的⼏个寄存器之外,还有就是EXTI_CR1,EXTI_CR2寄存器。
这⼏要注意,io的CR2寄存器的作⼏是开关中断。
另外,stm8s系列外部中断没有标志位。
以PC1下降沿触发为例,配置如下:
asm("sim");//关总中断
EXTI_CR1_PCIS = 2;//仅下降沿触发
PC_DDR_DDR1 = 0;//io⼏向:输⼏
PC_CR1_C11=0;//因为DDR为0,所以CR1为0表⼏浮空输⼏模式
PC_CR2_C21 = 1;//1:使能外部中断,0:关闭外部中断
asm("rim");//开总中断
说明:EXTI_CR1_PCIS可以选择0——3,含义如下图所⼏:
iar中断函数写法如下:
/* Defines an interrupt handler for EXTI2 vector. */
#pragma vector=7
__interrupt void EXTI2_IRQHandler(void)
{
}
中断函数我并没有写内容,说明⼏点:iar的中断向量号⼏stm8s 参考⼏册的中断向量号⼏2,所以⼏册⼏PC的终端向量号为5,此处为7。
IAR FOR STM8例程
IAR+STM8——EXTI外部中断控制寄存器2013-03-21 23:23:15| 分类:STM8|举报|字号订阅这块三合一的开发板上有且只有一个按键,没办法,就拿这唯一的按键来用吧。
吸取前面UART3的教训,先看开发板的原理图吧。
这个按键被接到了STM8S207SB的PD7上,已做了上拉处理。
为了简单明了,还是点LED1吧。
按一下LED1亮,再按一下LED1灭。
好了,写程序吧。
#i nclude <iostm8s207sb.h>#define LED1_FLASH PD_ODR_ODR3 = !PD_ODR_ODR3 // 开发板上的LED1接在PD3上void GPIO_init(void){PD_DDR = 0x08; // 配置PD端口的方向寄存器PD3输出PD_CR1 = 0x08; // 设置PD3为推挽输出PD_CR2 = 0x80; // 使能PD7外部中断}void EXTI_init(void){EXTI_CR1 = 0x80; // PD口下降沿触发中断}#pragma vector=0x02 // 这里很关键!看下面说明。
__interrupt void EXTI_PD7_TLI(void){LED1_FLASH;}void init_devices(void){asm("sim"); // 关全局中断GPIO_init();EXTI_init();asm("rim"); // 开全局中断}void main( void ){init_devices();// 主循环里没有程序需要执行while(1);}这里着重要说明的一点是PD7的外部中断程序。
看了一下芯片手册,PD口外部中断EXTI3的中断向量号是6,想当然,又是想当然,按IAR的规矩中断向量要加2,就这样写#pragma vector=0x08,结果就是按下按键,程序没响应了,一直在中断里不出来。
STM8教程-第十章 STM8S207 外部输入中断及其应用实例
STM8教程-第十章 STM8S207 外部输入中断及其应用实例第十章 STM8S207 外部输入中断及其应用实例这一章内容和第九章内容有很大关联,前面章节已经对 TLI 外部不可屏蔽中断有过详细说明,所以这一章相对来说比较简单10.1 STM8S207 外部可屏蔽中断这一节,我们将向大家介绍如何使用 STM8 的外部输入中断。
通过前面的学习,我们掌握了 STM8 的 IO 口操作以及设计到的串口中断。
这节我们将介绍作为外部中断输入口,STM8 需要做的一些设置10.2 STM8 外部中断简介STM8 的 IO 口在之前已经有详细的介绍,而中断也在串口章节中做过介绍。
我们这节是将这两者结合起来,实现外部中断输入。
STM8 的大部分 IO 口可以作为中断输入,这点很好用。
具体的 IO 口有 PA,PB,PC,PD,PE要把 IO 口作为外部中断输入,有以下步骤:1)初始化 IO 口作为输入中断,其中有悬浮和上拉,设置 CR1 和 CR2 寄存器 2 )设置中断产生条件上升沿还是下降沿或者其它类型,设置EXTI_CR1,EXTI_CR23)在 main 函数中开全局中断 asm(\ 4)编写中断服务程序注意的是,外部中断是每个端口分配一个中断向量号,例如 PA 口只分配了 3 这个中断向量号,也就是说 8 个 IO 口共用一个中断向量号,我们可以通过 IDR 寄存器读出对应的 IO 口引脚值来判断到底是那个产生的中断,这在初始化了多个IO 口的必须使用的。
更为要注意的是 PD7 是一个特别的外部中断输入,看数据手册可以知道 PD7 后缀有 TLI,这个是拥有独立的中断向量号,为 0下面我们将逐步讲解与外部中断有关的寄存器 1)CR1,CR2这两个寄存器相信大家都很熟悉了,我们前面与 IO 口有关的操作都要到这两个寄存器,之前我们设置的一般都是推挽式输出以及上拉式输入在这里我们设置成中断上拉输入,因为我们的硬件上没有外接上拉,需要内部上拉,设置对应位的寄存器值是 CR1 = 1 以及 CR2 = 0 2)EXTI_CR1我们使用的是 D 口,所以只需要设置与 D 口有关的位,EXTI_CR1 中的第 6、7 位是设置 PD 口的中断方式。
8位单片机使用外部中断的编程思路
8位单片机使用外部中断的编程思路好家伙,今天咱们来聊聊8位单片机使用外部中断的编程思路。
你别看单片机小,它可是有大能耐的,尤其是它的外部中断功能,真的是让人眼前一亮。
有些朋友可能对“中断”这个词有点模糊,没关系,咱们慢慢来捋。
简单来说,中断就是一种机制,能让单片机从当前的任务中“跳出来”,去处理一些更紧急或者重要的事情。
这就像是你正在忙着吃饭,突然电话响了,你立马放下筷子去接电话,然后再回去继续吃。
好吧,别光想吃饭,咱们讲重点。
外部中断呢,就是让单片机能够响应外部设备发来的“打扰”。
你想啊,单片机平时埋头苦干,做着各种计算、控制,突然某个外部信号来了,比如按下了一个按钮,或者某个传感器探测到了变化,单片机就得立马暂停当前的任务,去处理这个外部信号,这样的功能简直太牛了,是不是有点像手机在你专心工作时,突然一个推送消息就打断你。
你可能会问了,外部中断到底怎么设置?咋才能让单片机“听懂”外部的信号呢?别急,咱一步一步来。
你得知道,外部中断并不是单片机默认开启的功能。
就像你在使用智能手机时,很多功能需要你去开启一样,单片机也需要通过编程,告诉它什么时候要“听”外部信号。
所以,在程序中,你要先设定外部中断的引脚和相关的参数,确保外部信号能传递给单片机。
这样,单片机就能像一位忠实的卫士一样,随时待命。
你要做的就是配置中断触发的方式。
你别看这一步好像很简单,但它可关系到你的程序能不能正常响应外部事件。
有时候你希望外部信号的变化一次就触发中断,有时候你希望它反复触发,这时候就得配置触发方式了。
一般来说,外部中断的触发方式分为上升沿触发、下降沿触发和双沿触发,这些方式就像开关一样,控制着单片机什么时候需要打断它当前的工作。
好,配置好了外部中断,接下来就是写中断服务程序了。
听起来是不是有点复杂?别怕,编程嘛,思路清晰就行。
中断服务程序其实就是你告诉单片机,遇到外部信号的时候,要做些什么。
举个例子,假设你有一个按钮,每次按下去时,单片机会执行一个任务,比如打开一个LED灯,那你就需要在中断服务程序里写上“点亮LED”的指令。
外部中断实验总结
外部中断实验总结外部中断实验总结一、实验目的本次实验的目的是了解外部中断的原理和应用,并通过实验掌握外部中断的使用方法。
二、实验原理外部中断是指通过外部触发器触发的中断,常见的外部触发器有按键、传感器等。
当外部触发器触发后,会发送一个中断信号到微控制器,微控制器根据中断信号进行相应的中断处理。
外部中断的使用步骤如下:1. 设置外部中断控制寄存器的相关位,启用外部中断功能;2. 设置外部中断触发条件,可以设置为下降沿触发、上升沿触发或边沿触发;3. 设置中断服务程序,中断服务程序是处理外部中断的主要功能代码,一般在该函数中执行相应的操作;4. 在主函数中开启总中断或者特定中断;5. 当外部中断触发时,中断服务程序将被自动调用执行;6. 中断服务程序执行完后,程序将恢复到中断之前的状态继续执行。
三、实验步骤与结果本次实验使用STM32F103C8T6开发板来进行外部中断的实验。
主要步骤如下:1. 搭建电路:将一个按键与STM32F103C8T6的外部中断引脚相连,将按键的另一端与地相连。
确保按键按下时,外部中断引脚与地相连,触发外部中断。
2. 配置GPIO:配置外部中断引脚与GPIO的对应关系,设置为输入模式。
3. 配置中断线:配置外部中断所对应的中断线,使其能够响应外部中断。
4. 配置中断触发方式:配置外部中断触发的方式,例如下降沿触发。
5. 编写中断服务程序:编写中断服务程序,按下按键时,LED 灯亮起;释放按键时,LED灯熄灭。
6. 开启中断:在主函数中开启总中断。
7. 通过Keil等开发工具进行编译和下载。
8. 按下按键,触发外部中断,LED灯亮起;释放按键,触发外部中断,LED灯熄灭。
四、实验总结通过本次实验,我对外部中断有了更深入的了解。
外部中断是在特定条件触发时,通过外部触发器向微控制器发送中断信号,微控制器根据中断信号进行相应的中断处理。
在实验过程中,我们需要配置外部中断的相关寄存器、设置中断触发方式、编写中断服务程序等。
STM8的C语言编程(7)--16位定时器的中断应用
STM8的C语言编程(7)--16位定时器的中断应用在STM8中,除了有8位的定时器外,还有16位的定时器。
今天进行的实验就是针对16位定时器2来进行的。
除了计数单元为16位的,其它设置与前面8位的定时器基本一样。
下面的程序也是采样中断方式,由定时器2的中断服务程序来驱动LED的闪烁。
具体的程序代码如下,其它注意点见上一篇,另外要注意别忘了修改相应的中断向量。
// 程序描述:通过初始化定时器2,以中断方式驱动LED闪烁// LED接在MCU的GPIO的PD3上#include "STM8S207C_S.h"main(){// 首先初始化GPIOPD_DDR = 0x08;PD_CR1 = 0x08; // 将PD3设置成推挽输出PD_CR2 = 0x00;// 然后初始化定时器4TIM2_IER = 0x00; // 禁止中断TIM2_EGR = 0x01; // 允许产生更新事件TIM2_PSCR = 0x01; // 计数器时钟=主时钟/128=2MHZ/2// 相当于计数器周期为1uS// 设定重装载时的寄存器值// 注意必须保证先写入高8位,再写入低8位TIM2_ARRH = 0xEA; // 设定重装载时的寄存器的高8位TIM2_ARRL = 0x60;TIM2_CNTRH = 0xEA; // 设定计数器的初值TIM2_CNTRL = 0x60;// 定时周期=1*60000=60000uS=60msTIM2_CR1 = 0x01; // b0 = 1,允许计数器工作// b1 = 0,允许更新// 设置控制器,启动定时器TIM2_IER = 0x01; // 允许更新中断_asm("rim"); // 允许CPU全局中断while(1) // 进入无限循环{}}// 函数功能:定时器4的更新中断服务程序// 输入参数:无// 输出参数:无// 返回值:无@far @interrupt void TIM2_UPD_IRQHandler (void) {TIM2_SR1 = 0x00; // 清除更新标志PD_ODR = PD_ODR ^ 0x08; // LED驱动信号取反//LED闪烁频率=2MHZ/2/60000/2=8.3 }。
这一节,我们将向大家介绍如何使用 STM8 的外部输入中断
我们使用的是 D 口,所以只需要设置与 D 口有关的位,EXTI_CR1 中的第 6、7 位是设置 PD 口的中断方式。如下图所示:
我们的实验是设置为仅下降沿触发,所以在我们只需要设置为 EXTI_CR1 = 0x80 就可以了。
下面是软件代码的编写
#include "iostm8s207rb.h" #define LED1_FLASH PD_ODR_ODR0 #define LED2_FLASH PD_ODR_ODR1 #define LED3_FLASH PD_ODR_ODR2 #define LED4_FLASH PD_ODR_ODR3
下面我们将逐步讲解与外部中断有关的寄存器 1)CR1,CR2 这两个寄存器相信大家都很熟悉了,我们前面与 IO 口有关的操作都要到这两个寄存器, 之前我们设置的一般都是推挽式输出以及上拉式输入 在这里我们设置成中断上拉输入,因为我们的硬件上没有外接上拉,需要内部上拉,设 置对应位的寄存器值是 CR1 = 1 以及 CR2 = 0 2)EXTI_CR1
void main( void ) { init_devices(); // 主循环里没有程序需要执行 while(1); }
#pragma vector=0x02 // 这里很关键!看说明。 __interrupt void EXTI_PD7_TLI(void) { LED4_FLASH; }
#pragma vector=0x08 __interrupt void EXTI_PD(void) { if(PD_IDR_IDR5 == 0) //key1按下 { if(PD_IDR_IDR6 == 0) //key1 key2同时按下 LED3_FLASH; else LED1_FLASH; } else LED2_FLASH; }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例程四按键中断
其实在上个例程就说那个中断的,但不是重点说,例程四就重点说下这个中断的设置,主要是针对外部中断,对于其他的中断,到时在相应的模块里面会说的。
在STM8S207RB这个芯片里面有很多IO口都可以触发中断的。
主要是GPIO_A,GPIO_B,GPIO_C,GPIO_D,GPIO_E,这五组IO口都可以触发外部中断,所以大家以后要设计电路的话,必须先要查看先对应的文档来看下,了解清楚芯片的资料才好设置。
其实大家学会调用库里面的函数的话,这些初始化相当来说就很容易的了。
以上外部中断的设置来自“STM8寄存器.pdf”文档第74页
下面看下电路图先吧,只要当你清楚电路具体的链接,才能完成相对应的初始化。
用到内部的资源
"stm8s_clk.h"
"stm8s_exti.h"
"stm8s_gpio.h"
"stm8s_uart1.h"
"stm8s_clk.c"
"stm8s_exti.c"
"stm8s_gpio.c"
"stm8s_uart1.c"
看完了电路图,照样是先看主函数
在主函数里面最重要的是Buttom_Init();的初始化,其他的初始话上前几个例程已经有介绍过,相信大家也很清楚了。
下面重点讲下Buttom_Init()。
函数原型:
第一条语句是设置Buttom1和Buttom2相对应的IO为上拉输入;
第二条语句是设置GPIOD,也即是按键,为下降沿触发中断。
__enable_interrupt();这条语句是开总中断,在上一个例程里面说过了,以后凡是有触发中断的都要用上这条语句,所以说这条语句很重要的。
下面讲下外部中断常用的几个函数,这些函数都是库有的,可以直接调用的。
这个函数是设置哪组GPIO口为哪种方式触发中断的,触发方式有以下几种
下降沿和顶电平触发,只有上升沿触发,只有下降沿触发,上升沿和下降沿触发这4种。
这个函数是获得哪个IO口是已哪种方式来触发中断的,这个在调试的时候经常要用的。
实验现象:
按一下KEY1或KEY2,4个LED亮,在按一下,4个LED全部灭,如此循环,并在串口打印触发中断的相关信息
风驰电子祝您学习愉快~~~。