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

发布者:世界因你而精彩最新更新时间:2022-04-18 来源: eefocus关键字:STM32-  SysTick  定时器控制 手机看文章 扫描二维码
随时随地手机看文章

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-  SysTick  定时器控制 引用地址:STM32-自学笔记(8.使用STM32的SysTick定时器控制LED灯闪烁)

上一篇:STM32-自学笔记(9.SysTick定时器控制LED灯闪烁,程序用到的库函数介绍)
下一篇:STM32-自学笔记(2.ARMCortex-M3内核构架)

推荐阅读最新更新时间:2024-11-13 10:17

stm32学习之四
systick(滴答定时器): 系统的滴答定时器可以测试的例子是,将开发板上的LED等轮流点亮即可(我选择的是1s轮流点亮三个LED等)。 首先,系统滴答定时器的特点是,设置开启定时器的话,会自动计数,这个时候,计数到0的时候,会触发中断。 可以设置一个静态的变量,全局进行计数,从而延时。 步骤: 1、建立一个SysTick.h文件,代码如下: #ifndef _SYSTICK_H #define _SYSTICK_H #include stm32f10x.h void SysTick_Init(void); //void timeDecrement(void); void delay(__IO ui
[单片机]
STM32F30X SYSTICK做非精确的delay功能
void delay_us(u16 n) { SysTick- LOAD = 48 * n; //装载计数器因为时钟为48Mhz,48次1us SysTick- CTRL = 0x00000005;//时钟来源设为为HCLK(48Mhz),打开定时器 while(!(SysTick- CTRL&0x00010000));//等待计数到0 SysTick- CTRL=0x00000004;//关闭定时器 } void delay_ms(u32 n) { while(n) { delay_us(1000); n--; } }
[单片机]
SysTick定时器介绍,SysTick定时器寄存器
SysTick定时器介绍 SysTick定时器也叫SysTick滴答定时器, 它是Cortex-M3内核的一个外设,被嵌入在 NVIC 中。它是一个 24 位向下递减的定时器,每计数一次所需时间为1/SYSTICK,SYSTICK 是系统定时器时钟,它可以直接取自系统时钟,还可以通过系统时钟 8 分频后获取,本套程序中我们采用后者,即每计数一次所需时间为1/(72/8)us,换句话说在 1us 的时间内会计数 9 次。当定时器计数到 0 时,将从LOAD 寄存器中自动重装定时器初值,重新向下递减计数,如此循环往复。如果开启 SysTick 中断的话,当定时器计数到 0,将产生一个中断信号。因此只要知道计数的次数就可以准确得到它的延
[单片机]
<font color='red'>SysTick</font><font color='red'>定时器</font>介绍,<font color='red'>SysTick</font><font color='red'>定时器</font>寄存器
STM32-(17):SPI与数码管,
数码管 数码管是一种应用很普遍的显示器件,从单片机、ARM到许多微型机控制系统及数字化仪器仪表中都用到数码管作为显示输出。 数码管的主要部分是七段发光_极管;数码管分为共阴极和共阳极两种;为了保护各段 LED ,需外加限流电阻。有的产品还附带有一个小数点,故有人叫其为八段式发光二极管。 由7个发光段的不同组合,从而实现十六进制数的显示。线面分别是共阴极和共阳极0-9的编码表。 数码管的连接方式 **段选端:**可以控制数码管显示内容; **位选端:**用于控制整个数码管是否工作:共阴极数码管,位选端要接地;共阳极数码管,位选端要接高电平 595芯片 串行转并行的芯片 引脚图 真值表 595工作
[单片机]
<font color='red'>STM32-</font>(17):SPI与数码管,
MSP430F5529火箭板 --->基于定时器A的LED灯闪烁实验
实验内容:上电点亮MSP430F5529 Launch Pad 上板载的红色LED,同时使用定时器让绿色LED闪烁 实验准备: 1、硬件:MSP430F5529 Launch Pad 2、软件:Code Composer Studio集成开发工具(CCS) 3、CCS的使用安装方法可参考 《Windows环境Code Composer Studio 下载和使用教程》 文章链接: link 4、本次实验使用到的物理层的分析可参考文章: link 一、定时器——Timer_A   在进入正题之前,我们先来了解一下MSP430F5529的定时器,本次实验我们使用Timer_A定时器,这里需要注意的是MSP430F5529一共有
[单片机]
MSP430F5529火箭板 --->基于<font color='red'>定时器</font>A的<font color='red'>LED灯</font><font color='red'>闪烁</font>实验
STM32-(21):NVIC中断
NVIC:提供中断控制器,用于总体管理异常,称之为“内嵌向量中断控制器:Nested Vectored Interrupt Controller (NVIC)”。NVIC和处理器内核紧密相连. 中断的概念: 1、为什么需要中断? 有很重要的事件需要处理 2、中断来之之后,CPU需要做什么? 首先保护现场,处理中断,恢复现场 3、中断完了之后,怎么办? 继续处理原来的事件 1.编写一个数码管不断刷新和显示的程序: 当用户按下键盘时,数码管停止更新;当用户再次按下键盘时,数码管继续更新。 按键电路: Main() { while(1) { //数码管的值的更新函数 //数码管刷新函数 //按键判断函数 } }
[单片机]
<font color='red'>STM32-</font>(21):NVIC中断
STM32-中断应用
1、基本概念 ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但是STM32中只使用4位,高4位有效),每4个通道的8位中断优先级控制字构成一个32位的优先级寄存器。68个通道的优先级控制字至少构成17个32位的优先级寄存器。 4bit的中断优先级可以分成2组,从高位看,前面定义的是抢占式优先级,后面是
[单片机]
stm32之Cortex系统定时器SysTick
SysTick时钟,俗称“嘀嗒定时器”,它能按设定的时间产生一次中断。控制工程代码中随处可见形如delay_ms()之函数。但是一直不清楚其内在机制。今天花时间研究了一下。 首先还是在数据手册上看一下SysTick寄存器的配置,如图: 寄存器说明 stm32的时钟源 选择外部时钟源时,则Systick时钟为HCLK /8 选择内核时钟源时,则Systick时钟为HCLK 延时编程原理 systick定时器是24位的递减计数器,设定初值并使能它后,它会把每个系统时钟周期计数器减1, 计数到0 时,将从RELOAD 寄存器中自动重装载定时器初值。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息. 延时编程
[单片机]
stm32之Cortex系统<font color='red'>定时器</font>(<font color='red'>SysTick</font>)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved