第6章 STM8中断控制系统
- 格式:pptx
- 大小:635.47 KB
- 文档页数:30
深入浅出stm8单片机入门、进阶与应用实例STM8单片机是一款性能优越、功能丰富的微控制器,被广泛应用于嵌入式系统中。
本文将从深入浅出的角度,为大家介绍STM8单片机入门、进阶以及实际应用案例。
一、STM8单片机入门1. STM8单片机概述STM8单片机是意法半导体公司推出的一款8位微控制器,采用了高性能的STM8内核和丰富的外设资源。
相比其他8位单片机,STM8单片机具有更高的性能、更丰富的功能和更低的功耗。
2. STM8单片机编程语言STM8单片机支持多种编程语言,包括C语言、汇编语言、BASIC语言等。
其中,C语言是最常用的一种编程语言,具有语法简单、易于理解等优点。
3. STM8单片机开发环境STM8单片机开发环境包括开发工具和编程器。
常用的开发工具有IAR Embedded Workbench、ST Visual Develop、Keil uVision等。
编程器可以选择ST-Link/V2、ST-Link/V3、J-Link等。
4. STM8单片机基础知识STM8单片机基础知识包括IO口、定时器、中断等。
掌握这些基础知识是学习STM8单片机的基础。
其中,IO口用于接收或输出数字信号,定时器用于计时、测量时间等,中断用于实现程序的异步处理。
二、STM8单片机进阶与实践1. STM8单片机外设应用STM8单片机具有丰富的外设资源,包括GPIO、I2C、SPI、USART、ADC等。
这些外设可以满足不同应用场景的需求。
例如,GPIO用于控制LED等外围设备,I2C和SPI用于连接外部设备,USART用于串口通信,ADC用于模拟信号的采集。
2. STM8单片机通信协议STM8单片机支持多种通信协议,包括UART、I2C、SPI等。
这些通信协议可以实现与其他设备的通信,例如与传感器、显示器、无线模块等设备的通信。
不同的通信协议有着不同的特点和应用场景,需要根据实际需求选择合适的协议。
3. STM8单片机中断技术中断是STM8单片机中的一项重要技术,可以实现程序的异步处理。
说实话我能够使用的单片机不多,我总是以为无论什么单片机都能开发出好的产品。
前些年用51,总是向各位大大学习,无休止的索取,在网上狂览一通。
心里感激的同时也想奉献一些,可是我会什么?后来使用avr(公司要求)还是向大大们学习,我又想奉献,可是我会什么?我会的大大们都写了,我不会的大大们也写了。
一个星期前花项目经费买了阿莫的kit三合一板,最近几天闲了下来,便动手调试一下。
算是有点心得,我又想奉献,可是我会什么?我只是想和大大们交流一下,哪怕是对的或者是错的,大大们满足我的一点心愿吧。
唠叨了这么多,现在开始吧。
配置:stvd ,cosmic我学单片机开门三砖总是要砸的。
第一砖:电源系统,这没什么好说的,只是它是stm8工作的基础总是要提一下第二砖:时钟系统,这等下再说。
第三砖:复位系统,stm8只需要一只104电容从reset脚到地就可以了。
现在说说时钟系统,学习单片机无论8位的还是32位的,都要从时钟开始,下面是我一开始的时钟切换程序。
1 CLK_ECKR |=0X1; //开启外部时钟2 while(!(CLK_ECKR&0X2)); //等待外部时钟rdy3 CLK_CKDIVR &= 0XF8; //CPU无分频4 CLK_SWR = 0XB4; //选择外部时钟5 CLK_SWCR |=0X2; //使能外部时钟上面的代码看起来没什么问题,可在调试过程中出现了有时能切换,有时有不能的情况,后来发现只要在第5行设上断点就能切换,我就想是不是得让cpu等一下,我又仔细的翻看下rm0016的时钟部分,发现得等待CLK_SWCR的标志位置位才能切换。
就变成了下面的代码CLK_ECKR |=0X1; //开启外部时钟while(!(CLK_ECKR&0X2)); //等待外部时钟rdyCLK_CKDIVR &= 0XF8; //CPU无分频CLK_SWR = 0XB4; //选择外部时钟while(!(CLK_SWCR&0X8)); //这里要等CLK_SWCR |=0X2; //使能外部时钟现在一切ok,是不是觉得看东西要仔细一下~~。
✧─数据存储器:多达1K字节真正的数据EEPROM;可达30万次擦写✧RAM:多达2K字节时钟、复位和电源管理✧ 3.0~5.5V工作电压,内核电压1.8V✧灵活的时钟控制,4个主时钟源✧–低功率晶体振荡器✧–外部时钟输入✧–用户可调整的内部16MHz RC✧–内部低功耗128kHz RC✧带有时钟监控的时钟安全保障系统电源管理:✧–低功耗模式(等待、活跃停机、停机)✧–外设的时钟可单独关闭✧永远打开的低功耗上电和掉电复位中断管理✧带有32个中断的嵌套中断控制器✧ 6个外部中断向量,最多37个外部中断定时器✧2个16位通用定时器,带有2+3个CAPCOM通道(IC、OC 或PWM)✧高级控制定时器:16位,4个CAPCOM✧通道,3个互补输出,死区插入和灵活的自动唤醒定时器✧2个看门狗定时器:窗口看门狗和独立看门狗通信接口✧带有同步时钟输出的UART ,智能卡,红外IrDA,LIN接口✧SPI接口最高到8Mbit/s✧I2C接口最高到400Kbit/s2.2 STM8S系列MCU内部结构 P222.2.1 STM8内核CPU P24PC为24位,可寻址224=16Mb累加器(A) ,堆栈指针(SP),索引寄存器(X和Y),条件码寄存器(CC):2.2.2 STM8S封装与引脚排列2.3掌握通用I/O口GPIO初始化P31●可选择的输入模式:悬空输入(缺省状态)和带上拉输入●可选择的输出模式:推挽式输出和开漏输出PB_DDR,PB_CR1,PB_CR22.3.1 I/O引脚结构2.3.2 I/O端口数据寄存器与控制寄存器2.3.3输入模式2.3.4输出模式每一个端口都有一个输出数据寄存器 (ODR),一个引脚输入寄存器(IDR)和一个数据方向寄存器(DDR) 总是同相关的。
控制寄存器1(CR1)和控制寄存器2(CR2)用于对输入/输出进行配置。
任何一个I/O引脚可以通过对DDR,ODR,CR1和CR2寄存器的相应位进行编程来配置。
本文由扶疏见影贡献 doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
STM8 的 C 语言编程(6)-- 位定时器应用之二 语言编程( )-- )--8 今天进行的实验依然是用定时器 4,只不过改成了用中断方式来实现,由定时器 4 的中断服务程序来驱动 LED 的闪烁。
实现中断方式的关键点有几个,第一个关键点就是要打开定时器 4 的中断允许 位,在定时器 4 的 IER 寄存器中有定义。
第二个关键点,就是打开 CPU 的全局 中断允许位,在汇编语言中,就是执行 RIM 指令,在 C 语言中,用下列语句实 现: _asm("rim"); 第 3 个关键点就是中断服务程序的框架或写法,中断服务程序的写法如下: @far @interrupt void TIM4_UPD_OVF_IRQHandler (void) { // 下面是中断服务程序的实体 } 第 4 个关键点就是要设置中断向量, 即将中断服务程序的入口填写到中断向量表 中,如下所示,将 IRQ23 对应的中断服务程序的入口填写成 TIM4_UPD_OVF_ IRQHandler struct interrupt_vector const _vectab[] = { {0x82, (interrupt_handler_t)_stext}, /* reset */ {0x82, NonHandledInterrupt}, /* trap */ {0x82, {0x82, {0x82, {0x82, {0x82, {0x82, {0x82, {0x82, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, /* /* /* /* /* /* /* /* irq0 irq1 irq2 irq3 irq4 irq5 irq6 irq7 */ */ */ */ */ */ */ */ {0x82, NonHandledInterrupt}, /* irq8 */ {0x82, NonHandledInterrupt}, /* irq9 */ {0x82, NonHandledInterrupt}, /* irq10 */ {0x82, {0x82, {0x82, {0x82, {0x82, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, /* /* /* /* /* irq11 irq12 irq13 irq14 irq15 */ */ */ */ */ {0x82, NonHandledInterrupt}, /* irq16 */ {0x82, NonHandledInterrupt}, /* irq17 */ {0x82, {0x82, {0x82, {0x82, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, /* /* /* /* irq18 irq19 irq20 irq21 */ */ */ */ */ irq23 */ */ */ */ */ */ */ {0x82, NonHandledInterrupt}, /* irq22 {0x82, TIM4_UPD_OVF_IRQHandler},/* {0x82, NonHandledInterrupt}, /* irq24 {0x82, NonHandledInterrupt}, /* irq25 {0x82, {0x82, {0x82, {0x82, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, NonHandledInterrupt}, /* /* /* /* irq26 irq27 irq28 irq29 }; 解决了以上 4 个关键点,我们就能很轻松地用 C 语言实现中断服务了。
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口,设置输入输出,是否可以中断,然后设置触发条件,用到多于一个中断,就要设置优先级。
例程四按键中断其实在上个例程就说那个中断的,但不是重点说,例程四就重点说下这个中断的设置,主要是针对外部中断,对于其他的中断,到时在相应的模块里面会说的。
在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采用软件优先级和硬件优先级来控制一个中断的响应,先比较软件优先级只有当软件优先级一致时才会比较硬件优先级,由于硬件优先级具有唯一性,这样便保证了某一时刻定会只有一个中断被处理。
要使用外部中断,只需简单的配置一下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学习笔记——定时器定时功能和中断相关
定时器都差不多,无非就是计数,溢出了标志置位,如果中断允许的话产
生一个中断。
说到中断,STM8S105 的中断向量表如下
时基单元:
在选用内部时钟的情况下,CK_PSC 是由fmaster 提供的,经过定时器预分频器分频产生CK_CNT 时钟,然后作为一次计数的时基,举个例子,16M 的
内部RC,经过16 分频,则CK_CNT 为1M,那么定时1ms 只需计数1000 次。
计数模式:
共有三种:向上,向下,中央对齐
以向上计数为例:计数器从0 计数到用户定义的比较值(TIMx_ARR 寄存器
的值),然后重新从0 开始计数并产生一个计数器溢出事件,同时,如果
TIM1_CR1 寄存器的UDIS 位是0,将会产生一个更新事件(UEV)。
关于IAR 中断函数的写法
asm(“sim”);//关全局中断
asm(“rim”);//开全局中断
#pragma vector=TIM2_OVR_UIF_vector (这里根据上面的中断向量表选择要进入的中断的向量)
__interrupt void TIM2_OVR_UIF(void)//__interrupt 关键字表示中断函数{ TIM2_SR1 &=~0x01; // 清除更新中断标记,这步不能漏掉,否则会连续进入中。
STM8库函数之中断计时STM8库函数之中断计时作者:carloszo原理分析中断计时的原理是基于时间片轮转理论。
按照顺序结构的写法,有时候避免不了沉重冗长的时间等待。
例如键盘扫描,你就给我弄了一个delay_20ms()函数,而在这延时的过程,其实MCU可以做很多事情的。
通过中断计时,给每个任务分配一个时间片,这样就可以避免因为使用delay造成的mcu等待,合理分配资源。
中断计时的具体实施步骤为,首先配置主时钟频率,配置计时器计时周期,使能中断,设置计时变量及初始值,如time_250ms_flag = 0,进中断后修改计时变量值等于1。
在main函数判断time_250ms_flag的值是否为1,如果为1,进行相应任务。
代码1.定义时间变量unsigned char time_250us_flag;unsigned char time_1ms_cnt;unsigned char time_10ms_cnt;unsigned char time_20ms_cnt;unsigned char time_100ms_cnt;unsigned char time_1s_cnt;2.配置主时钟void clk_init(void){CLK_DeInit();CLK_HSICmd(ENABLE);//内部高速时钟:16MCLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV2);//时钟频率:16M/2=8M }3.配置计时器void tim_init(void){TIM2_DeInit();TIM2_TimeBaseInit(TIM2_PRESCALER_8,249);//计时周期:250usTIM2_ARRPreloadConfig(ENABLE);TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);TIM2_Cmd(ENABLE);}4.中断设置@near @interrupt void TIM2_UPD_OVF_BRK_IRQHandler (void){/* In order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction. */TIM2_ClearITPendingBit(TIM2_IT_UPDATE);time_250us_flag =1;return;}5.main函数调用main(){sys_init();enableInterrupts();//使能总中断while(1){if(time_250us_flag==1) {time_250us_flag =0; time_1ms_cnt++;}if( time_1ms_cnt >=4) {time_1ms_cnt =0;time_10ms_cnt++;}if( time_10ms_cnt >=10) { time_10ms_cnt =0;time_20ms_cnt++;}if( time_20ms_cnt >=2) { time_20ms_cnt =0;time_100ms_cnt++;}if( time_100ms_cnt >=5) { time_100ms_cnt =0; time_1s_cnt++;}if( time_1s_cnt >=10) {time_1s_cnt =0;}}}。
STM8单片机中断的主要功能解析
内部中断:一般是由硬件错误或者运算过程中出错引起的,一般是不可避免的;
外部中断:是处理器的外设发出的中断请求,如定时器中断,UART接收中断,外部中断一般都可以通过中断控制器进行屏蔽;
……所有IO引脚都具有外部中断能力,每个端口都有独立的中断向量以及独立的标志;外设中断能力;
……软件中断能力(TRAP)
……具有灵活的优先级和中断等级管理,支持可嵌套和同级中断管理:——多达4个软件可编程的嵌套等级;——最多有32个中断向量,其入口地址由硬件固定;——2个不可避免的中断:RESET,TRAP;——1个不可避免的最高优先级硬件中断TL1;
2.中断的主要功能1. 实现高速CPU和低速外设之间速度的配合;打印机的打印字符的速度比较慢,于是CPU向打印机传送一个字符后,可以去执行其他任务,打印机打印完该字符,向CPU提出中断请求……
2. 可实现实时控制,所有参数可随时向CPU发送中断请求,使控制对象保持最佳工作状态;
3. 实现故障的紧急处理;
4. 实现人机接口,如键盘;
3.STM8中断源和中断向量中断源:中断信号的触发源;
中断向量:每个中断源对应至少一个中断标志,中断源请求CPU中断时,对应的中断标志位发送改变,CPU在每条语句结束检查中断标志位,如果允许中断,则产生中断,CPU 将PC指针指向对应中断服务程序入口,改地址就是中断向量;
在单片机中,中断技术主要用于实时控制,实时控制要求单片机能够及时的响应被控制对象提出的分析,计算和控制等请求,使被控制对象保持在最佳工作状态,以达到预期的最优控制效果,这些中断请求发生使随机的,要求单片机快速响应,是一个复杂的过程;。