stm8中断使用

发布者:EnchantedWish最新更新时间:2018-06-01 来源: eefocus关键字: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,可以保证肯定是在高电平时读的数据。俩个中断同时开启,最终的操作还是简单的,参考代码如下: 
这里写图片描述 
这里写图片描述

————————————————————————-分割线———————————————————————————

stm8的中断具体使用方法 
和常规的中断使用类似,首先要关闭全局中断,然后初始化中断用到的GPIO口,设置输入输出,是否可以中断,然后设置触发条件,用到多于一个中断,就要设置优先级。 
需要指明的是stm8s的中断屏蔽是采用优先级的方式,有一个系统CPU寄存器保存当前执行程序的优先级。

这里写图片描述
过程问题: 
在中断中,不能使用串口打印,会影响程序执行,就如前面图形所示波形,黄色线上升沿和下降沿触发中断,正确的会检测到10个中断,并且为2个高电平7个低电平。最终通过中断处理函数里的打印,得到一个本该低电平的值,检测到一个高电平值,推想应该是发生了偏移。在中断处理函数里面,检测高电平的判断条件里加了一个变量用作计数,在while(1)主循环去打印该值,得到了2,表示检测情况正确。 
产生疑问:中断执行应当每一次都是独立的,怎么会出现其中一次出错的情况呢?

还有一种中断接收数据的方法,理论上行的通,结果还是有点问题,没有找出来。 
DAT下降沿判断开始,然后关闭掉该中断,上升沿CLK去读数据,读完数据,设置DAT上升沿触发,如果触发,判断结束,将触发条件设为下降沿,迎接下一次数据传输的开始。试验验证,传输数据12位每次都可以正常,一旦到了多余12位,就出现首次中断不能判断结束位,只有下次才可以判断到,数据也只能是一次正确,后面出错。和上面的情形有点类似,中断函数好像出现了一个时间累加出错效果。

现在自定了一个通信协议,波形类似于i2c,就是一次传送16字节。

bug解决: 
1.采用了俩个独立的中断触发,满足了要求,但是数据只有第一次是正确的,后面就出现了固定的每一次又移一位的问题。一开始怀疑串口,可能是串口有缓冲,数据没有完全从打印的队列中打印完毕,但是不管是直接打印一个值,还是分开打印每一位都是错误的,而且俩种方式下,错误结构都是一样的。后来想到了,可以用调试,IAR虽然粗略,但是调试中观察一个变量的值还是不成问题,发现数据依然是错的,串口是没问题的。每次移一位,可能是把停止位当开始位了,所以会出现又移的假象。原来是第17个上升沿判断结束,更改判断触发条件的标志位,改了17以后果然可以了。庆祝一下!!!

解决过程: 
有了最终实现的结果,想方法去实现。延时的方法最好做,最终没有采用,完全用中断去做。过程中,遇到了很多阻力,也学到了一些东西,遇到问题,就开始思考可能原因,查资料确认结果。 
一开始想需要屏蔽中断,在stm8s中是采用优先级的方式,优先级设到最高,就没有其他中断可以打断。中断屏蔽的使用,还得再查看相关资料确定。最终采用的方法,中断上使用挺简单,重要的是过程和思路的形成,排除了很多方法,才想到这一个,然后去验证。


关键字:stm8  中断使用 引用地址:stm8中断使用

上一篇:stm8 uart2 串口接收中断协议解码+定时器中断
下一篇:STM8单片机的中断控制(ITC)

推荐阅读最新更新时间:2024-03-16 16:04

