新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32快速學習6——SysTick 定時1s控制LED

        stm32快速學習6——SysTick 定時1s控制LED

        作者: 時間:2016-11-17 來源:網絡 收藏
        設置使用外部8M晶振

        設置引腳功能

        本文引用地址:http://www.104case.com/article/201611/315447.htm

        設置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();

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 南川市| 堆龙德庆县| 夏河县| 自贡市| 惠来县| 泌阳县| 霍林郭勒市| 邢台市| 黄山市| 桃园市| 莱阳市| 凤庆县| 阿勒泰市| 荆州市| 璧山县| 宾川县| 喀什市| 万荣县| 明星| 平山县| 祁连县| 伊宁县| 治多县| 丰都县| 台州市| 平山县| 祁连县| 扬州市| 托里县| 柘城县| 博乐市| 永修县| 阿荣旗| 当阳市| 基隆市| 伊金霍洛旗| 新龙县| 大英县| 观塘区| 安康市| 珲春市|