STM32F030, 使用嘀嗒定时器Systick实现LED闪烁

时间:2021-10-23 01:04:07

本文主要解决两个问题

1 STM32的IO口要反转,怎么实现?

2 嘀嗒定时器systick的配置

解答1:

单片机的口,反转非常easy。sbit led = P1 ^6;  led = ~led;而STM32的口要让它反转。如何实现呢?

非常easy,对想要反转的IO口取异或: GPIOx->ODR ^= GPIO_Pin;

解答2:

SysTick是1个24bit递减计数器

SysTick_Config(SystemFrequency / 10)   函数的形參就是systick重装定时器的值。

systck计数频率为每秒48000000次,所以4800000次就是1/10秒。也就是100ms。

SysTick的重装寄存器决定了定时器频率。

以下介绍STM32中的systick。Systick 部分内容属于NVIC控制部分。一共同拥有4个寄存器,名称和地址各自是: 

STK_CSR,        0xE000E010  --  控制寄存器 

STK_LOAD,     0xE000E014  --  重载寄存器 

STK_VAL,        0xE000E018  --  当前值寄存器 

STK_CALRB,   0xE000E01C  --   校准值寄存器 

首先看STK_CSR控制寄存器:寄存器内有4个位t具有意义 

第0位:ENABLE。Systick 使能位  (0:关闭Systick功能;1:开启Systick功能) 

第1位:TICKINT。Systick 中断使能位    (0:关闭Systick中断;1:开启Systick中断) 

第2位:CLKSOURCE,Systick时钟源选择  (0:使用HCLK/8 作为Systick时钟;1:使用HCLK作为Systick时钟) 

第3位:COUNTFLAG。Systick计数比較标志,假设在上次读取本寄存器后,SysTick 已经数到了0。则该位为1。假设读取该位,该位将自己主动清零 



STK_LOAD  重载寄存器: 

Systick是一个递减的定时器。当定时器递减至0时,重载寄存器中的值就会被重装载,继续開始递减。STK_LOAD  重载寄存器是个24位的寄存器最大计数0xFFFFFF。 



STK_VAL当前值寄存器: 

也是个24位的寄存器。读取时返回当前倒计数的值,写它则使之清零,同一时候还会清除在SysTick 控制及状态寄存器中的COUNTFLAG 标志。

STK_CALRB  校准值寄存器: 

这个寄存器好像眼下的水平我还用不到,大体意思明确点,把英文说明放这吧: 

位31 NOREF :1=没有外部參考时钟(STCLK 不可用)0=外部參考时钟可用 

位30 SKEW:1=校准值不是准确的1ms 0=校准值是准确的1ms 

位[23:0] :Calibration value 

Indicates the calibration value when the SysTick counter runs on HCLK max/8 as external clock. The value is product dependent, please refer to the Product Reference Manual, SysTick Calibration Value section. When HCLK is programmed at the maximum frequency, the SysTick period is 1ms. If calibration information is not known, calculate the calibration value required from the frequency of the processor clock or external clock.

cortex_m0.c文件里定义

<span style="font-size:14px;">/** \brief  System Tick Configuration

    The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
Counter is in free running mode to generate periodic interrupts. \param [in] ticks Number of ticks between two interrupts. \return 0 Function succeeded.
\return 1 Function failed. \note When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
must contain a vendor-specific implementation of this function. */
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */ SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}</span>



<span style="font-size:14px;">#include "SysTick.h"

