嵌入式系统导论(第2版)-教学课件 嵌入式导论09_第1页
嵌入式系统导论(第2版)-教学课件 嵌入式导论09_第2页
嵌入式系统导论(第2版)-教学课件 嵌入式导论09_第3页
嵌入式系统导论(第2版)-教学课件 嵌入式导论09_第4页
嵌入式系统导论(第2版)-教学课件 嵌入式导论09_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式系统导论主讲教师:第9章STM32的定时器接口本章内容提要9.1系统时钟(SysTick)9.2STM32看门狗9.3STM32定时器(TIMx)9.4STM32实时时钟(RTC)定时器基于计数器电路实现STM32微控制器的定时器接口系统时钟(SysTick)看门狗WatchDog独立看门狗(IWDG)独窗口看门狗(WWDG)通用定时器基本定时器(TIM6和TIM7)通用定时器(TIM2、TIM3、TIM4和TIM5)高级控制定时器(TIM1和TIM8)实时时钟RTC9.1系统时钟(SysTick)Corte-M3在内核包含的简单定时器该定时器的时钟源可以来自CM3内部时钟(FCLK),或CM3外部时钟(STCLK)在STM32微控制器中,SysTick的时钟源可以是:“AHB时钟”、或者“AHB时钟/8”SysTick定时器是一个24位递减计数器设置初值、允许计数,每来一个时钟,计数值减1计数值减为0,计数器被自动载入初值、继续计数同时内部标志COUNTFLAG被置位、并触发中断SysTick中断连接中断控制器NVIC,异常号为15SysTick寄存器SysTick是CM3内核的定时单元参阅“Cortex-M3一般用户手册”(不是“STM32参考手册”)寄存器缩写寄存器中文名称SysTick_CTRL控制和状态寄存器SysTick_LOAD重载值寄存器SysTick_VAL当前值寄存器SysTick_CALIB校准值寄存器控制和状态寄存器(SysTick_CTRL)用于控制SysTick工作和获取计数归0的状态名称功能ENABLE计数器使能:0=禁止SysTick定时器,1=允许SysTick定时器TICKINTSysTick异常请求使能:0=不触发异常请求,1=触发异常请求(中断)CLKSOURCE选择时钟源:0=外部时钟,1=处理器时钟COUNTFLAG计数状态:上次读取后定时器计数到0,返回1SysTick寄存器编程(1)禁止SysTick定时器(因为SysTick可能已经被允许了)

SysTick->CTRL=0;//关闭SysTick(2)写入重载值

SysTick->LOAD=256-1;//假设计数值为256(3)清除当前值为0(向当前值寄存器SysTick_VAL写入任何值)

SysTick->VAL=0;(4)允许SysTick定时器

SysTick->CTRL=5;//使用处理器时钟SysTick结构定义系统时钟SysTick属于Cortex内核部件驱动程序定义在core_cm3.h(不是core_cm3.c)文件SysTick寄存器的结构类型

typedef

struct {__IOuint32_tCTRL; __IOuint32_tLOAD; __IOuint32_tVAL; __Iuint32_tCALIB; }SysTick_Type;有关地址定义的语句如下:

#defineSCS_BASE(0xE000E000) #defineSysTick_BASE(SCS_BASE+0x0010) #defineSysTick((SysTick_Type*)SysTick_BASE)SysTick配置函数_STATIC__INLINEuint32_tSysTick_Config(uint32_tticks){if((ticks-1UL)>SysTick_LOAD_RELOAD_Msk){return(1UL); }

SysTick->LOAD=(uint32_t)(ticks-1UL);NVIC_SetPriority(SysTick_IRQn,(1UL<<__NVIC_PRIO_BITS)-1UL);

SysTick->VAL=0UL;

SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|

SysTick_CTRL_TICKINT_Msk|

SysTick_CTRL_ENABLE_Msk;return(0UL);}初始化、并启动SysTick计数器和中断设置每隔ticks脉冲引起一次中断配置成功返回0值,不成功则返回1值SysTick_Config函数-11、将ticks参数作为重载值赋给重载值寄存器(SysTick_LOAD)定时时间T是:T=ticks×(1/f)秒f是时钟源的时钟频率2、使用NVIC_SetPriority函数 配置系统时钟中断(SysTickIRQ)为15如果要改变SysTick中断的优先级,使用