IAR for STM8重定向printf
#include stdio.h int fputc(int ch, FILE *f)//STM8S105,printf函数重定向 { while (!(UART2- SR&0x80)); UART2- DR=ch; return ch; } 同时需要修改IAR的Projec t- Options - General Options - Library Configuration中的Library 项由 Normal 改为 Full 。
[单片机]
STM8 I2C主模式
STM8 I2C主模式 在主模式时,I C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。以下是主模式所要求的操作顺序: 在I2C_FREQR寄存器中设定该模块的输入时钟以产生正确的时序 配置时钟控制寄存器 配置上升时间寄存器 编程I2C_CR1寄存器启动外设 置I2C_CR1寄存器中的START位为1,产生起始条件 I2C模块的输入时钟频率必须至少是:起始条件 当BUSY=0时,设置START=1,I2C接口将产生一个开始条件并切换至主模式(M/SL位置为1)。 标准模式下为:1MHz 快速模式下为:4MHz
[单片机]
<font color='red'>STM8</font> I2C主模式
STM8S自学笔记-002 STM8初上手和开发环境的建立
硬件上手 仿真器 Debugger 一般,初学者很难一次性写出正确的代码,就算是大神,也难免会犯一些错误。虽然软件开发平台在进行编译时,能够指出语法上的错误,但逻辑上的错误却很难指出。这时,仿真器(专指硬件仿真器,下同)就派上用场了。它可用于实现硬件的仿真,可以实现对单片机程序运行的控制,例如单步执行、全速运行、设置断点,可以辅助查找程序中的问题。   ST MCU的仿真器是ST-LINK,包含V1、V2、V3三个版本,均支持对STM8/32的硬件仿真。相比与V1,V2将STM8仿真所需的四个引脚做成了独立的接口。后面的自学笔记将均以ST-LINK V2作为硬件仿真器。   下图便是ST-LINK V2,中间的4P插针用于
[单片机]
STM8S自学笔记-002 <font color='red'>STM8</font>初上手和开发环境的建立
STM8固件库GPIO学习笔记
1、STM8的寄存器映射 STM8 core采用了哈佛结构,有两条总线分别用于访问Flash和RAM,但Flash,RAM,GPIO and peripheral registers都被映射到了线性的16Mbyte(24位地址)的存储器空间中;stm8s208rb的GPIO and peripheral registers被映射到了0x00 5000 ~ 0x00 57FF地址空间。所以要在C语言中访问外围设备寄存器我们只需要指向这些地址空间的指针即可了。 2、STM8的寄存器的地址 在STM8中,与某个外围设备有关的寄存器在地址上都是顺序排列的;比如与GPIO有关的寄存器有ODR、IDR、DDR、CR1、CR2,与PA口有
[单片机]
STM8如何使用自带的bootloader
1,首先确认你使用的STM8有没有自带的bootloader。参考下表 2,STM8空器件可以直接使用自带的bootloader。 3,STM8在使用SWIM烧录后,要想继续使用自带的bootloader,必须设置可选字节为0x55AA。如下图: 设置这两个字节的方法,可以使用ST Visual Programmer修改,如下图: 不过这个软件显示只能修改487Eh为0x55,487Fh没更改。官方提供的软件,很奇怪。所以,我采用下一种方法 在程序中设定,然后用SWIM下载一次,一次就够了。使用库函数如下: /* Define FLASH programming time */ FLASH_SetProgrammi
[单片机]
<font color='red'>STM8</font>如何<font color='red'>使用</font>自带的bootloader
STM8 时基单元
STM8时基单元 时基单元包含: 16位向上/向下计数器 16位自动重载寄存器 重复计数器 预分频器 (图29:STM8 时基单元) 16位计数器,预分频器,自动重载寄存器和重复计数器寄存器都可以通过软件进行读写操作。自动重载寄存器由预装载寄存器和影子寄存器组成。 可在在两种模式下写自动重载寄存器: 自动预装载已使能(TIM1_CR1寄存器的ARPE位置位)。在此模式下,写入自动重载寄存器的数据将被保存在预装载寄存器中,并在下一个更新事件(UEV)时传送到影子寄存器。 自动预装载已禁止(TIM1_CR1寄存器的ARPE位清除)。在此模式下,写入自动重载寄存器的数据将立即写入影子寄存器。 更新事件的产生
[单片机]
<font color='red'>STM8</font> 时基单元
STM8 AT24CXX使用I2C接口读写
软件设计 /********************************************************************* 目 的: 建立AT24CXX操作库 目标系统: 基于STM8单片机 应用软件: Cosmic CxSTM8 *********************************************************************/ #define WD_DADR 0xa0 #define RD_DADR 0xa1 #include ws_i2c.h void AT24CXX_Init(void) { I2C_Init(); } void
[单片机]
STM8-灯每隔1S亮灭一次
目的:熟悉语句GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins); 和语句GPIO_WriteLow(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef PortPins);的使用。 #include stm8s.h #define uint unsigned int #define uchar unsigned char #define ulong unsigned long void delay(ulong i) { while(i--); } void main() { GPIO_DeInit(GPIOD); GPI
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved