历史上的今天
今天是:2024年09月28日(星期六)
2021年09月28日 | STM8S中断系统
2021-09-28 来源:eefocus
STM8单片机有自己的独特的终端系统
什么是中断?

什么是中断源?
引发中断的一个事件或者根源就称为中断源。
STM8S208RB单片机共有27个中断源:
可以分为两大类:
1、不可屏蔽中断源 :3个
REST : 此中断时软件和硬件最高级的中断,此中断响应时,其他所有的中断将会被禁止掉,如果想要在开启这个中断必须要执行“RIM”指令来操作。
TRAP :此中断时不可以屏蔽的软件中断,是软件优先级最高的中断。
TLI :同样是不可以屏蔽的硬件中断,具有硬件的最高优先级。
2、可屏蔽中断源:24个
可屏蔽中断又分为:外部中断和外设中断
中断的优先级
STM8S单片机的中断优先级:
软件优先级
硬件优先级
当中断执行时会优先执行,软件中断优先级高的中断,当两个中断软件优先级相同时,先执行硬件优先级高的中断。

软件优先级就是我们认为的给中断赋予不同的级别:
软件优先级设置寄存器ITC_SPRx CPU CC寄存器
外部中断可以分为:
可屏蔽中断分为:
1、外设中断
2、外部中断
什么是外部中断和什么时外设中断?
#include const unsigned char table0[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f}; // 共阴码表无点 const unsigned char table1[]= {0xbf,0x86,0xdb,0xcf,0xe6, 0xed,0xfd,0x87,0xff,0xef}; // 共阴码表有点 unsigned int NUM; //全局变量用于显示 void Delay_Ms(unsigned int ms); void Delay_Us(unsigned char t); void Seg_Init(void); void Display(unsigned int num); void Exti_Init(void); /************主函数************/ main() { CLK_SWCR = 0x02; //使能时钟切换 CLK_SWR = 0xB4; //时钟源为HSE 0xB4 HSI 0xE1 LSI 0xD2 Seg_Init(); //数码管驱动初始化 Exti_Init(); while(1) { Display(NUM); } } /************数码管初始化函数************/ void Seg_Init(void) { PB_DDR = 0xFF; // 将PB口设置成推挽输出 PB_CR1 = 0xFF; PB_CR2 = 0x00; PF_DDR |= 0xF0; // 将PF口高四位设置成推挽输出 PF_CR1 |= 0xF0; PF_CR2 &= 0x00; PE_DDR |= 0x01; // 将PE0设置成推挽输出 SEGEN PE_CR1 |= 0x01; PE_CR2 &= 0x00; PE_ODR &= 0xFE; // PE0=0,使能数码管 } /************延时MS函数************/ void Delay_Ms(unsigned int ms) { unsigned int x,y; for(x=ms;x>0;x--) { for(y=300;y>0;y--) { } } } /************延时uS函数************/ void Delay_Us(unsigned char t) { unsigned char m=t; while(m--); } /************显示函数************/ void Display(unsigned int num) { unsigned char GeWei,ShiWei,BaiWei,QianWei; GeWei = num%10; ShiWei = num%100/10; BaiWei = num%1000/100; QianWei = num/1000; PB_ODR = table0[GeWei]; PF_ODR = 0xE0; Delay_Ms(3); PB_ODR = 0; PF_ODR = 0xF0; Delay_Ms(1); PB_ODR = table0[ShiWei]; PF_ODR = 0xD0; Delay_Ms(3); PB_ODR = 0; PF_ODR = 0xF0; Delay_Ms(1); PB_ODR = table0[BaiWei]; PF_ODR = 0xB0; Delay_Ms(3); PB_ODR = 0; PF_ODR = 0xF0; Delay_Ms(1); PB_ODR = table0[QianWei]; PF_ODR = 0x70; Delay_Ms(3); PB_ODR = 0; PF_ODR = 0xF0; Delay_Ms(1); } /************外部中断初始化函数************/ void Exti_Init(void) { PD_DDR = 0x00; //使能外部中断的上拉输入 PD_CR1 = 0x04; PD_CR2 = 0x04; EXTI_CR1 = 0x80; //PD口下降沿触发 _asm("rim"); //开全局中断 } /************外部中断服务函数************/ @far @interrupt void PORTD_EXTI_Interrupt(void) { NUM++; if(NUM>=10000) { NUM=0; } } /************结束************/ interrupt_vector.c文件设置: /* BASIC INTERRUPT VECTOR TABLE FOR STM8 devices * Copyright (c) 2007 STMicroelectronics */ typedef void @far (*interrupt_handler_t)(void); struct interrupt_vector { unsigned char interrupt_instruction; interrupt_handler_t interrupt_handler; }; @far @interrupt void NonHandledInterrupt (void) { /* in order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction */ return; } extern void _stext(); /* startup routine */ extern @far @interrupt void PORTD_EXTI_Interrupt(void); //中断服务 struct interrupt_vector const _vectab[] = { {0x82, (interrupt_handler_t)_stext}, /* reset */ {0x82, NonHandledInterrupt}, /* trap */ {0x82, NonHandledInterrupt}, /* irq0 */ {0x82, NonHandledInterrupt}, /* irq1 */ {0x82, NonHandledInterrupt}, /* irq2 */ {0x82, NonHandledInterrupt}, /* irq3 */ {0x82, NonHandledInterrupt}, /* irq4 */ {0x82, NonHandledInterrupt}, /* irq5 */ {0x82, PORTD_EXTI_Interrupt}, /* irq6 */ {0x82, NonHandledInterrupt}, /* irq7 */ {0x82, NonHandledInterrupt}, /* irq8 */ {0x82, NonHandledInterrupt}, /* irq9 */ {0x82, NonHandledInterrupt}, /* irq10 */ {0x82, NonHandledInterrupt}, /* irq11 */ {0x82, NonHandledInterrupt}, /* irq12 */ {0x82, NonHandledInterrupt}, /* irq13 */ {0x82, NonHandledInterrupt}, /* irq14 */ {0x82, NonHandledInterrupt}, /* irq15 */ {0x82, NonHandledInterrupt}, /* irq16 */ {0x82, NonHandledInterrupt}, /* irq17 */ {0x82, NonHandledInterrupt}, /* irq18 */ {0x82, NonHandledInterrupt}, /* irq19 */ {0x82, NonHandledInterrupt}, /* irq20 */ {0x82, NonHandledInterrupt}, /* irq21 */ {0x82, NonHandledInterrupt}, /* irq22 */ {0x82, NonHandledInterrupt}, /* irq23 */ {0x82, NonHandledInterrupt}, /* irq24 */ {0x82, NonHandledInterrupt}, /* irq25 */ {0x82, NonHandledInterrupt}, /* irq26 */ {0x82, NonHandledInterrupt}, /* irq27 */ {0x82, NonHandledInterrupt}, /* irq28 */ {0x82, NonHandledInterrupt}, /* irq29 */ }; 点阵模块 #include const unsigned char ranknum[] = {0x00,0x10,0x20,0x30,0x40, 0x50,0x60,0x70}; // 列数组 const unsigned char linenum1[]= {0x00,0x18,0x24,0x42,0x42, 0x24,0x18,0x00}; // 石头图像 const unsigned char linenum2[]= { 0x00,0x00,0x76,0x0E,0x0E, 0x76,0x00,0x00 }; //剪刀图像 const unsigned char linenum3[]= { 0x00,0x7E,0x42,0x42,0x42, 0x42,0x7E,0x00 }; // 布图像 unsigned char NUM; //全局变量用于显示 void Delay_Ms(unsigned int ms); void Port_Init(void); void Display64(unsigned char picture); void Exti_Init(void); /************主函数************/ main() { CLK_SWCR = 0x02; //使能时钟切换 CLK_SWR = 0xB4; //时钟源为HSE 0xB4 HSI 0xE1 LSI 0xD2 Port_Init(); //I/O端口初始化 Exti_Init(); //外部中断初始化 while(1) { Display64(NUM); } } /************端口初始化函数************/ void Port_Init(void) { PB_DDR = 0xFF; //将PB口设置成推挽输出,用于点阵行线驱动 PB_CR1 = 0xFF; PB_CR2 = 0x00; PF_DDR |= 0xF0; //将PF口高四位设置成推挽输出,用于点阵三八译码器列驱动 PF_CR1 |= 0xF0; PF_CR2 &= 0x00; PD_DDR = 0x08; //PD3推挽输出,PD2使能外部中断的上拉输入 PD_CR1 = 0x0C; PD_CR2 = 0x04; PD_ODR |= 0x08; //PD3=1,使能64点阵 } /************延时MS函数************/ void Delay_Ms(unsigned int ms) { unsigned int x,y; for(x=ms;x>0;x--) { for(y=300;y>0;y--) { } } } /************显示函数************/ void Display64(unsigned char picture) { unsigned char x=0; if(picture==0) { for(x=0;x<8;x++) { PF_ODR=ranknum[x]; PB_ODR=linenum1[x]; Delay_Ms(1); } } if(picture==1) { for(x=0;x<8;x++) { PF_ODR=ranknum[x]; PB_ODR=linenum2[x]; Delay_Ms(1); } } if(picture==2) { for(x=0;x<8;x++) { PF_ODR=ranknum[x]; PB_ODR=linenum3[x]; Delay_Ms(1); } } } /************外部中断初始化函数************/ void Exti_Init(void) { EXTI_CR1 = 0x80; //PD2口下降沿触发 _asm("rim"); //开全局中断 } /************外部中断服务函数************/ @far @interrupt void PORTD_EXTI_Interrupt(void) { NUM++; if(NUM>=3) { NUM=0; } } /************结束************/
下一篇:STM8无法跳出TIM2更新中断
史海拾趣
|
大家好:我的protel 99se中画pcb走线时可以走15度,30度等等好像是任意角度,我不想这样改怎么设置? 正常的是可以走45度,90度,135度 谢谢大家哦!… 查看全部问答> |
|
想用ds1302和1602做一个实时时钟,但ds1302的3个口接在P1,而1602的8位数据输入也用的是P1,请问能这样能做到吗?谢谢… 查看全部问答> |
|
第一代LED恒流芯片:此类芯片主要的技术特点是基于固定频率的PWM芯片(如UC384X等),通过降低电感纹波电流,固定电感峰值电流来实现恒流。但由于开关频率固定,为避免次谐振荡,它的最大占空比只能用到50%,其应用范围就很受限了;再者由于电感纹 ...… 查看全部问答> |






