NVIC_SetPriority(SysTick_IRQn,...)(定义在core_cm3.h文件)SysTick_Config函数-23、复位SysTick计数器(清零)4、设置控制和状态寄存器(SysTick_CTRL)允许计数和中断选择处理器时钟源(STM32是“AHB时钟”)如果使用STM32的“AHB时钟/8”直接编程控制和状态寄存器(SysTick_CTRL) 设置CLKSOURCE(D2位)为0使用STM32库的SysTick_CLKSourceConfig函数(在misc.c文件中)SysTick应用示例:精确定时SysTick可服务于操作系统也可用于精确定时、时间测量等系统时钟72MHz,最小的计时单位(时钟周期)(1/72)×10-6秒、即72分之一的微秒结合GPIO控制LED灯的示例【例9-1】使用SysTick精确的硬件定时主程序需要对SysTick进行初始化例如配置1ms产生一次中断SysTick初始化主程序SysTick_Config函数配置1ms产生一次中断

if(SysTick_Config(SystemCoreClock/1000)){while(1);/*没有初始化成功,死循环*/}

SysTick->CTRL&=~1;/*关闭SysTick定时器*/SystemCoreClock常量表示系统主时钟频率开发板的时钟频率是最高72MHz定时时间(SystemCoreClock与f相同):

T=(SystemCoreClock/1000)×(1/f)秒

=10-3

秒=1毫秒=1ms硬件定时的延时函数定义TimingDelay为静态变量每次进入函数时,让其保持上次退出的数值 这个变量的改变是在中断服务程序中static__IOuint32_tTimingDelay=0;voidDelay_ms(__IOuint32_tnTime){TimingDelay=nTime;/*

nTime是延时时间

*/

SysTick->CTRL|=1;/*

启动SysTick定时器*/

while(TimingDelay!=0);}

