SysTick定时器,被称为“系统节拍时钟”。SysTick属于ARM Cortex-M3内核的一个内设,STM32也带有SysTick定时器。
SysTick定时器的基本结构
SysTick工作原理:
SysTick从时钟源接口获得时钟驱动
从重装寄存器将重装值读入当前计数寄存器中,并在时钟驱动下进行减一计数。
当SysTick发生下溢时,将计数标志位置位,并且触发SysTick溢出中断,同时进行一次重装值载入操作。
实验说明:
使用STM32的SysTick定时器产生长度为1s的时间间隔,并以此时间间隔闪烁LED灯。
硬件电路:
GPIOA.4引脚接LED灯,再接一个限流电阻,最后接地。如图
软件设计(程序设计):
需要注意几点:
配置RCC寄存器组,使用PLL作为系统时钟源,并输出72MHz时钟频率。
打开GPIOA时钟,设置GPIOA.4引脚为推挽输出功能。
配置SysTick,选择经过8分频后的系统时钟源作为驱动时钟。
配置SysTick,写入预重装值,使SysTick产生1s 时间间隔。
重点在于根据不同的时钟频率计算SysTick的重装值。
假设选择PLL输出的72MHz作为STM32的主时钟,并将器8分频(72MHz/8=9MHz)后作为SysTick的驱动时钟。
SysTick的驱动时钟为:f=72MHz/8=9MHz
SysTick定时器进行一次“减一计数”所需要是的时间:T=1/f
那么1s所需的“减1计数”次数为:N=1/T=9000000
这就是重装值
程序
主函数 main.c
#include "stm32f10x_lib.h"
void RCC_Configuartion (void);
void GPIO_Configuartion (void);
void Systick_Configuration (viod);
void Delay_Second (void);
int main(void)
{
RCC_Configuartion (); //设置系统时钟
GPIO_Configuartion (); //设置GPIO端口
Systick_Configuration (); //设置Systick定时器
while(1)
{
GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)(1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4)));
//翻转GPIO.4电平
Delay_Second(); //延时1s
}
}
设置系统各部分时钟 RCC_Configuration
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义枚举类型变量 HSEStartUpStatus
RCC_DeInit(); //复位系统时钟设置
RCC_HSEConfig(RCC_HSE_ON); //开启HSE
HSEStatrtUpStatus=RCC_WaitForHSEStartUp(); //等待HSE起振并稳定
if(HSEStatrtUpStatus==SUCCESS) //判断HSE是否起振成功,是则进入if()内部
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择HCLK(AHB)时钟源为SYSCLK分频
RCC_PCLK2Config(RCC_HCLK_Div1); //选择PCLK2时钟源为HCLK(AHB)1分频
RCC_PCLK1Config(RCC_HCLK_Div2); //选择PCLK1时钟源为HCLK(AHB)2分频
FLASH_SetLatency(FLASH_Latency_2); //设置Flash延时周期数为2
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能Flash预取缓存
//选择PLL时钟源为 HSE 1 分频,倍频数为9,则PLL=8MHz *9=72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE); //使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL输出稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择SYSCLK时钟源为PLL
while(RCC_GetSYSCLKSource()!=0x08); //等待PLL成为SYSCLK时钟源
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //打开APB2总线上的GPIOA时钟
}
设置各GPIO端口功能 GPIO_Configuration
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//设置GPIOA.4为推挽输出,最大翻转频率为50MHz
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
设置Systick定时器,重装载时间为1s Systick_Configuartion
void Systick_Configuartion (void)
{
SysTick_CounterCmd(SysTick_Counter_Disable); //失能Systick定时器
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择HCLK为SysTick时钟源
SysTick_CounterCmd(SysTick_Counter_Clear); //清除Systick计数器
SysTick_SetReload(9000*1000); //主频为72/8MHz,配置计数值为9000*1000可以得到1s定时间隔
}
1s定时 Delay_Second
void Delay_Second (void)
{
SysTick_CounterCmd(SysTick_Counter_Enable); //启动Systick计数
while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)==0); //等待Systick计数至0
SysTick_CounterCmd(SysTick_Counter_Disable); //失能Systick定时器
SysTick_CounterCmd(SysTick_Counter_Clear); //清除Systick计数器
}
下一篇博客写本篇代码使用到的库函数。
上一篇:STM32-自学笔记(9.SysTick定时器控制LED灯闪烁,程序用到的库函数介绍)
下一篇:STM32-自学笔记(2.ARMCortex-M3内核构架)
推荐阅读最新更新时间:2024-11-13 10:17
设计资源 培训 开发板 精华推荐
- EVAL-AD7683SDZ,用于 AD7683BRMZ 8 引脚 MSOP 的 16 位、100 kSPS PulSAR ADC 评估板
- STEVAL-ILD005V1,基于 STF17N62K3 功率 MOSFET 的后沿相位控制旋转壁式调光器评估板
- 使用 MaxLinear, Inc 的 LP2950 的参考设计
- WS281x LED RS485 收发器
- 旋转LED电子钟
- Windows Hello
- Cube-109_RP2040开发板
- 21键433遥控
- LTC2645 的典型应用——具有 10ppm/摄氏度基准的四路 12 位/10 位/8 位 PWM 至 VOUT DAC
- ST2S06BPQR 典型应用电路 带复位或抑制的双路同步整流、0.5 A、1.5 MHz 可调降压开关稳压器