历史上的今天
返回首页

历史上的今天

今天是: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;

}

}

/************结束************/

推荐阅读

史海拾趣

Genisco Electronics公司的发展小趣事
考虑当地的燃料供应情况和成本,选择适合的燃料类型(如柴油、燃气等)。
Gamma Microelectronics ( APM )公司的发展小趣事

G24i在发展过程中始终注重国际合作与市场拓展。公司董事长Mr. Edward J Stevenson及其团队多次访问国内外知名科研机构和企业,就DSSC技术的研发、产业化等方面进行深入交流。同时,G24i还积极参加国际太阳能展会和论坛,展示其最新的技术成果和产品应用。这些努力不仅提升了G24i在国际市场上的知名度和影响力,也为公司赢得了更多的合作机会和市场份额。通过国际合作与市场拓展,G24i正逐步成为全球DSSC领域的领军企业之一。

Babcock Inc公司的发展小趣事

Babcock Inc公司的创立源于创始人对电子技术的深厚热爱和前瞻视野。在创业初期,公司便致力于电子技术的研发与创新,不断积累核心技术和专利。通过持续的技术投入和人才培养,Babcock逐渐在电子行业崭露头角,为后续的快速发展奠定了坚实的基础。

ENTRELECUK公司的发展小趣事

ENTRELEC UK深知品质对于企业的重要性,因此公司始终坚持严格的质量管理体系。从原材料采购到产品制造,再到售后服务,每一个环节都经过严格把关。这种对品质的执着追求使ENTRELEC UK赢得了客户的信任和好评。公司还建立了完善的客户服务体系,确保客户在使用产品过程中得到及时、有效的支持。

CAO Group Inc公司的发展小趣事

自创立以来,CAO Group一直致力于牙科材料和器械的研发。公司不断投入研发资源,成功推出多款具有创新性的牙科产品,如Lumist美白贴、SPRAY BOTTLE HEAD喷雾瓶头等,这些产品不仅在国内市场获得了广泛认可,还成功打入了国际市场。公司的研发实力和产品品质,使其在牙科行业中树立了良好的口碑。

AverLogic公司的发展小趣事

随着电子行业的不断发展,市场竞争也日益激烈。面对行业的变革和挑战,AverLogic公司及时调整战略,加大在研发和创新方面的投入,以适应市场的变化。同时,公司还积极开拓新的应用领域,如智能家居、自动驾驶等,以寻求新的增长点。这些战略调整不仅帮助公司应对了市场的挑战,也为其未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

大家有没有“温室智能控制系统”毕业设计

大家有没有“温室智能控制系统”毕业设计 共享一下 控制量(温度,湿度,光照,co2控制,土壤,水分)…

查看全部问答>

PROTEL 99se 中走线的问题

大家好:我的protel 99se中画pcb走线时可以走15度,30度等等好像是任意角度,我不想这样改怎么设置? 正常的是可以走45度,90度,135度 谢谢大家哦!…

查看全部问答>

关于端口复用的问题(ds1302和1602)

想用ds1302和1602做一个实时时钟,但ds1302的3个口接在P1,而1602的8位数据输入也用的是P1,请问能这样能做到吗?谢谢…

查看全部问答>

简单问题:如何获取进程空间虚拟地址的实际的物理地址?

反之,如果把一个物理地址映射到进程空间虚拟地址?不是MMU那个虚拟地址…

查看全部问答>

有电力项目方面经验的朋友请进!

哪位有电力方面课题或是中小型的项目,可以谈谈想法,现成的项目也可以,我公司需要购买或者开发。希望我们能合作。我的QQ号31721739 …

查看全部问答>

高分求高手相助, 无法连通电信WAP网关

{                 }else                 {                         ConnMgrSetCon…

查看全部问答>

各位同仁,我还要继续下去吗

本人是做单片机工作的,08年金融危机被公司CUT了…

查看全部问答>

关于系统初始化

系统初始化时,怎么根据实际使用振荡器?如内部振荡器1和2。…

查看全部问答>

Verilog+HDL数字设计与综合(第二版)

设计前端的设计很不错的一本书…

查看全部问答>

你对LED恒流芯片了解多少?三代非隔离LED恒流芯片介绍

第一代LED恒流芯片:此类芯片主要的技术特点是基于固定频率的PWM芯片(如UC384X等),通过降低电感纹波电流,固定电感峰值电流来实现恒流。但由于开关频率固定,为避免次谐振荡,它的最大占空比只能用到50%,其应用范围就很受限了;再者由于电感纹 ...…

查看全部问答>