1、中断产生以后要把中断标志位清掉,这样才能保证执行中断里的程序的时候不会被新的中断打断,从而可以让中断服务程序全部执行完。
2、中断服务程序程序执行完以后,要把中断打开(即把标志位置位),以便下一次还能触发该中断。这就是更新中断
外部中断是CPU的INT脚电平变化引发的中断,定时器中断是定时器达到计数值引发的中断。
定时器中断适合需要定时引发的事件,外部中断适合外部随机发生,需要快速处理的事件。
两个中断是完全不同的硬件引发的,所以不能拿要不要重载初值来比较。
外部中断是外部随机引发的自然是没有什么初值可言的
不能判断电平,会产生误导;如上升沿,下降沿边触发,是瞬态产生,可能在没有来得及判断时,中断就已经进行了;
举个例子,在PC口有的PC0和PC1两个信号都要求能够中断。而STM8S 对应PC口只有一个 中断向量,我要怎么才能够知道具体是有PC0引起的中断呢?还是PC1引起的中断呢?
我也看了坛子里面的一些相关的帖子,大致有这么一种方法,进入中断后读取IO口的电平状态 以判断是哪个IO口引起的中断。 但是我有个疑问,假定设置为下降沿触发中断。PC0先出现下降沿,系统进入中断,如果在这个时间段,PC1也出现下降沿,在中断里面再读PC0和PC1电平状态,仍然不能够判别是由PC0引起的中断,还是由PC1触发的中断啊!!
不建议这样用 最好一个PC,一个PD,每个口只开放一个中断;
那这样,一个PORT, 每个独立的中断口就没有意义了?
STM8S有5组IO端口,每组端口分别有若干引脚可以作为外部中断触发输入,分别为:
端口A: PA[6:2];端口B: PB[7:0];端口C: PC[7:0];端口D: PD[6:0];端口E: PE[7:0]。
//此例程是通过TIM2 CH1(PD4脚)通道来输出一个频率2K 占空比可调的方波,占空比可通过PD7脚的按键调
#include "STM8S105Kh"
typedef unsigned char u8;
typedef unsigned int u16;
u16 value;
void SystemInit(void)
{
CLK_CKDIVR = 0x08; // 16M内部RC经2分频后系统时钟为8M
CLK_PCKENR1 |= 0x60; //使能TIM2与TIM3与主频连接
PD_CR2 |= 0x80; //使能PD7口外部中断
}
void GPIO_init(void)
{
PD_DDR = 0x1F; //配置PD端口的方向寄存器全输出
PD_CR1 = 0x1F; //设置PD为推挽输出
}
void TIM2_init(void) //TIM2 CH1 工作于模式1
{
TIM2_CCMR1= 0x60; // PWM 模式 1,TIM2 CH1
TIM2_CCER1= 0x03; // CC1配置为输出
TIM2_ARRH = 0x07; // 配置PWM分辨率为10位,ARR=0x07D0
TIM2_ARRL = 0xD0; // PWM频率=8M/0x07D0=2000Hz
TIM2_CR1 |= 0x01; // 计数器使能,开始计数
}
void init_devices(void)
{
asm("sim");
SystemInit();
GPIO_init();
TIM2_init();
_asm("rim"); //开总中断
}
void main( void )
{
init_devices();
while(1)
TIM2_CCR1=value;//改变value值可改变频率
}
/
函数名 : @near @interrupt void TLI_IRQHandler (void)
功能描述: 中断服务程序
按下PD7口按键来改变占空比
/
@near @interrupt void TLI_IRQHandler (void)
{
PD_CR2 &= 0x7F; //关PD7外部中断
value+=50;
while(value>1000)
value=0;
PD_CR2 |= 0x80; //使能PD7口外部中断
return;
以上就是关于STM8定时器更新事件与中断有什么不同全部的内容,包括:STM8定时器更新事件与中断有什么不同、STM8外部中断:如何区分同一PORT中的不同脚,如PD1和PD2、STM8S单片机为什么外部按键中断跟AWU一起使用,外部按键按着按着就会复位掉,谁知道这是怎么回事呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)