电子说
实时时钟——RTC
RTC(Real Time Clock)实时时钟,主要用于为人们提供精确的实时时间或者为系统提供精确的时间基准。RTC通常分为两类,一类是外部时钟芯片提供实时时钟,比如DS1302时钟芯片;另一类是CPU内部集成RTC模块。STM32F103内部集成了RTC模块,可以通过配置相应的寄存器来实现实时时钟的功能。
STM32内部有一块特殊区域,叫做备份区域(也叫后备区域),该区域主要包含了RTC核心模块和备份寄存器两部分。当STM32在系统电源工作的状态下,备份区域也是通过系统电源供电;当STM32的系统电源VDD掉电的情况下,备份区域可以自动切换到VBAT使用备用电源如电池、电容等进行工作,维持RTC运行,并且保护备份寄存器数据不丢失。STM32电源部分结构图如图8-1所示,如果没有接外部电池,建议将VBAT引脚通过一个100nF的陶瓷电容与电源VDD相连。
图8-1 STM32供电结构图
RTC模块主要由APB1接口和一组可编程计数器组成(RTC核心部件),如图8-2所示。其中APB1接口部分(图中蓝色框内)用来实现CPU通过APB1总线和RTC寄存器相互通信;RTC核心部分(图中红色框内)由一个RTC预分频模块和一个32位可编程计数器组成,这部分运行在后备区域(图示灰底部分)。
图8-2 RTC时钟结构框图
1、 RTC的时钟源 —— RTCCLK
RTCCLK可以通过备份域控制寄存器(RCC_BDCR)来选择其时钟源,可以分别用HSE/128、LSI或者LSE作为RTC时钟源。其中HSE是高速外部时钟,Kingst-32F1开发板中HSE采用的是8MHz的外部晶振,该时钟同样也是系统时钟源;LSI是低速内部时钟,由STM32内部RC振荡器产生,频率为40KHz,该时钟源受环境影响较大;LSE为低速外部时钟,需要外接频率为32.768KHz的晶振,LSE是一个低功耗且精准度相对较高的的时钟源。
当系统主电源关闭时,HSE无法工作,而如果采用LSI作为RTC时钟源,一方面精度相对较低,另外一方面会有相对大的功率消耗,所以大多数情况下RTC的时钟源是采用LSE,LSE的晶振的负载电容要求为6pF。
2、RTC预分频****模块
RTC预分频模块包含了一个20位的可编程分频器,可以通过对预分频装载寄存器RTC_PRL配置,实现RTCCLK时钟信号分频,每经过‘N+1’个时钟周期输出一个计时时间为1秒的RTC时间基准TR_CLK,如图8-2中左侧红框所示。如果在RTC_CR寄存器中设置了相应的允许位(SECIE位),每个TR_CLK周期RTC会产生一个中断。通常情况下,用户是将RTC时间基准配置成1秒,因此这个中断也常被称为秒中断。
图8-2种RTC_DIV是一个只读寄存器,它的作用是对输入的RTCCLK进行计数,当计数值与预分频寄存器中的值相匹配时,输出TR_CLK信号,然后重新计数。用户可以通过读取RTC_DIV寄存器,获取当前的分频计数器的当前值而不停止分频计数器的工作。当RTC_PRL或RTC_CNT寄存器中的数据发生改变后,RTC_DIV会由硬件重新装载。
3、 32位的****可编程计数器
RTC核心部分的第二个模块是一个32位可编程、向上计数的计数器,可以通过两个16位的寄存器(RTC_CNTH或RTC_CNTL)访问。此计数器以TR_CLK时间基准信号进行计数,计满后溢出,并且产生溢出标志位。当TR_CLK的周期为1秒时,计数器从0到溢出大概需要136年。
计数器按照TR_CLK周期累加外,同时与用户设定的RTC闹钟寄存器(RTC_ALR)的时间比较,一致则产生闹钟标志,如果此时开启中断,则会触发中断。
28.2 UNIX时间戳及时间转换问题
RTC模块本质是一个计数器,当设置RTC预分频模块输出周期为1秒的TR_CLK信号时,通过计算TR_CLK的周期数来获取从开始计数的0时刻到现在经过的秒数。计数器为0的时刻称之为计时元年,当前时间为计时元年加上计数器的计数值。
不同人或者不同系统规定的计时元年可能不同,换算成当前时间时会出现灾难性错误。为了解决这个问题,大部分操作系统普遍以格林尼治时间1970年1月1日0时0分0秒作计时元年,该时间最早在UNIX系统中使用,因此从计时元年到当前时间的经过的秒数也被称之为UNIX时间戳。
因此使用RTC模块时,首先要计算出当前时间的UNIX时间戳X,然后将时间戳X写入到RTC_CNT寄存器中并启动计时。获取当前时间时,先读出RTC_CNT寄存器的值,然后再加上计时元年,所得到的时间便是当前时间。
38.3 RTC模块基本操作
由于RTC核心部件位于后备区域,虽然RTC的寄存器读写由APB1接口完成,但是APB1接口在系统电源掉电时是停止工作的。由于RTC核心部件和APB1接口是相互独立的,因此他们使用不同的时钟源,当发生以下三种情况时,会导致时钟不同步。
(1)发生系统复位或电源复位
(2)系统刚从待机模式唤醒
(3)系统刚从停机模式唤醒
当发生以上三种情况,读写RTC相关寄存器之前,必须首先检测RTC_CRL寄存器中的RSF位,确保此位被置1,即RTC核心部件和APB1两者时钟同步,检测库函数如下:
当系统复位后,对后备寄存器和RTC的访问将被禁止,这是为了防止对后备区域的意外写操作。因此在配置RTC模块前应先设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟,代码如下:
使能后备区域时钟后还要使能电源的寄存器PWR_CR的DBP位来取消后备区域的写保护。代码如下:
设置RTC时钟源为LSE之前要先等待LSE时钟启动,保证LSE时钟正常起振。启动LSE时钟代码为:
LSE时钟起振成功后才可以设置RTC时钟源为LSE时钟并使能RTC,由于RTC使用的时钟源与APB1总线时钟并非同一时钟源,因此两者的时钟信号并不是同步的,需要等待RTC和APB1时钟同步。
以上操作完毕后,就可以配置RTC寄存器,配置过程如下:
(1)查询RTOFF位,直到RTOFF的值变为’1’
(2)置CNF值为1,进入配置模式
(3)对一个或多个RTC寄存器进行写操作
(4)清除CNF标志位,退出配置模式
(5)查询RTOFF,直至RTOFF位变为’1’以确认写操作已经完成。
需要注意的是,对RTC任何寄存器的写操作,都必须在前一次写操作结束后才能继续进行。可以通过查询RTC_CR寄存器中的RTOFF状态位,判断RTC寄存器是否处于更新中,仅当RTOFF状态位是’1’时,才可以写入RTC寄存器。配置完毕后需要清除CNF标志位(即退出配置模式)才算配置完成,否则无法更新RTC寄存器,这个过程至少需要3个RTCCLK周期。
代码如下:
以下是RTC模块的驱动代码:
RTC时钟由于晶振精度以及环境影响等原因,会存在一些误差,粗略测试每天会快2s左右,不同环境下误差可能有所不同。
48.4 初识触摸屏
触摸屏是一种可接收触头等输入信号的感应式液晶显示装置,当接触了屏幕的图形按钮时,屏幕上的触觉反馈可根据预先编写的程序驱动各种设备,可以替代机械式按钮,并且通过液晶显示更加生动的影音效果。触摸屏提供了一种简单、方便、自然的人机交互方式,赋予了多媒体崭新的面貌,是极富吸引力的全新多媒体交互设备,应用非常广泛。
按照触摸屏的工作原理和传输信息的介质区分,触摸屏可以分为电阻式、电容式、红外线式以及表面声波式,我们常见的主流应用是电阻式和电容式。
电阻触摸屏是在显示器表面附着一个多层复合薄膜,薄膜底层由玻璃或硬塑料构成,顶层为光滑防擦的塑料层,上下两层的内表面都涂有透明导电层,并且相互隔离开。上下两个薄膜层组成一个电阻网络,当手指按压屏幕时,上下导电层就会出现接触点,此时在X轴和Y轴分别施加电压,通过对比触摸点电压与施加电压可以计算出触摸点的X和Y坐标,确定触摸点的相对位置,电阻触摸屏的结构如图8-3所示。
图8-3电阻式触摸屏结构
电容触摸屏是利用人体的电流感应进行工作的四层复合玻璃屏,内外层都涂有特殊材料,当手指摸在金属层上时,由于人体电场,用户和触摸屏表面形成一个耦合电容,对于高频电流来说,电容是导体,于是手指从接触点吸走一个很小的电流,这个电流从触摸屏的四角的电极中流出,控制器通过对这四个电流比例的精确计算,得出触摸点的位置,电容屏触摸原理如图8-4所示。
图8-4 电容屏触摸原理
电阻屏和电容屏之间特点比较:
1、电阻屏靠压力使各层接触,因此可以用手指、指甲、触笔等进行操作;电容屏利用人体的电流与触摸屏之间形成耦合电场,从而触发电容感应系统,但是任何非导电物体如指甲、首套等无效,手写比较困难。
2、电阻屏精度可以达到单个显示像素,便于手写,有助于在精准操作;电容屏精度低,尤其是受限于手指接触面限制,难以提高精度。
3、电阻触屏价格比较低;电容屏成本比电阻屏贵10%到50%,在iPhone诞生之前的中低端手机大多是电阻屏,对成本不敏感的产品多采用电容屏。
4、电阻屏需要按下去,因此决定了他的顶部是软的,多用塑料材质,这使他容易产生划痕,但是通常不容易摔坏;电容屏外层通常使用玻璃,外层更不容易划坏,方便去除污迹,但是严重冲击容易碎裂,当然电容屏也有塑料材质。
5、电阻屏不能支持多点同时触摸;电容屏是可以支持多点同时触摸的。
6、电阻屏在恶劣环境下可以正常工作,而电容屏操作温度典型值是0到35度,至少5%的湿度,因此复杂的工业场合应用多用电阻屏。
7、电阻屏的可视效果相比电容屏差的多,尤其在阳光下,电容屏的可视效果优于电阻屏。
电阻屏通常分为四线电阻屏和五线电阻屏,Kingst-32F1开发板上的TFT-LCD采用的是4线制电阻触摸屏。
电阻式触摸屏的4个边对应 X+、Y+、X-、Y-四个电极,这也是4线电阻触摸屏的由来。当有笔尖或手指按压触摸屏表面时,触摸屏的电阻性表面相当于被分隔为两个串联的电阻,由于触摸屏的电阻值与触摸点到接地边之间的距离成正比,根据串联电阻之比等于电阻两端电压之比的原理,只需要测量出一端电阻的电压即可得到电阻之比,进而计算出触摸点到两边的距离之比,触摸屏等效电路如图8-5所示。
8-5触摸屏等效电路图
计算触点的X、Y坐标主要分为以下两步:
全部0条评论
快来发表一下你的评论吧 !