版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SysTick定时器配置精确延时函数设计绿色低碳设计理念STM32EMBEDDEDTECHNOLOGYSTM32嵌入式技术及应用任务3-1基于SysTick定时器实现LED灯1s闪烁控制项目三
篮球赛电子计分器的设计与实现CONTENTS目录01任务目标明确学习目标与能力要求,掌握SysTick定时器核心功能02知识储备STM32时钟系统与SysTick定时器原理详解03任务实施电路设计与程序开发,延时函数编写实战04任务总结核心知识点梳理与技能提升要点归纳05提升训练与评价知识问答、实践操作与任务评价标准CHAPTERONE01任务目标明确学习目标与能力要求掌握SysTick定时器核心功能TASKOBJECTIVES任务目标目标一掌握SysTick配置掌握SysTick定时器的配置与使用方法,深入理解其相关寄存器的功能与作用机制目标二编写延时函数学会利用SysTick相关寄存器和库函数编写微秒级和毫秒级延时函数,实现精确时间控制目标三优化代码性能将基于循环空语句的延时方式替换为SysTick定时器延时,优化代码性能,降低CPU占用率绿色低碳设计理念通过SysTick定时器实现精确延时,避免CPU空转等待,显著降低系统功耗。在不需要精确计时的场合,可通过减少SysTick使用频率或关闭定时器进一步降低功耗,体现绿色低碳设计思想。CHAPTERTWO02知识储备STM32时钟系统SysTick定时器原理CLOCKSYSTEMSTM32时钟系统概述时钟系统=CPU的"心跳"时钟系统是微控制器中各种操作的基本时序基准,如同心脏为人体提供节奏一样,为CPU和外设提供工作节拍。多时钟源设计STM32内部功能丰富、外设众多,不同外设对时钟频率需求各不相同:低速外设看门狗、RTC高速外设ADC、定时器设计优势:满足不同外设需求,优化功耗和性能STM32系统时钟树结构CLOCKSOURCESSTM32的时钟源高速时钟源HSI内部时钟High-SpeedInternal-采用RC振荡器,频率为8MHz,精度较低但启动时间短,可作为备用时钟源。启动快备用源HSE外部时钟High-SpeedExternal-可接石英/陶瓷谐振器或外部时钟源,频率范围为4~16MHz,稳定性高。高精度需外部元件PLL倍频输出PhaseLockedLoop-锁相环倍频输出,时钟输入源可选择HSI/2、HSE或HSE/2,倍频可选择2~16倍,输出频率最大不得超过72MHz。高频输出灵活配置低速时钟源LSI内部时钟Low-SpeedInternal-采用RC振荡器,频率为40kHz。在停机和待机模式下也能保持运行,为独立看门狗和自动唤醒单元提供时钟。低功耗模式运行IWDG时钟LSE外部时钟Low-SpeedExternal-接频率为32.768kHz的石英晶体,为RTC提供一个低功耗且精确的时钟源。RTC专用精确计时RTC时钟源选择:LSI(40kHz)、LSE(32.768kHz)或HSE的128分频CLOCKSTRUCTURE时钟系统结构系统时钟SYSCLKSTM32中绝大部分部件使用的时钟源,最大频率为72MHz可选择PLL输出、HSI或HSE作为时钟源系统复位后,HSI振荡器被选为SYSCLK的时钟源AHB总线时钟HCLK为AHB总线及其连接的外设提供时钟信号连接外设:内核、内存、DMA等HCLK的最大频率为72MHzAPB外设总线时钟PCLK1&PCLK21APB1总线时钟最大频率为36MHz,连接低速外设定时器TIM2~TIM7、串口USART2~USART5、I2C、SPI2、USB等2APB2总线时钟最大频率为72MHz,连接高速外设定时器TIM1和TIM8、ADC1~ADC3、USART1、SPI1、GPIO等其他时钟信号MCO:时钟输出引脚,为外部系统提供时钟源RTCCLK:RTC时钟源,可选LSI、LSE或HSE/128USB时钟:来自PLL,固定频率48MHzAPBPERIPHERALSAPB1和APB2连接的模块1APB1总线低速外设|最大36MHz电源接口备份接口CAN总线USB模块I2C1/I2C2UART2~5SPI2窗口看门狗Timer2~4USB模块需要单独的48MHz时钟信号给串行接口引擎(SIE)使用2APB2总线高速外设|最大72MHzUART1SPI1Timer1/Timer8ADC1~ADC3GPIOx(PA~PE)第二功能IO口GPIO外设挂接在APB2总线上,使用时需要先使能APB2总线时钟关键理解STM32的外设都是挂接在AHB和APB总线上的,要使能外设时钟,也就是使能对应外设所挂接的总线时钟。GPIO外设挂接在APB2总线上,因此使用GPIO前需要先使能APB2总线时钟。CLOCKCONFIGURATIONSTM32时钟配置与使用1定义系统时钟频率在项目中定义系统时钟的频率,取决于外部晶振(HSE)或内部RC振荡器(HSI)的频率,以及PLL倍频配置。//system_stm32f10x.c#defineSYSCLK_FREQ_72MHz720000002调用系统初始化函数SystemInit()函数用于配置系统时钟和其他关键参数,在系统启动时由启动代码自动调用。//main.cintmain(void){SystemInit();//...}3使能外设时钟使用外设前必须先使能其时钟。固件库已封装好时钟使能函数,放在stm32f10x_rcc.c中。//使能GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);时钟使能函数详解AHB总线RCC_AHBPeriphClockCmd()连接DMA、SRAM等高速模块APB1总线RCC_APB1PeriphClockCmd()连接TIM2~7、UART2~5等APB2总线RCC_APB2PeriphClockCmd()连接GPIO、TIM1/8、ADC等重要提示:为了降低功耗,STM32各外设时钟在芯片复位后默认关闭。用到哪个外设,就要使能相应的时钟信号。如果忘记开启时钟,后续配置操作将无效!PERIPHERALCLOCK外设时钟使能为什么需要开启时钟?在进行GPIO配置之前,需要确保相应的GPIO时钟已经打开。必须先开启时钟,才能进行后续的配置操作。系统才能正确地对GPIO引脚进行配置和控制时钟使能是外设正常工作的前提条件未开启时钟时配置操作将无效GPIO所在总线GPIOA~GPIOG都连接在APB2总线上时钟使能函数与代码示例//APB2总线外设时钟使能函数voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);参数1:外设选择要开启的外设,如GPIOA/GPIOB/GPIOC等参数2:使能状态ENABLE开启时钟,DISABLE关闭时钟//常用GPIO时钟使能代码示例//开启GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//同时开启GPIOA和GPIOBRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);初学者常见错误:忘记开启GPIO时钟就进行配置,导致引脚不按预期工作!SYSTICKOVERVIEWSysTick定时器概述什么是SysTick?SysTick,全称为SystemTickTimer,是一种内置于Cortex-M3内核芯片中的系统滴答定时器。广泛应用于基于Cortex-M3内核的处理器主要用于实现延时功能或作为RTOS心跳时钟位于Cortex-M3内核的内部工作方式1采用倒计数方式工作2当计数器值递减至0时,自动从RELOAD寄存器重新加载预设的初始值3持续运行,除非在CTRL寄存器中清除使能位低功耗特性:即便在睡眠模式下也能保持工作状态SysTick在系统中的位置Cortex-M3内核NVICSysTickCPUAHB总线(72MHz)GPIODMASRAMFlashSysTick定时器直接连接到AHB总线,可以使用HCLK或HCLK/8作为时钟源FOURFUNCTIONSSysTick定时器的四大作用RTOS时钟节拍单任务程序一旦出错易导致系统崩溃。实时操作系统(RTOS)通过并行任务处理解决这一问题。SysTick为RTOS提供稳定的时钟节拍,确保系统高效有序运行。任务调度时间管理简化程序移植SysTick普遍存在于ARMCortex-M3内核中,简化了程序移植。在RTOS移植时,SysTick降低了难度。同时,STM32的SysTick可用于实现延时,不占用中断和系统定时器资源。跨平台兼容延时功能闹铃与测量工具SysTick定时器除了服务于操作系统,还可作为闹铃定时器和时间测量工具,支持系统性能分析和调试。但需注意,处理器调试暂停时,SysTick也会暂停。定时提醒性能分析降低系统功耗在不需要精确计时的场合,可以通过减少SysTick定时器的使用频率或完全关闭定时器来降低功耗,体现绿色低碳设计理念。节能模式动态调整本任务应用重点在本任务中,我们就是利用STM32的SysTick实现精确延时功能,替代传统的循环空语句延时方式,提高代码效率和可移植性。REGISTERSSysTick定时器相关寄存器SysTick_Type结构体定义(core_m3.h)typedefstruct{__IOuint32_tCTRL;/*Offset:0x00控制与状态寄存器*/__IOuint32_tLOAD;/*Offset:0x04重装载值寄存器*/__IOuint32_tVAL;/*Offset:0x08当前值寄存器*/__Iuint32_tCALIB;/*Offset:0x0C校准值寄存器*/}SysTick_Type;1CTRL0x00控制与状态寄存器配置SysTick工作模式、使能定时器和中断,提供状态查询2LOAD0x04重装载值寄存器设置定时器计数器的初始值,计数到0时自动重装载3VAL0x08当前值寄存器读取或写入当前计数器值,写入时清零计数器4CALIB0x0C校准值寄存器读取校准值,用于校准定时器的溢出时间寄存器访问方式:通过SysTick->CTRL等结构体成员直接访问寄存器CTRLREGISTER控制与状态寄存器CTRL寄存器功能用于配置SysTick定时器的工作模式、使能定时器和中断,并提供定时器当前状态的查询功能。时钟源说明外部时钟源(STCLK)HCLK的1/8分频,即9MHz(当HCLK=72MHz)内核时钟(FCLK)直接使用HCLK,即72MHz计数时间计算:选用外部时钟源9MHz时,每减1代表1/9μsCTRL寄存器位定义位段名称类型描述16COUNTFLAGR上次读取后计到0则为1,读取自动清零2CLKSOURCER/W0=外部时钟源(STCLK);1=内核时钟(FCLK)1TICKINTR/W1=倒数到0产生异常请求;0=无动作0ENABLER/WSysTick定时器使能位//配置示例:使用外部时钟源SysTick->CTRL&=~(1<<2);//CLKSOURCE=0SysTick->CTRL|=(1<<0);//ENABLE=1OTHERREGISTERSLOAD、VAL、CALIB寄存器LOAD自动重装载值寄存器用于设置SysTick定时器的重装载值,即定时器计数器的初始值。位段名称复位值23:0RELOAD0//设置重装载值SysTick->LOAD=8999;VAL当前值寄存器用于读取或写入当前SysTick定时器的计数器值。读取时返回当前计数器的剩余值,写入时清零计数器的值。位段名称复位值23:0CURRENT0//读取当前值/清零uint32_tval=SysTick->VAL;SysTick->VAL=0;CALIB校准值寄存器用于读取SysTick定时器的校准值,包括重装载值(TENMS)和时钟源的准确度(SKEW、NOREF)。位段名称31NOREF30SKEW23:0TENMSTENMS:10ms间隔中倒计数的格数延时时间计算公式当使用外部时钟源9MHz时,延时1ms需要计数9000次(即LOAD=9000-1=8999)。计算公式:LOAD=(延时时间×时钟频率)-1LIBRARYFUNCTIONS(1/2)库函数:SysTick_CLKSourceConfig()函数定义(misc.c)voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource){assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));if(SysTick_CLKSource==SysTick_CLKSource_HCLK){SysTick->CTRL|=SysTick_CLKSource_HCLK;}else{SysTick->CTRL&=SysTick_CLKSource_HCLK_Div8;}}代码说明1.参数检查:assert_param()检查参数是否为有效的SysTick时钟源2.时钟源配置:根据参数设置CTRL寄存器的CLKSOURCE位3.宏定义:在misc.h中定义了时钟源选择宏宏定义(misc.h)//使用外部时钟源HCLK/8#defineSysTick_CLKSource_HCLK_Div8((uint32_t)0xFFFFFFFB)//使用内核时钟HCLK#defineSysTick_CLKSource_HCLK((uint32_t)0x00000004)//参数有效性检查#defineIS_SYSTICK_CLK_SOURCE(SOURCE)...使用示例//配置为外部时钟源HCLK/8SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//假设HCLK=72MHz//SysTick时钟=9MHz时钟频率:HCLK=72MHz时,外部时钟源为9MHzLIBRARYFUNCTIONS(2/2)库函数:SysTick_Config()函数定义(core_cm3.h)static__INLINEuint32_tSysTick_Config(uint32_tticks){if(ticks>SysTick_LOAD_RELOAD_Msk)return(1);SysTick->LOAD=(ticks&SysTick_LOAD_RELOAD_Msk)-1;NVIC_SetPriority(SysTick_IRQn,(1<<__NVIC_PRIO_BITS)-1);SysTick->VAL=0;SysTick->CTRL=SysTick_CTRL_CLKSOURCE_Msk|SysTick_CTRL_TICKINT_Msk|SysTick_CTRL_ENABLE_Msk;return(0);}代码说明1.参数检查:ticks值不能超过0xFFFFFF(16777215)2.设置重载值:LOAD=ticks-13.设置优先级:SysTick中断优先级设为15(最低)4.使能定时器:选择内核时钟,打开中断,使能定时器配置流程1参数有效性检查检查ticks是否超过最大值0xFFFFFF2设置重装载值LOAD=ticks-13设置中断优先级优先级设为15(最低优先级)4清零当前值VAL=05使能定时器选择时钟源,开启中断注意事项该函数默认使用内核时钟(HCLK)。若要使用外部时钟源(HCLK/8),需要先调用SysTick_Config(),再调用SysTick_CLKSourceConfig()进行分频配置。INTERRUPTHANDLERSysTick的中断服务函数启动文件定义SysTick定时器中断处理函数在startup_stm32f10x_ld.s启动文件中定义:;中断向量表DCDWWDG_IRQHandlerDCDPVD_IRQHandler...DCDSysTick_Handler;SysTickHandler编写中断服务函数SysTick定时器的中断服务函数名是SysTick_Handler,可以根据需要直接编写:voidSysTick_Handler(void){//中断服务函数体//添加用户代码}函数编写位置1stm32f10x_it.c在stm32f10x_it.c文件中已有SysTick_Handler函数声明,但内容为空,可以直接在里面添加中断服务函数体。2main.c也可以在main.c中编写中断服务函数,但需要把stm32f10x_it.h和stm32f10x_it.c文件中的相关内容注释掉。中断服务函数内容在中断服务函数体中,可以编写SysTick定时器中断需要完成的功能,例如:延时计数递减定时任务调度系统节拍计数CHAPTERTHREE03任务实施电路设计与程序开发延时函数编写实战TASKREQUIREMENTS任务实现要求任务目标在任务1-4LED闪烁控制的基础上进行优化将采用循环空语句实现延时的Delay_ms()函数,调整为采用SysTick定时器实现延时,硬件接口和代码部分不变。原方案循环空语句延时通过执行大量空操作消耗CPU时间CPU占用率100%延时不精确,受编译优化影响功耗高,浪费CPU资源新方案SysTick定时器延时利用硬件定时器实现精确延时CPU可执行其他任务延时精确,不受编译影响低功耗,可进入睡眠模式设计思路创建SYSTEM文件夹,在其子目录下新建delay子目录,并在子目录下新建delay.h头文件和delay.c源文件,实现延时初始化函数、微秒级延时函数和毫秒级延时函数。DELAY.Hdelay.h头文件编写完整代码#ifndef__DELAY_H#define__DELAY_H#include"sys.h"//初始化SysTick定时器,用于延时voiddelay_init(void);//延时nms毫秒(nms:需要延时的毫秒数)voiddelay_ms(u16nms);//延时nus微秒(nus:需要延时的微秒数)voiddelay_us(u32nus);#endif函数说明1delay_init()初始化SysTick定时器,配置时钟源,计算延时参数2delay_ms()毫秒级延时函数,参数为需要延时的毫秒数3delay_us()微秒级延时函数,参数为需要延时的微秒数头文件保护使用#ifndef、#define、#endif防止头文件被重复包含,避免编译错误。DELAY.C(1/3)delay.c源文件:延时初始化delay_init()函数代码#include"delay.h"#include"sys.h"staticuint8_tfac_us=0;//微秒延时的倍乘数staticuint16_tfac_ms=0;//毫秒延时的倍乘数voiddelay_init(void){//配置SysTick时钟源为HCLK的1/8SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//计算1微秒所需的SysTick计数值fac_us=SystemCoreClock/8000000;//计算1毫秒所需的SysTick计数值fac_ms=(uint16_t)(fac_us*1000);}关键代码解析时钟源配置选择外部时钟源(HCLK/8),当HCLK=72MHz时,SysTick时钟为9MHzfac_us计算fac_us=72000000/8000000=9表示延时1微秒需要9个SysTick时钟周期fac_ms计算fac_ms=9*1000=9000表示延时1毫秒需要9000个SysTick时钟周期计算公式:fac_us=SystemCoreClock/8MHzDELAY.C(2/3)delay.c源文件:微秒级延时delay_us()函数代码voiddelay_us(u32nus){u32temp;//加载重载值,设置延时时间SysTick->LOAD=nus*fac_us;//清零当前值寄存器SysTick->VAL=0x00;//使能SysTick定时器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//等待计数完成do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));//关闭定时器并重置SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;SysTick->VAL=0x00;}代码流程解析1设置重载值LOAD=nus*fac_us2清零计数器VAL=03使能定时器CTRL|=ENABLE4等待完成检测COUNTFLAG位5关闭定时器CTRL&=~ENABLE等待条件说明temp&0x01:判断定时器是否开启temp&(1<<16):检测COUNTFLAG位两者同时满足时继续等待DELAY.C(3/3)delay.c源文件:毫秒级延时delay_ms()函数代码voiddelay_ms(u16nms){u32temp;//加载重载值SysTick->LOAD=(u32)nms*fac_ms;//清零当前值寄存器SysTick->VAL=0x00;//使能SysTick定时器SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;//等待计数完成do{temp=SysTick->CTRL;}while((temp&0x01)&&!(temp&(1<<16)));//关闭定时器并重置SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;SysTick->VAL=0x00;}与微秒级延时的区别参数类型nms为u16类型,最大65535nus为u32类型,最大...重载值计算LOAD=nms*fac_msfac_ms=9000(延时1ms)延时范围最大延时:65535ms约65.5秒重要限制nus*fac_us的值不能超过0xFFFFFF(16777215),否则会导致计数溢出!BUILD&DEBUG工程编译与调试工程创建步骤1建立工程目录创建"任务3-1SysTick延时"目录2复制基础工程复制任务1-4工程并修改名称3创建子目录在SYSTEM下新建delay子目录4添加文件将delay.c、delay.h添加到工程5修改主文件包含delay.h,调用delay_init()常见编译错误Undefinedsymbol:未添加delay.c文件Cannotopenfile:头文件路径配置错误Multipledefinition:函数重复定义编译与仿真验证编译工程单击Rebuild按钮编译,生成.hex目标代码文件加载程序加载.hex文件到STM32F103R6芯片仿真验证单击"运行"按钮,观察LED是否按1秒周期闪烁调试技巧编译错误时仔细分析错误信息,定位问题。常见错误包括文件未添加、路径配置错误等。仿真时可用示波器观察LED引脚波形,验证延时精度。CHAPTERFOUR04任务总结核心知识点梳理技能提升与绿色设计SUMMARY(1/2)核心知识点总结STM32时钟系统时钟源类型高速:HSI(8MHz)、HSE(4-16MHz)、PLL低速:LSI(40kHz)、LSE(32.768kHz)时钟树结构SYSCLK→HCLK→PCLK1/PCLK2AHB(72MHz)、APB1(36MHz)、APB2(72MHz)时钟使能RCC_AHBPeriphClockCmd()RCC_APB1PeriphClockCmd()RCC_APB2PeriphClockCmd()SysTick定时器基本概念内置于Cortex-M3内核,24位倒计数定时器,用于延时或RTOS心跳相关寄存器CTRL(控制与状态)、LOAD(重装载值)VAL(当前值)、CALIB(校准值)时钟源选择外部时钟源:HCLK/8(9MHz)内核时钟:HCLK(72MHz)延时函数编写初始化流程配置时钟源→计算fac_us和fac_ms延时实现设置LOAD→清零VAL→使能定时器→等待COUNTFLAG→关闭定时器延时计算LOAD=延时时间×时钟频率-19MHz时钟:1ms=9000个时钟周期绿色低碳设计降低功耗使用SysTick替代循环延时,避免CPU空转,降低功耗睡眠模式SysTick在睡眠模式下仍可运行,支持低功耗设计动态调整不需要精确计时时可关闭SysTick,进一步降低功耗SUMMARY(2/2)技能提升与绿色设计程序开发掌握模块化编程思想熟练编写延时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 骨折急救处理流程培训方案
- 急性肾衰竭监测与护理培训
- 皮肤病患者的生活方式调整指南
- 知识服务与知识管理
- 养生策划方案活动环节(3篇)
- lng工厂施工方案(3篇)
- 住宅桩基施工方案(3篇)
- 冬天供水应急预案(3篇)
- hu项目施工方案(3篇)
- 台风应急预案环卫(3篇)
- 2025年江苏农林职业技术学院高职单招职业技能测试近5年常考版参考题库含答案解析
- 《IABP的临床应用》课件
- 冀教版八年级下册英语全册教学设计
- 【MOOC】电路基础-西北工业大学 中国大学慕课MOOC答案
- GB/T 44302-2024碳纤维增强塑料和金属组合件拉伸搭接剪切强度的测定
- 社保基金风险管理及内控措施
- 盒饭订餐协议书范本模板
- 气管插管气管切开吸痰术气管插管气管切开吸痰术
- 药品销售员管理制度及流程
- 《社区康复》课件-第六章 骨关节疾病、损伤患者的社区康复实践
- 2025届“新课程标准”下的中考道德与法治复习策略 课件
评论
0/150
提交评论