ARM Cortex-M3嵌入式开发及应用教与学 课件 第5、6章 按键与中断处理;定时器_第1页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第5、6章 按键与中断处理;定时器_第2页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第5、6章 按键与中断处理;定时器_第3页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第5、6章 按键与中断处理;定时器_第4页
ARM Cortex-M3嵌入式开发及应用教与学 课件 第5、6章 按键与中断处理;定时器_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARMCortex-M3嵌入式控制技术

——基于STM32F103RCT6

STM32F103硬件系统与KEILMDK工程第五章

按键与中断处理

本章将介绍嵌套向量中断控制器NVIC的工作原理,阐述STM32F103RCT6微控制器外部输入中断的工作原理。接着,以用户按键为例,详细解释NVIC中断的寄存器类型和库函数类型的程序设计方法。然后,介绍ZLG7289B芯片驱动LED灯、按键和数码管的原理和程序设计方法1NVIC中断工作原理2GPIO外部输入中断3

用户按键中断实例4ZLG7289B按键、LED灯和数码管5.1NVIC中断工作原理嵌套向量中断控制器NVIC相关的中断管理工作主要有开放中断、关闭中断、设置中断请求标志、读中断请求标志、清除中断请求标志和配置中断优先级等。嵌套向量中断控制器NVIC的寄存器有ISER0、ISER1、ICER0、ICER1、ISPR0、ISPR1、ICPR0、ICPR1、IABR0、IABR1、IPR0~IPR14和STIRNVIC寄存器序号地址寄存器名称描述10xE000E100ISER0中断开放寄存器ISER0[0]~ISER0[31]、ISER1[0]~ISER1[27]依次对应中断号为0~59的中断,各位写0无效,写1开放中断0xE000E104ISER120xE000E180ICER0中断关闭寄存器ICER0[0]~ICER0[31]、ICER1[0]~ICER1[27]依次对应中断号为0~59的中断,各位写0无效,写1关闭中断0xE000E184ICER130xE000E200ISPR0中断设置请求状态寄存器ISPR0[0]~ISPR0[31]、ISPR1[0]~ISPR1[27]依次对应中断号为0~59的中断,各位写0无效,写1请求中断0xE000E204ISPR140xE000E280ICPR0中断清除请求状态寄存器ICPR0[0]~ICPR0[31]、ICPR1[0]~ICPR1[27]依次对应中断号为0~59的中断,各位写0无效,写1清中断标志0xE000E284ICPR150xE000E300IABR0中断活跃位寄存器(只读)IABR0[0]~IABR0[31]、IABR1[0]~IABR1[27]依次对应中断号为0~59的中断,各位读出1,表示相应中断活跃0xE000E304IABR160xE000E400~0xE000E438IPR0~IPR14中断优先级寄存器共有16个优先级,优先级号从0~15,优先级号0表示的优先级最高,优先级号15表示的优先级最低70xE000EF00STIR软件触发中断寄存器第[8:0]位域有效,写入0~59中的某一中断号,则触发相应的中断中断优先级配置寄存器每个IPR寄存器用于设置4个NVIC中断的优先级,32位的IPR寄存器的4个字节的低4位均无效,只有高4位有效,故可以设置的优先级号为0~15。根据图5-1,如果设置EXTI2中断的优先级号为10,则需要将IPR2的第[7:4]位域设为10。当两个中断具有不同的优先级号时,优先级号小的中断优先级高;当两个中断具有相同的优先级号时,中断号小的中断优先级高。异常号4~15的优先级配置寄存器可配置优先级的异常的优先级号由3个系统手柄优先级寄存器(SHPR1~3)设置,其地址依次为0xE000ED18、0xE000ED1C和0xE000ED20序号异常号异常名称位域配置名称寄存器14MemManage[7:0]PRI_4SHPR125BusFault[15:8]PRI_536UsageFault[23:16]PRI_647保留[31:24]PRI_758保留[7:0]PRI_8SHPR269保留[15:8]PRI_9710保留[23:16]PRI_10811SVCall[31:24]PRI_11912DebugMonitor[7:0]PRI_12SHPR31013保留[15:8]PRI_131114PendSV[23:16]PRI_141215SysTick[31:24]PRI_155.2GPIO外部输入中断根据寄存器AFIO_EXTICR1~4(见第4章表4-3),可从GPIO口中选择16个管脚配置为16个外部中断的输入端,如图5-2所示。注意:对于STM32F103RCT6芯片,只有PA、PB、PC和PD[2:0]有效,其余管脚无效。EXTI模块共有19根线路,除了外部中断EXTI0~EXTI15外,还有EXTI16、EXTI17和EXTI18,这三根线路分别与PVD输出、RTC报警事件和USB唤配事件相连接。EXTI模块有共6个寄存器,即中断屏蔽寄存器EXTI_IMR、事件屏蔽寄存器EXTI_EMR、上升沿触发选择寄存器EXTI_RTSR、下降沿触发选择寄存器EXTI_FTSR、软件触发事件寄存器EXTI_SWIER和中断请求寄存器EXTI_PR。EXTI模块寄存器的基地址为0x40010400。5.3用户按键中断实例STM32F103RCT6微控制器的PA6和PA7依次借助网络标号USER_BUT1和USER_BUT2与按键S18和S19相连接;PB1与网络标号USER_BELL相连接,控制蜂鸣器B2的开启与关闭。本节拟设计工程,实现如下功能:(1)S18按键作为外部中断EXTI6输入端,当按下S18按键时,点亮LED灯D11;(2)S19按键作为外部中断EXTI7输入端,当按下S19按键时,熄灭LED灯D11。同时,如果蜂鸣器原来是开启的,则关闭蜂鸣器;否则,开启蜂鸣器。5.3.1寄存器类型工程实例在工程PRJ01的基础上,新建工程“PRJ03”,保存在目录“D:\STM32F103RCT6PRJ\PRJ03”下,此时的工程PRJ03与工程PRJ01完全相同。现在,修改main.c和includes.h文件,并新建bsp.c、bsp.h、beep.c、beep.h、key.c、key.h、exti.c和exti.h文件(新建的文件均保存在目录“D:\STM32F103RCT6PRJ\PRJ03\BSP”下),然后,将bsp.c、beep.c、key.c和exti.c文件添加到“BSP”分组下,建设好的工程如图所示。代码:11代码:12代码:13工程PRJ03的工作流程工程PRJ03运行到主函数main后,执行BSPInit函数初始化LED灯、按键、蜂鸣器和外部中断等外设,然后进行无限循环体,执行LED灯D9和D10的循环闪烁功能。工程PRJ03中有1个中断服务函数,当按键S18被按下时,执行EXTI9_5_IRQHandler中断服务函数,点亮LED灯D11;当按键S19被按下时,也触发执行EXTI9_5_IRQHandler中断服务函数,熄灭LED灯D11,同时,使蜂鸣器切换工作状态5.3.2库函数类型工程实例本小节讨论的工程与第5.3.1节的工程PRJ03实现的功能完全相同,这里使用库函数方式进行工程设计。在工程PRJ02的基础上,新建工程“PRJ04”,保存在目录“D:\STM32F103RCT6PRJ\PRJ04”下,此时的工程PRJ04与工程PRJ02完全相同,需要做的修改为:(1)修改文件main.c和includes.h;(2)新建文件bsp.c、bsp.h、key.c、key.h、beep.c、beep.h、exti.c和exti.h,新建的文件均保存在目录“D:\STM32F103RCT6PRJ\PRJ04\BSP”下;(3)将bsp.c、key.c、beep.c和exti.c文件添加到工程管理器的“BSP”分组下;(4)将位于目录“D:\STM32F103RCT6PRJ\PRJ04\STM32F10x_FWLib\src”下的库文件stm32f10x_exti.c添加到工程管理器的“LIB”分组下。建设好的工程PRJ04如图所示。代码:16代码:17代码:185.4.1ZLG7289B工作原理嵌入式控制系统中最常用的部件是按键和七段数码管,用作系统的输入设备和输出设备,ZLG7289B为专用于驱动按键和数码管的芯片。一片ZLG7289B可同时驱动64个按键和8个七段数码管(即64个LED灯)。STM32F103RCT6学习板上集成了一片ZLG7289B芯片,驱动了16个按键、8个LED灯和一个四合一七段数码管,电路原理图参考第3.8节。ZLG7289B芯片管脚布局如图所示“数码管段选信号”是指用于驱动七段数码管中的某个段的控制信号,一般连接到数码管的8个段控制管脚的某一脚上(8个段控制管脚为a、b、c、d、e、f、g和小数点dp);“数码管字选信号”也常被称为“数码管位选信号”,是指用于驱动多合一数码管中单个数码管的控制信号,一般连接到数码管的公共有效端,由于ZLG7289B只能驱动共阴式数码管,所以数码管字选信号连接到单个数码管的阴极公共端管脚号管脚名作用1RTCC电源,一般直接与VCC相连2VCC电源,2.7~6V3NC悬空4GND接地5NC悬空6CS片选信号,低电平有效,输入7CLK串行数据位时钟信号,下降沿有效,输入8DIO串行数据输入输出口,双向9INT按键中断请求信号,下降沿有效,输出10~17KR0~KR7键盘行信号0~7,同时也用作数码管段选信号,依次为g、f、e、d、c、b、a和dp18~25KC0~KC7键盘列信号0~7,同时也用作数码管字选信号0~726OSC2晶振输出信号27OSC1晶振输入信号28RST复位信号,低有效ZLG7289B访问时序。(a)为STM32F103RCT6向ZLG7289B写入单字节指令;(b)为STM32F103RCT6向ZLG7289B写入单字节指令+单字节数据;(c)为STM32F103RCT6向ZLG7289B写入单字节指令(0x15),然后读出单字节按键值,这里第一个指令字节必须为0x15七段数码管各个段的显示位置序号指令字节数据字节含义10xA4无清除显示内容20xBF无使全部LED灯闪烁30xA0无数码管显示左移40xA1无数码管显示右移50xA2无数码管显示循环左移60xA3无数码管显示循环右移70x80+k(dp<<7)|(d3d2d1d0)k为数码管位置号,取0~7(在图3-12中仅有4个数码管,即网标DIG0对应着0,DIG1对应着1,DIG2对应着2,DIG3对应3);dp=0表示小数点熄灭,dp=1表示小数点点亮;d3d2d1d0四位为0000b~1001b对应着显示0~9,为1010b显示“-”为1011b~1110b分别显示E、H、L和P,为1111b无显示80xC8+k(dp<<7)|(d3d2d1d0)k和dp的含义同上,d3d2d1d0为0000b~1111b时分别对应着显示0~9、A、B、C、D、E和F90x90+k(dp<<7)|(abcdefg)k和dp的含义同上,a、b、c、d、e、f、g对应着数码管的各段,为1时亮,为0时灭100x88d7d6d5d4d3d2d1d0di对应着第i个数码管,为0时闪烁,为1时不闪烁110x98d7d6d5d4d3d2d1d0di对应着第i个数码管,为1时正常显示,为0时消隐120xE000d5d4d3d2d1d0将数码管视为64个LED灯,d5d4d3d2d1d0表示6位地址,从000000b~111111b,表示64个LED灯的地址,每个数码管内,点亮顺度为“g、f、e、d、c、b、a、dp”,地址000000b对应着KR0和KC0相交的LED灯,000001b对应着KR1和KC0相交的LED灯,依此类推130xC000d5d4d3d2d1d0第12条指令为段点亮指令,这里为段熄灭指令,数据字节的含义同上140x15读出单字节数据读出的单字节数据包含按键值,键码从0~63(0x00~0x3F),无效值为0xFF,键码0对应着KC0与KR0相交的按键,键码1对应着KC0与KR1相交的按键,依此类推键名键码键名键码键名键码键名键码S162S558S954S1350S261S657S1053S1449S360S756S1152S1548S459S863S1251S1655ZLG7289B驱动的按键键码5.4.2寄存器类型工程实例本节将创建工程PRJ05,其在工程PRJ03基础上新添加的功能为:(1)四合一数码管每个显示管均周期性从0显示至9,且显示小数点和时间分隔符;(2)按下按键S1至S8中的Si(i=1,2,…,8)将点亮相应的LED灯Di;(3)按下按键S9至S16中的Si(i=9,10,…,16)将熄灭相应的LED灯Di-8。在工程PRJ03的基础上,新建工程“PRJ05”,保存在目录“D:\STM32F103RCT6PRJ\PRJ05”下,此时的工程PRJ05与工程PRJ03完全相同。现在,修改main.c、includes.h、bap.c文件,并新建zlg7289.c和zlg7289.h文件(新建的文件均保存在目录“D:\STM32F103RCT6PRJ\PRJ05\BSP”下),然后,将zlg7289.c文件添加到“BSP”分组下,建设好的工程如图所示。5.4.2寄存器类型工程实例本节将创建工程PRJ05,其在工程PRJ03基础上新添加的功能为:(1)四合一数码管每个显示管均周期性从0显示至9,且显示小数点和时间分隔符;(2)按下按键S1至S8中的Si(i=1,2,…,8)将点亮相应的LED灯Di;(3)按下按键S9至S16中的Si(i=9,10,…,16)将熄灭相应的LED灯Di-8。在工程PRJ03的基础上,新建工程“PRJ05”,保存在目录“D:\STM32F103RCT6PRJ\PRJ05”下,此时的工程PRJ05与工程PRJ03完全相同。现在,修改main.c、includes.h、bap.c文件,并新建zlg7289.c和zlg7289.h文件(新建的文件均保存在目录“D:\STM32F103RCT6PRJ\PRJ05\BSP”下),然后,将zlg7289.c文件添加到“BSP”分组下,建设好的工程如图所示。代码:26代码:27代码:28代码:29代码:30代码:31代码:325.4.2库函数类型工程实例本小节将要讨论的工程PRJ06与第5.4.2节的工程PRJ05实现的功能完全相同,这里使用库函数方式进行工程设计。需要强调指出的是,寄存器类型工程与库函数类型工程不是对立的,一个工程文件,既可以包含寄存器类型的代码,也可以包含库函数类型的代码。在工程PRJ04的基础上,新建工程“PRJ06”,保存在目录“D:\STM32F103RCT6PRJ\PRJ06”下,此时的工程PRJ06与工程PRJ04完全相同,需要做的修改为:(1)修改文件main.c、includes.h和bsp.c;(2)新建文件zlg7289.c和zlg7289.h文件,新建的文件均保存在目录“D:\STM32F103RCT6PRJ\PRJ06\BSP”下;(3)将zlg7289.c文件添加到工程管理器的“BSP”分组下。建设好的工程PRJ06如图所示。代码:34代码:35代码:36代码:37代码:38thankyou第六章

