stm32快速學(xué)習(xí)6——SysTick 定時(shí)1s控制LED
設(shè)置引腳功能
本文引用地址:http://m.butianyuan.cn/article/201611/315447.htm設(shè)置systick為1s中斷
利用systick中斷就可以得到1s時(shí)間
//////////////////////////////////////////////////////////////////////////前言/////////////////////////////////////////////////////////////////////////////////////////
stm32的systick通過(guò)少數(shù)的程序設(shè)置,當(dāng)使用systick_config()函數(shù)之后,其載入值就是你的參數(shù),并且自動(dòng)打開(kāi)中斷,并將中斷設(shè)為最低的優(yōu)先級(jí),將其時(shí)鐘設(shè)為HCLK即系統(tǒng)時(shí)鐘72mhz,并重置計(jì)數(shù)寄存器開(kāi)始計(jì)數(shù)。也可以將時(shí)鐘設(shè)置為HCKL的八分頻,通過(guò)使用SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) 緊跟在systick_config()之后,而改變優(yōu)先級(jí)則使用NVIC_SetPriority(SysTick_IRQn,...) 函數(shù),而時(shí)基單元的設(shè)置使用如下公式,Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s) Reload Value 就是傳遞進(jìn)去的參數(shù)。但參數(shù)不能超過(guò)0xFFFFFF。
使用systick延時(shí)的時(shí)候也可以不開(kāi)啟中斷,而直接對(duì)其寄存器進(jìn)行讀寫(xiě)
SysTick_Config(uint32_t
(SysTick_CTRL_CLKSOURCE_Msk),所以定時(shí)時(shí)間=ticks
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
這里使用3.4的庫(kù),注意是SystemCoreClock,3.0那些版本是用SystemFrequency這個(gè)單詞,其他2.x版本的方法是不同的。
注: 全局變量 TimingDelay , 必須定義為 volatile 類(lèi)型 , 延遲時(shí)間將不隨系統(tǒng)時(shí)鐘頻率改變。
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預(yù)取指緩存使能*/
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
/*Flash2waitstate,F(xiàn)LASH存儲(chǔ)器延時(shí)時(shí)鐘周期數(shù)*/
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();
}
評(píng)論