STM32-自学笔记(8.使用STM32的SysTick定时器控制LED灯闪烁)

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计数器

}

下一篇博客写本篇代码使用到的库函数。

猜你喜欢

转载自blog.csdn.net/niuyuce/article/details/85004038