定时器目录系统节拍定时器看门狗定时器实时时钟通用定时器本章小结本章将介绍STM32F103RCT6片内定时器的结构和用法,按照从简单到复杂的顺序依次介绍系统节拍定时器、看门狗定时器、实时时钟和通用定时器,其中,系统节拍定时器是Cortex-M3内核的定时器组件,主要用于为嵌入式实时操作系统提供时钟节拍(一般取为100Hz)。STM32F103RCT6具有8个定时器,其中定时器1和定时器8为高级定时器、定时器2~5为通用定时器、定时器6和定时器7称为基本定时器,本章将主要介绍通用定时器,且以定时器2为例。16.1系统节拍定时器23系统节拍定时器SysTick属于Cortex-M3内核的组件,是一个24位的减计数器,常用于产生100Hz的定时中断(即系统节拍定时器异常),用作嵌入式实时操作系统μC/OS-II等的时钟节拍,系统节拍定时器的结构如下图所示。系统节拍定时器工作原理4了解STCTRL、STRELOAD、STCURR和STCALIB这4个寄存器的内容,即可掌握系统节拍定时器的工作原理。这4个寄存器的内容如下表所示。系统节拍定时器工作原理5根据上述对系统节拍定时器的分析,可知设计一个定时频率为100Hz(即定时周期为10ms)的系统时钟节拍定时器,可采用以下语句;(1)配置STCTRL为(1uL<<1)|(1uL<<2),即关闭系统节拍定时器并开放系统节拍定时器中断,同时设置系统时钟为系统节拍定时器时钟源。此时对于STM32F103RCT6微控制器使用内部8MHz时钟源而言,系统时钟为64MHz,芯片手册上明确说明:将系统时钟经AHB预分频器后的32MHz信号的8分频值用作系统节拍定时器的输入时钟信号(见图2-3),但实际测试发现,系统节拍定时器的输入时钟信号仍然是32MHz,即没有所谓的8分频器。(2)向STCURR寄存器写入任意值,例如写入0,清除STCURR的值,同时清除STCTRL的COUNTFLAG标志;(3)向STRELOAD寄存器写入320000-1,即十六进制数0x4E1FF。(4)配置STCTRL的第0位为1(其余位保持不变),启动系统节拍定时器。系统节拍定时器工作原理6系统节拍定时器相关的寄存器定义在CMSIS库头文件core_cm3.h中,如下面的程序段所示。系统节拍定时器工作原理7在CMSIS库头文件core_cm3.h中还定义了一个初始化系统节拍定时器的函数,如下面的程序段所示。系统节拍定时器工作原理8系统节拍定时器异常一般用作嵌入式实时操作系统的时钟节拍,也可以用作普通的定时中断处理。这里使用系统节拍定时器实现LED1灯D9的闪烁功能,其寄存器类型的工程实现步骤如下:(1)在工程PRJ05的基础上,新建工程“PRJ07”,保存在目录“D:\STM32F103RCT6PRJ\PRJ07”下,此时的工程PRJ07与工程PRJ05完全相同。(2)新建文件systick.c和systick.h,这两个文件保存在目录“D:\STM32F103RCT6PRJ\PRJ07\BSP”下,其代码分别如下面的程序段所示。系统节拍定时器实例9系统节拍定时器实例10系统节拍定时器实例11系统节拍定时器实例12将systick.c文件添加到工程管理器的BSP分组下,建设好的工程PRJ07如下图所示。系统节拍定时器实例13由图可知,在工程PRJ07中,主函数main主要完成了系统的外设初始化工作,同时,工程PRJ07保留了工程PRJ05中的全部功能,并添加了系统节拍定时器功能。由于配置了系统节拍定时器的工作频率为100Hz,所以,定时异常每触发100次相当于延时准确的1秒。通过添加静态计数变量,使得系统节拍定时器异常服务函数实现了每隔1秒使LED灯D9状态切换一次的功能。系统节拍定时器实例14系统节拍定时器的库函数类型工程的建设过程为:在工程PRJ06的基础上,新建工程PRJ08,保存在保存在目录“D:\STM32F103RCT6PRJ\PRJ08”下,此时的工程PRJ08与工程PRJ06完全相同,需要做的修改为:(1)修改文件main.c、includes.h和bsp.c;(2)新建文件systick.c和systick.h,如程序段6-3和程序段6-4所示,保存在目录“D:\STM32F103RCT6PRJ\PRJ07\BSP”下,并将文件systick.c添加到工程管理器的BSP分组下。系统节拍定时器实例6.2看门狗定时器1516STM32F103RCT6微控制中有两个看门狗,即独立看门狗和窗口看门狗。本书仅介绍复杂一些的窗口看门狗。看门狗定时器工作原理17在本小节中,拟把看门狗定时器WWDG用作普通的定时器,实现每隔约1秒LED灯D10闪烁的功能。在工程07的基础上,新建工程09,保存在目录“D:\STM32F103RCT6PRJ\PRJ09”下,此时的工程PRJ09与工程PRJ07完全相同。然后,执行以下的步骤:(1)修改main.c文件,使得main函数不再控制LED灯的闪烁。(2)新建文件wwdog.c和wwdog.h,保存在目录“D:\STM32F103RCT6PRJ\PRJ09\BSP”下。看门狗定时器寄存器类型实例18看门狗定时器寄存器类型实例19文件wwdog.h是文件wwdog.c对应的头文件,用于声明wwdog.c中定义的函数,这里第6行声明了WWDOGInit函数。看门狗定时器寄存器类型实例(3)在includes.h文件的末尾添加语句“#include"wwdog.h"”,即在总的包括头文件中包括文件wwdog.h。20(4)在bsp.c文件的BSPInit函数中,添加对函数WWDOGInit的调用,如下面的程序段所示。看门狗定时器寄存器类型实例21(5)将wwdog.c文件添加到工程管理器的“BSP”分组下。完成后的工程PRJ09如下图所示。看门狗定时器寄存器类型实例22在工程PRJ08的基础上,新建工程“PRJ10”,保存在“D:\STM32F103RCT6PRJ\PRJ10”目录下,此时的工程PRJ10与工程PRJ08完全相同。然后,进行如下的步骤:(1)新建文件wwdog.c和wwdog.h。这两个文件保存在目录“D:\STM32F103RCT6PRJ\PRJ10\BSP”下。看门狗定时器库函数类型实例23看门狗定时器库函数类型实例对比前面wwdog.c文件程序段中的看门狗中断服务函数WWDG_IRQHandler,这里的第22行为喂狗,即设置看门狗计数器的值为0x72;第33行调用WWDG_ClearFlag清零看门狗中断标志。24(2)修改main.c文件,在前一个工程段代码的基础上,删除第13~15行,即main函数不再控制LED灯的闪烁。(3)在includes.h文件的末尾,添加语句“#include"wwdog.h"”,即在总的包括头文件中包括头文件wwdog.h。(4)修改bsp.c文件,在bsp.c文件中的BSPInit函数中,添加语句“WWDOGInit();”,用于初始化窗口看门狗定时器。(5)添加目录“D:\STM32F103RCT6PRJ\PRJ10\STM32F10x_FWLib\src”下的文件stm32f10x_wwdg.c到工程管理器的“LIB”分组下;添加新创建的文件wwdog.c(保存在目录“D:\STM32F103RCT6PRJ\PRJ10\BSP”下)到工程管理器的“BSP”分组下。看门狗定时器库函数类型实例6.3实时时钟2526STM32F103RCT6微控制器的实时时钟结构如下图所示。实时时钟工作原理27下面详细介绍RTC模块的各个寄存器,RTC模块的基地址为0x40002800。(1)RTC控制寄存器RTC_CRHRTC_CRH(偏移地址0x0,复位值为0x0)是一个16位的寄存器,只有第[2:0]位有效,第2位为OWIE,为1表示开启溢出中断;第1位为ALRIE,为1表示开启报警中断;第0位为SECIE,为1表示开启秒表中断。(2)RTC控制寄存器RTC_CRLRTC_CRL(偏移地址0x04,复位值为0x0020)是一个16位的寄存器,只有第[5:0]位有效。第5位为只读的RTOFF位,读出0表示写RTC寄存器正处理中,读出1表示写RTC寄存器操作已完成;第4位为CNF位,写入1表示进入配置模式,写入0表示退出配置模式;第3位为RSF位,当RTC各个寄存器同步后硬件置1,可软件方式写入0清零;第2位为溢出中断标志位OWF,为1表示溢出中断发生了,写入0清零;第1位为报警中断标志位ALRF,为1表示报警中断发生了,写入0清零;第0位为秒中断标志位SECF,为1表示秒中断发生了,写入0清零。实时时钟工作原理28(3)RTC预装值寄存器RTC_PRLH和RTC_PRLLRTC_PRLH和RTC_PRLL(偏移地址为0x08和0x0C,复位值为0x0和0x8000)是两个16位的寄存器,RTC_PRLH的高14位保留,RTC_PRLH的第[3:0]位(作为PRL[19:16])与RTC_PRLL的第[15:0]位(作为PRL[15:0])组合成PRL[19:0],结合图6-6,TR_CLK=RTCCLK/(PRL[19:0]+1)。(4)RTC预分频器寄存器RTC_DIVH和RTC_DIVLRTC_DIVH和RTC_DIVL(偏移地址为0x10和0x14,复位值为0x0和0x8000)是两个只读的16位的计数器,其减计数到0后,RTC_PRLH和RTC_PRLL中的预装值将自动装入RTC_DIVH和RTC_DIVL中。实时时钟工作原理29(5)RTC计数器寄存器RTC_CNTH和RTC_CNTLRTC_CNTH和RTC_CNTL(偏移地址为0x18和0x1C,复位值均为0x0)是两个可读/可写的16位寄存器,用于保存RTC模块的时间和日历值。(6)RTC报警器寄存器RTC_ALRH和RTC_ALRLRTC_ALRH和RTC_ALRL(偏移地址为0x20和0x24,复位值均为0xFFFF)是两个只写的16位寄存器,用于保存RTC模块报警时的时间和日历值。当RTC计数器寄存器RTC_CNTH和RTC_CNTL的值分别与RTC_ALRH和RTC_ALRL的值相等时,产生RTC报警中断。实时时钟工作原理30在工程PRJ09的基础上,新建工程“PRJ11”,保存在“D:\STM32F103RCT6PRJ\PRJ11”目录下,此时的工程PRJ11与工程PRJ09完全相同。然后,进行如下的步骤:(1)修改文件main.c,如右面程序段所示,即在主函数的无限循环体中,不做具体的处理工作。实时时钟寄存器类型实例31(2)新建文件rtc.c和rtc.h,保存在目录“D:\STM32F103RCT6PRJ\PRJ11\BSP”下,这两个文件的内容如下面的程序段所示。实时时钟寄存器类型实例32实时时钟寄存器类型实例33(3)在includes.h文件的末尾添加语句“#include"rtc.h"”,即包括头文件rtc.h。(4)在bsp.c文件的BSPInit函数中,添加语句“RTCInit();”,如程序段6-15所示。实时时钟寄存器类型实例34(5)将rtc.c文件添加到工程管理器的“BSP”分组下。建设好的工程PRJ11如下图所示。实时时钟寄存器类型实例35本小节中使用库函数实现rtc.c文件中的全部功能,具体步聚如下:(1)在工程PRJ10的基础上,新建工程“PRJ12”,保存在目录“D:\STM32F103RCT6PRJ\PRJ12”下。此时的工程PRJ12与工程PRJ10完全相同。(2)修改文件main.c,主函数的无限循环体为空。(3)新建rtc.c和rtc.h文件,保存在目录“D:\STM32F103RCT6PRJ\PRJ12\BSP”下。实时时钟库函数类型实例36实时时钟库函数类型实例37实时时钟库函数类型实例(4)修改bsp.c文件,如程序段6-15所示,即添加对RTC初始化函数的调用语句。(5)在includes.h文件的末尾添加“#include"rtc.h"”,即包括头文件rtc.h。将rtc.c文件添加到工程管理器的“BSP”分组下,将目录“D:\STM32F103RCT6PRJ\PRJ12\STM32F10x_FWLib\src”下的文件stm32f10x_rtc.c、stm32f10x_pwr.c和stm32f10x_bkp.c添加到工程管理器的“LIB”分组下。工程PRJ12实现的功能与工程PRJ11完全相同,所使用的库函数可以在相应的库函数源文件或头文件中查阅。6.4通用定时器3839STM32F103RCT6具有8个定时器,其中,TIM1和TIM8为高级控制定时器,TIM2~TIM5为通用定时器,TIM6和TIM7为基本定时器。相对于传统的80C51单片机的定时器而言,STM32F103RCT6的定时器功能更加完善和复杂。这里以TIM2为例介绍通用定时器的基本用法。通用定时器40STM32F103RCT6微控制器具有4个通用定时器TIM2~TIM5,它们的结构和工作原理相同。这里以通用定时器TIM2为例介绍通用定时器的工作原理,TIM2的结构如下图所示。通用定时器工作原理41(1)TIM2控制寄存器TIM2_CR1(偏移地址0x0,复位值0x0)TIM2_CR1寄存器是一个16位的可读/可写寄存器,如下表所示。通用定时器工作原理42通用定时器工作原理(2)TIM2定时器计数器寄存器TIM2_CNT(偏移地址0x24,复位值0x0)TIM2_CNT寄存器是一个16位的可读/可写寄存器,保存了定时器的当前计数值。(3)TIM2定时器预分频器寄存器TIM2_PSC(偏移地址0x28,复位值0x0)TIM2_PSC寄存器是一个16位的可读/可写寄存器,TIM2计数器的计数频率=定时器时钟源频率/(TIM2_PSC+1)。如果采用32MHz的APB1总线时钟作为TIM2时钟源(理论分析应该为16MHz,但

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论