__IO uint32_t TimingDelay;
uint32_t time_count = 0;
uint16_t idx_led = 0;
//SystemCoreClock/100000) 10 us 进入一次中断
void SysTick_Config_Init(void)
{
/* SystemFrequency / 1000 1ms中断一次
* SystemFrequency / 100000 10us中断一次
* SystemFrequency / 1000000 1us中断一次
*/
if(SysTick_Config(SystemCoreClock/1000))
{
while(1);
}
// 关闭滴答定时器
//SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
} /**
* @brief Inserts a delay time.
* @param nTime: specifies the delay time length, in milliseconds.
* @retval None
*/
void Delay_ms(__IO uint32_t nTime)
{
TimingDelay = nTime;
// 使能滴答定时器
// SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; while(TimingDelay != 0);
} /**
* @brief Decrements the TimingDelay variable.
* @param None
* @retval None
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00)
{
TimingDelay--;
}
} void SysTick_Handler(void)
{ TimingDelay_Decrement(); idx_led++;
if(idx_led >= 1000){
idx_led = 0;
GPIOA->ODR^=GPIO_Pin_4;
}
}</span>

STM32F030, 使用嘀嗒定时器Systick实现LED闪烁的更多相关文章

  1. Corex-M0 系统嘀嗒定时器 Systick 详解

  2. 利用滴答定时器&lpar;SysTick&rpar;实现简单的延时函数

    预备知识: 对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率. SysTick是CM4的内核外设,是一个24位的向下递减计数器,每次计数时间是1/SYSCLK,即1/168000000. ...

  3. 用定时器T0查询方式P0口8位控制LED闪烁

    #include<reg52.h> #define uchar unsigned char #define uint unsigned int void main (void) { uch ...

  4. 51单片机定时器实现LED闪烁

    要启用一个定时器,先要开启定时器,然后产生中断 系统中断: 初始化程序应完成如下工作: 对TMOD赋值,以确定T0和T1的工作方式. 计算初值,并将其写入TH0.TL0或TH1.TL1. 中断方式时, ...

  5. APP案例分析——嘀嗒番茄钟

    第一部分 调研, 评测 个人第一次上手体验 一直在用时间管理的软件,但是下载了卸载,来来去去也用了很多个.这个嘀嗒番茄钟也是最近比较喜欢的软件,界面简洁,功能简单,没有那么复杂非常容易上手. 功能性的 ...

  6. 系统滴答定时器&lpar;SysTick&rpar;中断配置

    系统滴答定时器(SysTick)中断配置 在STM32标准库中是通过SysTick_Config()函数配置时钟中断的,然后SysTick_Handler()函数自动定时触发其中的函数. if(Sys ...

  7. SAM4E单片机之旅——3、LED闪烁之定时器中断

    让一个LED灯闪烁不过瘾,我们应该让这块开发板完成一点更高难度的任务:比如让两个LED灯闪烁. …… 当然了,以我们的现在使用的空循环技术,还是可以实现这点的.但是这样显得略为低端.所以我们使用一个高 ...

  8. 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)

    /** ****************************************************************************** * @file main.c * ...

  9. 从多谐振荡器详细解析到555定时器基本电路(控制LED闪烁)

    在学期末,笔者参加了学校的电工实习,前六天做都很快,但是今天要做一个关于555多谐振荡器的LED闪烁电路,由于笔者没有提前准备,导致今天就算把电路搭建出来也不懂具体原理,耗费了不少时间,所以我打算专门 ...

随机推荐

  1. Data URI 应用场景小结

    Data URI scheme 在前端开发中是个常用的技术,通常会在 CSS 设置背景图中用到.比如在 Google 的首页就有用到: Data URI scheme 简称 Data URI,经常会被 ...

  2. 一些MEL命令

    这几天写maya脚本,发现一些新命令:   动画命令 cutKey 剪切某段动画曲线 simplify 简化某段曲线   基本命令 getAttr -size 数组属性名    获得数组属性的元素个数 ...

  3. java多线程:java队列详解

    队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列. 在队列这 ...

  4. 【转】一个FAE(AE)的体会和大家交流

    原文网址:http://www.52rd.com/bbs/dispbbs.asp?boardID=63&ID=228682 本人在国内某芯片设计公司工作近5年时间岗位是AE和FAE,两个工作量 ...

  5. metasploit魔鬼训练营 &lpar;安全漏洞生命周期&rpar;

    1,前期 渗透测试工程师在挖掘0day的出来的 2,前中期 在一个密封的团体里,互相交流,利用漏洞带来的价值和,金钱 3,中期 安全漏洞被披露!!黑客们快速掌握该漏洞 4,中后期 漏洞被制作成更为简单 ...

  6. Can’t call setState &lpar;or forceUpdate&rpar; on an unmounted component 警告处理方法

    Can’t call setState (or forceUpdate) on an unmounted component Warning: Can't call setState (or forc ...

  7. svn tree confflect

    同事提交了一些文件,我尝试更新那个目录, 却总是无法更新到他的提交, 一直都是工作空间的内容.而且资源管理器的目录图标显示, 出现变动(就是右上角有个红色的那种). 难道同事没有提交成功吗? 检查sv ...

  8. STL概论

    一.STL简介 1.STL(Standard Template Library,标准模板库)是C++标准库最主要和最重要的组成部分.其重要作用在于: (1)它可以用来创建动态增长和减小的数据结构: ( ...

  9. 【bzoj3730】 震波

    http://www.lydsy.com/JudgeOnline/problem.php?id=3730 (题目链接) 题意 给出一棵树,每个节点又一个权值.两个操作,询问距离节点${x}$不超过${ ...

  10. vs安装部署&OpenCurlyDoubleQuote;必备”组件里面正常情况没有出现office2010 PIA组件

    vs安装部署“必备”组件里面正常情况没有出现office2010 pia组件时,将 Office2010PIARedist 文件夹放在C:\Program Files\Microsoft SDKs\W ...