理论教育 定时器中断服务程序的实现与优化

定时器中断服务程序的实现与优化

时间:2023-06-16 理论教育 版权反馈
【摘要】:驱动程序中定时器3的中断服务程序主要用于完成行列扫描以及一些附加的系统定时计数功能。行扫周期0.312 5ms由硬件定时器准确产生,以中断方式运行。列扫描是在行周期中断服务程序内直接以软件控制方式以最快的扫描速度实现的。图6.16给出了定时器3中断服务程序流程图。

定时器中断服务程序的实现与优化

驱动程序中定时器3的中断服务程序主要用于完成行列扫描以及一些附加的系统定时计数功能。

1.可用像素颜色与帧存的存储分配

根据之前描述的简化扫描方案,每个像素R、G、B 三色混合,每种颜色只用一位分别表示R、G、B三色是否被点亮,帧存中用一个字节的低三位表示这三个R、G、B位,即帧存中每个字节的bit0~bit2分别对应着R、G、B 三色LED 的亮灭,它们的不同组合总共能产生8种色彩,如表6.4所示。

表6.4 显示屏颜色编码

上述扫描方式产生的LED显示屏图像帧存规模是4 096字节,需要占用相同数量的内存资源。对于像51系列这样的低端单片机,片上存储空间十分有限,通常无法使用内部存储空间,必须扩展外部存储器用作帧存。这里采用的是STM32系列单片机,其片上随机存储器RAM 和闪存Flash都有相对较大的容量,将直接使用片上RAM 中的4 096个字节来构建示例所需的帧存而不用外扩存储器的方式。在驱动软件设计中,声明一个包含4 096个元素的一维字节数组来表示帧存,数组下标变化范围为0~4 095,即16进制的0x000~0xFFF,直接对应着显示屏上物理实像素的地址,如表6.5所示。

表6.5 帧存地址与LED显示屏像素地址的对应关系

从表6.5可以看出,若用行号Rx 表示显示屏一帧图像沿水平方向的坐标,用列号Cy表示显示屏一帧图像沿垂直方向的坐标,作为帧存的一维数据的地址Addr与行号Rx、列号Cy之间的转换公式为

Rx=Addr/64(取整)(www.daowen.com)

Cy=Addr%64(求模)

举例来说,地址为0的字节则对应着图像坐标原点;地址为1 343的字节对应着显示屏上第21行、第63列,即上半屏最后的像素点;地址为1 344的字节对应着显示屏上第22行、第0列,即用于汉字显示的第一个像素位置。

2.行扫描时钟、行列扫描及帧刷新

行扫描时钟是在驱动软件初始化的时候就已确定,每当STM32发生定时器3中断,当前行的扫描时间到。把帧存里的行Rx(取值范围是0~31)和行(Rx+32)的数据(共64×2字节)以列扫描周期(即像素周期Tp)高速移入移位寄存器,然后在显示屏上点亮这两行。把行号Rx加1,指向下一行,等下一个行扫周期到来时重复上述过程,当Rx=32,表明已经扫描了一帧,将它重新清零,回到图像的第0行,开始下一帧图像的刷新。行扫周期0.312 5ms由硬件定时器准确产生,以中断方式运行。列扫描是在行周期中断服务程序内直接以软件控制方式以最快的扫描速度实现的。图6.16给出了定时器3中断服务程序流程图

图6.16 定时器3中断服务程序流程图

进入中断服务程序,首先需要清除中断标记。接着就可以开始当前行的64像素的列扫描了。取出当前行的计数值RowCount,它对应着当前显示帧上当前行的起始地址pixelAddress=RowCount*64,由于是上、下半屏同时扫描,因此需要根据当前列的像素地址把上、下半屏与该地址对应的两个像素都取出。75E 接口及本例中的端口设计都要求把对应的下半屏的两个像素合成一个字节并在单片机STM32的PC口上输出。具体做法是:把下半屏的字节左移4位后与上半屏的字节进行按位或合并,从而生成当前像素字节。这个包含了上、下半屏上两个像素RGB 值的字节从STM32的PC 口输出,它们将出现在75E 的两组RGB 数据线上。在PA5引脚上产生一个脉冲,上述RGB数据便移入硬件移位寄存器一位。如此重复64次,上、下半屏各有完整一行像素数据移入硬件移位寄存器。禁止列驱动器输出,锁存这一行,使能列驱动器,完成这一行的列扫描。

完成一行扫描后,行计数值RowCount增1,然后需要做两个检查:一是有没有完成当前帧的扫描,即是不是完成了32行的扫描,如果没有完成,就继续下一行的扫描。二是若已经完成一帧,检查主程序上所做的用于实现滚动显示的更新帧是不是已经就绪,如果没有就绪,就继续当前显示帧的扫描,把行地址返回到当前显示帧头上;假如完成当前显示帧扫描后,发现更新帧已经就绪,则执行显示帧与更新帧的交换操作,把行地址指向新显示帧帧头,释放旧显示帧,并将它标识成更新帧,以便主程序可以把下一个滚动帧的内容填入。

定时器中断服务程序中还有一些附加的定时计数器,用于产生一个系统时间脉冲SysTicks。每进入一次中断服务程序,总是把SysTicks进行增量,从而系统中就有一个每312.5μs加1的自由运行的时钟脉冲计数。它主要被用于实现每30ms(即SysTicks=96)主程序执行帧存填充操作,把移动一列的新窗口内的显示数据写入更新帧。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