stm32快速学习6——SysTick 定时1s控制LED

发布者:未来感知最新更新时间:2016-09-26 来源: eefocus关键字:stm32  SysTick  定时  控制LED 手机看文章 扫描二维码
随时随地手机看文章
设置使用外部8M晶振

设置引脚功能

设置systick为1s中断

利用systick中断就可以得到1s时间

//////////////////////////////////////////////////////////////////////////前言/////////////////////////////////////////////////////////////////////////////////////////

stm32的systick通过少数的程序设置,当使用systick_config()函数之后,其载入值就是你的参数,并且自动打开中断,并将中断设为最低的优先级,将其时钟设为HCLK即系统时钟72mhz,并重置计数寄存器开始计数。也可以将时钟设置为HCKL的八分频,通过使用SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) 紧跟在systick_config()之后,而改变优先级则使用NVIC_SetPriority(SysTick_IRQn,...) 函数,而时基单元的设置使用如下公式,Reload Value = SysTick Counter Clock (Hz) x  Desired Time base (s)  Reload Value 就是传递进去的参数。但参数不能超过0xFFFFFF。
systick的时钟,systick的时钟包括内部时钟和外部时钟,对于stm32 其内部时钟FCLK就是AHB的时钟,72MHz,外部时钟STCLK就是8分频后的时钟,9MHz。因此使用systick_config()函数时其默认时钟为72MHz。

使用systick延时的时候也可以不开启中断,而直接对其寄存器进行读写

SysTick_Config(uint32_t ticks):设置系统嘀嗒时钟并使能中断

         在STM32中与CM3内核描述不太一样,这个时钟源有两个选择:AHB/8和AHB,在该函数中是选择了HCLK.

(SysTick_CTRL_CLKSOURCE_Msk),所以定时时间=ticks HCLK,当要定时10ms,而HCLK为24MHz时,ticks 10000 24 240000。

         如果需要选择HCLK/8,可以直接修改这个函数,或在这个函数后跟随misc中的SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)来设置

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

这里使用3.4的库,注意是SystemCoreClock ,3.0那些版本是用SystemFrequency这个单词,其他2.x版本的方法是不同的。

stm32快速学习6——SysTick 定时1s控制LED - Bkey - Bkey的博客

 

 

注: 全局变量 TimingDelay , 必须定义为 volatile 类型 , 延迟时间将不随系统时钟频率改变。

【转载】stm32快速学习6——SysTick 定时1s控制LED -  ╄→风、吹不散 - ╄→风、吹不散

  

Main文件

#include "stm32f10x.h"

 

void RCC_Configuration(void);

void GPIO_Configuration(void);

void SysTick_Configuration(void);

void Delay(volatile uint32_t nTime);

 

static volatile uint32_t TimingDelay;

 

 

int main(void)

{

  RCC_Configuration();

  GPIO_Configuration();

  SysTick_Configuration();

 

  while(1)

  {

    GPIO_SetBits(GPIOA, GPIO_Pin_0); 

    Delay(1000);

    GPIO_SetBits(GPIOA, GPIO_Pin_1);

    Delay(1000);

    GPIO_ResetBits(GPIOA, GPIO_Pin_0);

Delay(1000);

    GPIO_ResetBits(GPIOA, GPIO_Pin_1);

Delay(1000);

  }

}

 

void RCC_Configuration(void) /*使用外部8M*/

{    

  ErrorStatus HSEStartUpStatus;

 

  /* RCC system reset(for debug purpose) */

  RCC_DeInit();

 

  /* Enable HSE */

  RCC_HSEConfig(RCC_HSE_ON);

 

  /* Wait till HSE is ready */

  HSEStartUpStatus = RCC_WaitForHSEStartUp();

 

  if(HSEStartUpStatus == SUCCESS)

  {

    /* Enable Prefetch Buffer 预取指缓存使能*/

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

 

    /* Flash 2 wait state , FLASH存储器延时时钟周期数*/

    FLASH_SetLatency(FLASH_Latency_2);

 

    /* HCLK = SYSCLK */

    RCC_HCLKConfig(RCC_SYSCLK_Div1); 

  

    /* PCLK2 = HCLK */

    RCC_PCLK2Config(RCC_HCLK_Div1); 

 

    /* PCLK1 = HCLK/2 */

    RCC_PCLK1Config(RCC_HCLK_Div2);

 

    /* PLLCLK = 8MHz * 9 = 72 MHz */

    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

 

    /* Enable PLL */ 

    RCC_PLLCmd(ENABLE);

 

    /* Wait till PLL is ready */

    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)

    {

    }

 

    /* Select PLL as system clock source */

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

 

    /* Wait till PLL is used as system clock source */

    while(RCC_GetSYSCLKSource() != 0x08)

    {

    }

  }

 

  /* Enable GPIOC clock */

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

}

 

 

void GPIO_Configuration(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

}

 

void SysTick_Configuration()

{

  if (SysTick_Config(SystemCoreClock / 1000))

  { 

    /* Capture error */ 

    while (1);

  }

}

 

void Delay(volatile uint32_t nTime)

  TimingDelay = nTime;

 

  while(TimingDelay != 0);

}

 

void TimingDelay_Decrement(void)

{

  if (TimingDelay != 0x00)

  { 

    TimingDelay--;

  }

}

 

 

 

 

Stm32f10x_it.c加入

 

void TimingDelay_Decrement(void);

 

void SysTick_Handler(void)

{

  TimingDelay_Decrement();

}

关键字:stm32  SysTick  定时  控制LED 引用地址:stm32快速学习6——SysTick 定时1s控制LED

