单片机
返回首页

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

2016-09-26 来源:eefocus

设置使用外部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();

}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 如何调制IC555振荡器

  • 基于ICL296的大电流开关稳压器电源电路

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章