您的位置 首页 ADAS

stm32快速学习6——SysTick 守时1s操控LED

设置使用外部8M晶振设置引脚功能设置systick为1s中断利用systick中断就可以得到1s时间//////////////////////////////////////////////////

设置运用外部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_tticks):设置体系嘀嗒时钟并使能中止

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_tSysTick_CLKSource)来设置

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

这儿运用3.4的库,留意是SystemCoreClock,3.0那些版别是用SystemFrequency这个单词,其他2.x版别的办法是不同的。

注: 全局变量 TimingDelay , 有必要界说为 volatile 类型 , 延迟时刻将不随体系时钟频率改动。

Main文件

#include”stm32f10x.h”

voidRCC_Configuration(void);

voidGPIO_Configuration(void);

voidSysTick_Configuration(void);

voidDelay(volatileuint32_tnTime);

staticvolatileuint32_tTimingDelay;

intmain(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);

}

}

voidRCC_Configuration(void) /*运用外部8M*/

{

ErrorStatusHSEStartUpStatus;

/*RCCsystemreset(fordebugpurpose)*/

RCC_DeInit();

/*EnableHSE*/

RCC_HSEConfig(RCC_HSE_ON);

/*WaittillHSEisready*/

HSEStartUpStatus=RCC_WaitForHSEStartUp();

if(HSEStartUpStatus==SUCCESS)

{

/*EnablePrefetchBuffer预取指缓存使能*/

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

/*Flash2waitstate,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=72MHz*/

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

/*EnablePLL*/

RCC_PLLCmd(ENABLE);

/*WaittillPLLisready*/

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

{

}

/*SelectPLLassystemclocksource*/

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

/*WaittillPLLisusedassystemclocksource*/

while(RCC_GetSYSCLKSource()!=0x08)

{

}

}

/*EnableGPIOCclock*/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

}

voidGPIO_Configuration(void)

{

GPIO_InitTypeDefGPIO_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);

}

voidSysTick_Configuration()

{

if(SysTick_Config(SystemCoreClock/1000))

{

/*Captureerror*/

while(1);

}

}

voidDelay(volatileuint32_tnTime)

{

TimingDelay=nTime;

while(TimingDelay!=0);

}

voidTimingDelay_Decrement(void)

{

if(TimingDelay!=0x00)

{

TimingDelay–;

}

}

Stm32f10x_it.c参加

voidTimingDelay_Decrement(void);

voidSysTick_Handler(void)

{

TimingDelay_Decrement();

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/268339.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部