华南理工大学学士学位论文
? 获取温度的低字节 ? 获取温度的高字节
通过以上操作可以很方便的获取DS18B20的温度值。具体的实现函数在temperate.c文件里面,见附件。
3.2.9 RTC实时时钟驱动程序设计
RTC实时时钟是利用STM32F103RBT6内部的时钟模块实现的,根据STM32的? 使能电源时钟 ? 使能备份区域时钟 ? 取消备份区域写保护 ? 软复位备份区域 ? 开启外部低速晶振 ? 等待晶振就绪
? 设置LSI作为RTC时钟 ? RTC时钟使能 ? 设置时钟分频系数 ? 等待RTC寄存器操作结束 ? 允许RTC配置 ? 配置秒钟寄存器 ? 配置更新
? 等待RTC寄存器操作完成
到这里就结束了对RTC时钟的设置,RTC时钟在完成以上配置之后,就会每隔固定的时间,对秒钟寄存器(RTC->CNT)进行增1操作。此操作不需要软件参与,全部硬件执行。固定时间由时钟分频系数(RTC->PRL)确定,理论上由于外部低频晶振是32.768Khz,故只要在RTC->PRL内写入32768-1就可以得到精确的1秒了,但是由于晶振的误差,通常需要调整这个值,来得到比较准确的走时。
RTC的具体初始化函数和其他相关操作函数均在calendar.c里面,见附件。
DATASHEET,得到RTC实时时钟的初始化过程如下:
3.2.10 彩灯模块驱动程序设计
彩灯模块采用PWM控制,使用的是TIM4的CH1,CH2,CH3这三个通道来控制。因
为要控制每个通道灯的亮度,故采用固定频率,调制脉宽的方式来实现,对应到STM32上则为PWM模式1:在向上计数时,一旦TIMx_CNT
36
第三章 系统软件设计
(OC1REF=0),否则为有效电平(OC1REF=1)。通过设置TIM4的CCR1值,就可以调整输出的脉宽,从而控制LED的亮度。
TIM4的PWM初始化过程如下: ? TIM4时钟使能 ? PORTB时钟使能
? 设置PB6、7、8为复用功能输出 ? 设置TIM4计数器自动重装值 ? 设置TIM4与分频器值 ? 设置TIM4,CH1~3的工作模式 ? 设置TIM4,CH1~3的预装载使能 ? 使能TIM4预装载 ? 使能TIM4
通过以上过程就完成了对TIM4三个通道的初始化,只要在程序里面修改每个通道的比较寄存器(TIM4->CCRx)就可以实现不同占空比的输出了。在这里,我们设置TIM4的分频值为0,即不分频,这样TIM4的计数频率为系统时钟(72Mhz)。自动重装值为500,就可以得到72000/500=144Khz的PWM输出频率。TIM4的具体初始化函数和其他相关操作函数在rgbled.c文件里面,见附件。
以上介绍了驱动部分的程序设计,下面,我们介绍应用软件子系统的程序设计。
3.2.11 JPEG/BMP解码模块程序设计
JPEG/BMP图片播放是本系统的一个重要功能,两者的解码均采用软件实现,BMP的
解码相对JPEG比较简单,这里重点介绍JPEG的解码原理。 JPEG解码算法原理:
JPEG压缩是一种有损压缩。它利用人的视角系统特性,使用量化和无损压缩编码相结合的方式去掉视角的冗余信息和数据本身的冗余信息来达到压缩的目的。JPEG算法可分为基本JPEG(Baseline system)和扩展JPEG(Extended system)。其中Baseline system应用尤其广泛。本文主要讨论Baseline system的解码。JPEG解码算法框图如图3.9 所示:
图3.9 JPEG解码算法框图
37
华南理工大学学士学位论文
(1)颜色空间变换
JPEG算法本身与颜色空间无关,因此“RGB到YUV变换”和“YUV到RGB变换”不包含在JPEG算法中。但由于作为输出的位图数据一般要求RGB的表示,所以将颜色空间变换也表示在算法框图中。 (2)JPEG的编解码单元
在JPEG中,对于图像的编解码是分块进行的。整个图像被划分为若干个8×8的数据块,称为最小编码单元(MCU),每一个块对应于原图像的一个8×8的像素阵列;各行的编解码顺序是从上到下,行内的编解码顺序是从左到右。值得注意的是,由于一幅图像的高和宽不一定是MCU尺寸的整数倍,因此需要对图像的最右边一列或其最下边一行进行填充,扩展其高或宽,使得可以将整个图像划分为整数个MCU;而在解码输出时,这些复制的行列是要被抛弃的。 (3)熵解码器
在JPEG的熵编码时,首先利用空间相关性对各块的直流值采用差分编码,即对相邻块之间的直流差值编码,以达到压缩码长的目的。然后对于交流部分以 ZigZag方式扫描块中的元素,对块内元素采用先游程编码后哈夫曼编码的混合编码方式,得到一维二进制块码流。熵编码过程是由直流部分的差分编码和交流部分的ZigZag扫描、游程编码、哈夫曼编码组成。而相应的熵解码过程是编码的逆过程,在解码端接收到的是由变长码(VLC)和变长整数(VLI)组成的数据流。为了从此数据流中恢复编码前的DCT系数,必须根据哈夫曼编码的原理及其各级码表生成的细节,生成哈夫曼解码表,再根据解码算法来恢复DCT的直流和交流系数。 (4)反量化
在JPEG解码端要利用发送过来的量化表对量化值进行译码。JPEG文件里一般含有两个量化表:一个亮度分量的量化表,一个色度分量的量化表。反量化就是对熵解码出来的系数矩阵乘上相应的量化矩阵:
(5)IDCT。
变换JPEG解码算法能否满足实时应用,关键在于8×8的二维IDCT的计算速度。在编码阶段,正向离散余弦变换(FDCT)把空间域表示的图变换成频率域表示的图;相应地在解码阶段,逆向离散余弦变换(IDCT)将频率域表示的图变换为空间域表示的图。
以上介绍了JPEG解码算法,在本系统中JPEG/JPG的解码通过int Decode(void)函数实现。返回值为此次解码成功与否的标志。在执行该函数之前,需要先执行两个函数void InitTable(void)和int InitTag(void),第一个函数用来清空个量化表,第二个函数用来获取解码所需的各种参数,返回值为此次操作成功与否的标志。
38
其中,C(u,v)代表熵解码输出,Q(u,v)代表相应的量化矩阵。
第三章 系统软件设计
对于BMP的解码,则是通过BOOL BmpDecode(FileInfoStruct *BmpFileName)函数实现,
参数BmpFileName为BMP图片文件信息。返回值为解码成功与否的标志。对于BMP解码需要注意一个问题:每一行的字节数必须是4的整倍数,如果不是,则需要补齐。即BMP的水平像素必须是4的倍数,如果不是则需要取一个离4最近的整倍数,作为BMP的水平像素。
BMP和JPEG/JPG的解码与外部接口的函数为BOOL AI_LoadPicFile(FileInfoStruct *FileName,u8 sx,u16 sy,u8 ex,u16 ey),FileName为要打开的文件信息;sx、sy为图片开始显示的坐标;ex、ey为图片结束显示的坐标。
3.2.12 FAT文件系统模块程序设计
本系统要用到SD卡,不可避免要管理文件系统,所以,对文件系统的解析是本系统的
重点。本系统支持FAT16和FAT32文件系统,由于FAT文件系统是一个复杂而庞大的构架,这里我们仅简单介绍FAT32文件系统的构架,使我们能够正确的读取FAT32系统下的文件。
FAT32文件系统:
(1)DBR(DOS BOOT RECORD 操作系统引导记录区)
DBR 是我们进军FAT32 的首道防线。其实DBR 中的BPB (BIOS Parameter Block)部分才是这一区域的核心部分(第12~90 字节为BPB),只有深入详实的理解了BPB 的意义,才能够更好的实现和操控FAT32。关于DBR 在FAT32 中的地位就不多说了。DBR各字节意义如图3.10:
39
华南理工大学学士学位论文
图3.10 DBR区各字节意义
DBR区内,对我们有用的数据只不过90个字节(即BPB字段)。仅仅是这90 个字节就可以告诉我们关于磁盘的很多信息,比如每扇区字节数、每簇扇区数、磁道扇区数等等。对于这些信息的读取,只要遵循DBR 中的字段定义即可。BPB部分数据字节意义如图3.11所示:
40