voidDecrement(void){if(TimingDelay!=0)TimingDelay--;}中断服务程序voidSysTick_Handler(void){Decrement(); //每次中断,TimingDelay减1}延时500ms的延时函数调用

Delay_ms(500);9.2STM32看门狗WatchDog看门狗是嵌入式应用系统的一个安全机制常用于防止程序失去控制,避免系统导致严重后果各种干扰可能影响程序的正常执行,导致“跑飞”如果系统在规定的时间内没有执行特定的“喂狗”程序,看门狗就会报警,系统可以及时纠正错误看门狗机制的实质是定时器,当计数器达到给定的超时值时,触发一个中断或产生系统复位STM32微控制器支持两个看门狗独立看门狗(IWDG)窗口看门狗(WWDG)9.2.1独立看门狗(IWDG)由专门的低速时钟(LSI)驱动即使系统主时钟发生故障也仍然有效适合看门狗作为独立于主程序之外的处理进程、对时间精度要求不高的应用场合一个独立运行的12位减量计数器启动后,当计数值减量为0,导致系统复位Independentwatchdog独立看门狗结构寄存器缩写寄存器英文名称寄存器中文名称IWDG_KRKeyRegister关键寄存器IWDG_PRPrescalerRegister预分频寄存器IWDG_RLRReloadRegister重载寄存器IWDG_SRStatusRegister状态寄存器独立看门狗的启动和重载启动独立看门狗向关键寄存器(IWDG_KR)写入数值0xCCCC计数器从复位值0xFFF开始减量计数当计数值减至结束值0x000时,触发复位没有及时“喂狗”导致系统复位、进入初始状态重载独立看门狗(喂狗)向关键寄存器(IWDG_KR)写入关键值0xAAAA重载寄存器(IWDG_RLR)内的数值被重新加载到计数器,这样就防止了看门狗复位及时进行了“喂狗”,系统可以正常运行IWDG寄存器关键寄存器(IWDG_KR)在待机模式被复位为0只能写入0xCCCC(启动看门狗)、0xAAAA(重载计数值)和0x5555(允许访问预分频和重载寄存器)预分频寄存器(IWDG_PR)表示8种分频系数(4/8/16/32/64/128/256)重载寄存器(IWDG_RLR)用于写入重载的计数初值(12位计数器)可写入编码0x000~0xFFF依次表示1~4096计数值待机模式会将其复位为最大值0xFFFIWDG寄存器寄存器缩写寄存器英文名称寄存器中文名称IWDG_KRKeyRegister关键寄存器IWDG_PRPrescalerRegister预分频寄存器IWDG_RLRReloadRegister重载寄存器IWDG_SRStatusRegister状态寄存器IWDG定时时间分频系数最小定时(ms)最大定时(ms)40.1409.680.2819.2160.41638.4320.83276.8641.66553.61283.213107.22566.426214.4LSI=40KHzIWDG函数设置重载寄存器值voidIWDG_SetReload(uint16_tReload)

设置预分频系数voidIWDG_SetPrescaler(uint8_tIWDG_Prescaler)将重载寄存器的值重新装载给IWDG计数器voidIWDG_ReloadCounter(void)允许或禁止对重载寄存器和重载寄存器写入voidIWDG_WriteAccessCmd(uint16_tIWDG_WriteAccess)允许IWDG(写入重载寄存器和重载寄存器被禁止)voidIWDG_Enable(void)检测IWDG标志置位与否FlagStatus

IWDG_GetFlagStatus(uint16_tIWDG_FLAG)RCC标志检测和清除函数RCC_GetFlagStatus函数获得系统复位原因

FlagStatus

RCC_GetFlagStatus(uint8_tRCC_FLAG)参数RCC_FLAG表示要检测的标志,例如复位标志有RCC_FLAG_PINRST(引脚复位)RCC_FLAG_PORRST(电源开/电源关复位)RCC_FLAG_SFTRST(软件复位)RCC_FLAG_IWDGRST(IWDG复位)RCC_FLAG_WWDGRST(WWDG复位)RCC_FLAG_LPWRRST(低电源电压复位)FlagStatus返回置位(SET),表示发生了检测的复位返回复位(RESET),表示没有发生检测的复位RCC_ClearFlag函数清除(复位)上述所有复位标志

voidRCC_ClearFlag(void)【例9-2】IWDG应用示例:IWDG复位启用独立看门狗,设置约10秒的喂狗间隔用户在10秒内按下KEY1按键(需要每隔10秒内,连续按下)、让系统进行喂狗如果在10s内“喂狗”、LED3灯常亮,表示正常用户(连续)按下KEY1间隔超过10s程序没有及时“喂狗”,系统将复位复位后,系统重新执行程序检测到是由于IWDG导致的复位,LED2指示灯亮如果是其他原因导致的复位,LED1指示灯亮IWDG初始化配置voidIWDG_Config(void){//允许看门狗寄存器写入IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//时钟分频系数256IWDG_SetPrescaler(IWDG_Prescaler_256);//喂狗时间10s,设置计数值1562.5IWDG_SetReload(1563);//写入计数值(喂狗)IWDG_ReloadCounter();//允许IWDG看门狗IWDG_Enable();}IWDG主程序-1int

main(void){KEY_Config();

LED_Config();IWDG_Config();LED_ON_all();Delay(0x990000);//LED等亮一会表示系统复位

LED_OFF_all();//LED灯全灭IWDG主程序-2//

如果上次复位是IWDG复位,LED2亮if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST)==SET)

{LED_ON(2);

Delay(0x990000); //延时,让用户观察到

LED_OFF(2);

RCC_ClearFlag();

}//如果上次复位是不是IWDG复位,LED1亮else

{LED_ON(1); Delay(0x990000); //延时,让用户观察到

LED_OFF(1); }IWDG主程序-3//检测按键,适时喂狗while(1)

{if(KEY_scan(1)==

0){while(KEY_scan(1)==0);

IWDG_ReloadCounter();

LED_ON(3); Delay(0x990000); LED_OFF(3);

}}}9.2.3窗口看门狗(WWDG)时钟由APB1时钟分频后得到具有可配置的时间窗口用于检测应用程序过迟或过早的非正常操作适合在精确计时窗口起作用的应用程序一个独立运行的可编程减量计数器启动后,就设置了一个刷新时间间隔(窗口)在这个时间窗口内写入计数值,才保证系统不复位“喂狗”时间既不能太早、也不能太晚(或不喂)Windowwatchdog窗口看门狗结构窗口看门狗的定时时间【例9-3】WWDG应用示例:适时喂狗启用WWDG,设置约43~58ms的喂狗时间窗口系统如果在刷新时间窗口内“喂狗”LED2灯闪烁,表示正常工作使用按键KEY1按下模拟“喂狗”时间“喂狗”时间太早或时间太晚系统会复位让LED1灯闪烁启用提前唤醒中断EWI当喂狗时间太晚进入EWI中断服务程序让LED3灯闪烁WWDG初始化函数voidWWDG_Config(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG,ENABLE);WWDG_SetPrescaler(WWDG_Prescaler_8);WWDG_SetWindowValue(0x50);WWDG_Enable(0x7F);WWDG_ClearFlag();WWDG_EnableIT();}0x50=0x7F–0x2F启用WWDG提前唤醒中断NVIC初始化函数

……NVIC_InitStructure.NVIC_IRQChannel=WWDG_IRQn; ……WWDG中断程序voidWWDG_IRQHandler(void){LED_On(3);//LED3灯闪烁1次

Delay(0xffff);LED_Off(3); WWDG_ClearFlag();//清除WWDG中断标志位

}WWDG应用的主程序

WWDG_Config();//配置WWDGwhile(1){if(KEY_scan(1)==0){while(KEY_scan(1)==0); //等待按键结束

WWDG_SetCounter(0x7F);LED_On(2);

//喂狗时间合适时,LED2灯闪烁1次

Delay(0xffff);LED_Off(2); }}9.3STM32定时器2个基本定时器(TIM6、TIM7)主要用于产生数字模拟转换器(DAC)的触发信号也可用于普通的16位时基计数器4个普通定时器(TIM2-TIM5)能够测量输入信号的脉冲长度(输入捕获功能)产生需要的输出波形(输出比较、脉冲宽度调制PWM脉冲和单脉冲输出等)2个高级控制定时器(TIM1、TIM8)能够产生3对PWM互补输出的高级定时器常用于三相电机的驱动基本定时器(TIM6和TIM7)结构基本定时器(TIM6和TIM7)工作原理分频系数为2,计数值36基本定时器应用示例:周期性定时中断【例9-4】周期性定时中断,控制LED灯闪烁利用基本定时器(TIM6)的基本定时功能产生周期性定时中断控制LED灯每隔1秒闪烁一次定时时间=(计数值+1)×(预分频值+1)÷定时器时钟1s=2000×36000÷72M基本定时器的初始化配置voidTIM6_Config(void){TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);TIM_TimeBaseStructure.TIM_Prescaler=36000-1;TIM_TimeBaseStructure.TIM_Period=2000-1;TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

TIM_TimeBaseInit(TIM6,&TIM_TimeBaseStructure);

TIM_UpdateRequestConfig(TIM6,TIM_UpdateSource_Regular);

TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);TIM_Cmd(TIM6,ENABLE);}基本定时器的中断服务程序voidTIM6_IRQHandler(void){if(TIM_GetITStatus(TIM6,TIM_IT_Update)==SET){TIM_ClearITPendingBit(TIM6,TIM_FLAG_Update);GPIOB->ODR^=GPIO_Pin_0; //LED1灯反转

GPIOF->ODR^=GPIO_Pin_7; //LED2灯反转

GPIOF->ODR^=GPIO_Pin_8; //LED3灯反转

}}9.4STM32实时时钟可以依靠后备电池供电、维持运行的定时器提供日历、时钟以及数据存储等功能可用于重新设置系统当前的时间和日期RTC核心和时钟配置处于微控制器的备份区域实时时钟RTC(RealTimeCounter)RTC的简化结构RTC可屏蔽中断秒中断(RTC_Second)RTC预分频器用于生成RTC的时基(TR_CLK)这个时基可以编程为1秒每个TR_CLK周期,允许时可以产生一个秒中断闹钟中断(RTC_Alarm)系统时间以时基(TR_CLK)为单位增量可与保存在闹钟寄存器的可编程日期相比较用来产生闹钟中断溢出事件(RTC_Overflow)32位计数值溢出可以记录4294967296秒,约136年【例9-5】RTC应用示例:闹钟RTC秒中断控制LED1灯闪烁利用RTC的秒中断让LED1灯每0.5秒改变亮灭状态实现闪烁效果闹钟中断点亮LED2灯设置3s后产生闹钟中断用闹钟中断点亮LED2灯RTC初始化配置函数-1voidRTC_Config(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR|RCC_APB1Periph_BKP,ENABLE);PWR_BackupAccessCmd(ENABLE);if(BKP_ReadBackupRegister(BKP_DR1)!=0x5555){BKP_DeInit(); RCC_LSEConfig(RCC_LSE_ON);while(RCC_GetFlagStatus(RCC_FLAG_LSERDY)==RESET);RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

温馨提示

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

评论

0/150

提交评论