上一篇:STM32掉电检测+Flash存取
下一篇:stm32快速学习2——点亮LED

推荐阅读最新更新时间:2024-03-16 15:12

stm32(库函数)——新建基于固件库的MDK5工程模板
这里根据STM32不完全手册记录建立库函数版本的基于固件库的MDK5工程模板。 1、我们每一次新建工程都会新建一个文件夹存放所有文件。 2、点击MDK的菜单:Project— New Uvision Project,新建工程文件,然后将目录定位在刚刚新建的文件夹之下,然后新建一个子文件夹重命名为USER(存放代码工程等文件),当然也不一定,比如很多人也喜欢新建为project,这些都是因人而异了。 接下来就是选择CPU界面,选择我们使用的芯片型号。 这里我使用的是STM32F103ZET6,所以我就依次选择STMicroelectronics— STM32F1 Series— STM32F103— STM32
[单片机]
<font color='red'>stm32</font>(库函数)——新建基于固件库的MDK5工程模板
按键控制LED 开关
本工程板级支持包文件适用于野火stm32f429 开发板。 本工程中涉及bsp_led.c, bsp_led.h 等文件,请前往STM32F429 4. 使用固件库点亮LED进行查看 bsp_key.c /** ****************************************************************************** * @file bsp_key.c * @author Waao * @version V1.0.0 * @date 20-Dec-2018 * @brief This file contains some board support pack
[单片机]
SD卡及STM32的SDIO接口相关原理
SD卡 SD卡(Secure Digital Memory Card)即:安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。 SD卡按容量分类,可以分为3类:SD卡、SDHC卡、SDXC卡 容量 命名 简称 0~2G Standard Capacity SD Memory Card SDSC或SD 2G~32
[单片机]
SD卡及<font color='red'>STM32</font>的SDIO接口相关原理
标准库函数与基于HAL库函数的说明
开始学习51的时候有的人会直接选择进行对单片机的寄存器进行操作,可以很好的理解单片机的工作原理,对于代码的编写也会后很好的理解,但是在stm32的时候操作寄存器就不太行了,因为stm32的寄存器是51的数十倍,如此多的寄存器根本无法全部记忆,开发时需要经常的翻查芯片的数据手册,此时直接操作寄存器就变得非常的费力了。这是我们就有了其他的操作方式,来简化我们的工作。 一、标准库 STM32有非常多的寄存器,导致了开发困难,所以为此ST公司就为每款芯片都编写了一份库文件,也就是工程文件里stm32F1xx……之类的。在这些 .c .h文件中,包括一些常用量的宏定义,把一些外设也通过结构体变量封装起来,如GPIO口时钟等。所以我们只需
[单片机]
STM32之IO输出方式理解
下面是开漏和推挽的区别: 开漏输出就是不输出电压,低电平时接地,高电平时不接地。如果外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机电压低的时候。 推挽输出就是单片机引脚可以直接输出高电平电压。低电平时接地,高电平时输出单片机电源电压。这种方式可以不接上拉电阻。但如果输出端可能会接地的话,这个时候输出高电平可能引发单片机运行不稳定,甚至可能烧坏引脚。
[单片机]
STM32学习笔记——RCC系统时钟配置
//学习RCC的配置方法,以后可以直接用 #include stm32f10x_lib.h //#define SYSCLK_HSE //#define SYSCLK_FREQ_20MHz //#define SYSCLK_FREQ_36MHz //36MH工作 //#define SYSCLK_FREQ_48MHz //48MH工作 通过宏定义改变系统时钟频率 #define SYSCLK_FREQ_72MHz //工作72MH #define DELAY_COUNT 0xFFFFF GPIO_InitTypeDef GPIO_InitStructure;
[单片机]
使用STM32定时器PWM功能时的小问题
有人使用STM32定时器的PWM功能,遇到点小疑问,这里一起看看。 他先将STM32某定时器计数周期设为0xff,单向递增计数模式,OC比较值设为0x7F。在某时刻将新的计数周期0x7F与比较值0x3F加载到影子寄存器。当正在进行的一个周期结束后,经示波器测量确实可以看到其下一个周期发生变化,但其周期明显与预设值对应不上!再次经过一个周期,定时器才会按照预设值稳定输出。 以上是咨询者不算很清晰的描述【其实咨询TIMER问题最好配上时序图】,但可以了解到他要做的事情就是在ARR=0xff,ccr=0x7F的PWM输出状态下,于某时刻赋予ARR和CCR新值以改变输出波形。 事情不算复杂,疑点就是为什么需要2个周期延时后才能有基
[单片机]
使用<font color='red'>STM32</font><font color='red'>定时</font>器PWM功能时的小问题
EM78P447S单片机及其在直流电机红外遥控系统中的应用
1 EM78P447S的主要特点 EM78系列单片机是台湾义隆电子股份有限公司采用CMOS工艺制造的8位高性价比单片机。该系列单片机一般都内置看门狗计数器(WDT)、RAM、ROM、可编程定时/计数器、预分频器以及5层堆栈。该系列器件的绝大部分指令只需两个振荡周期,同时具有内外部中断、低电压检测复位、可编程I/0、内部上拉电阻和集电极开路输出、SLEEP方式等功能。另外,EM78P447S单片机还具有编程简单、速度快、功耗小、成本低等优点,能广泛应用于玩具、家电、工业控制等方面。 EM78P447S的主要性能特点如下: ●工作电压范围:2.5-5.5V; ●允许温度范围:0-70°C; ●工作频率范围: 石英振荡型:5
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved