新聞中心

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

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沂水县| 屏边| 儋州市| 交口县| 陇川县| 琼结县| 海林市| 大埔县| 宁陕县| 九台市| 蚌埠市| 平阳县| 芜湖市| 新昌县| 广丰县| 景德镇市| 汝州市| 东明县| 清苑县| 林芝县| 理塘县| 靖宇县| 青海省| 阳西县| 丰台区| 许昌市| 密云县| 平舆县| 台湾省| 罗城| 宝山区| 康定县| 乌兰县| 建阳市| 韩城市| 阳原县| 克什克腾旗| 中山市| 西和县| 皮山县| 永德县|