在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32 入門(mén)教程 系統(tǒng)時(shí)鐘 SysTick

            STM32 入門(mén)教程 系統(tǒng)時(shí)鐘 SysTick

            作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò) 收藏
            (一) 背景介紹

            在傳統(tǒng)的嵌入式系統(tǒng)軟件按中通常實(shí)現(xiàn) Delay(N) 函數(shù)的方法為:

            本文引用地址:http://www.biyoush.com/article/201611/319239.htm

            for(i = 0; i <= x; i ++);

            x --- 對(duì)應(yīng)于 對(duì)應(yīng)于 N 毫秒的循環(huán)值

            對(duì)于STM32系 列微處理器來(lái)說(shuō),執(zhí)行一條指令只有幾十個(gè) ns,進(jìn)行 for 循環(huán)時(shí),要實(shí)現(xiàn) N 毫秒的 x 值非常大,而且由于系統(tǒng)頻率的寬廣,很難計(jì)算出延時(shí) N 毫秒的精確值。針對(duì) STM32 微處理器,需要重新設(shè)計(jì)一個(gè)新的方法去實(shí)現(xiàn)該功能,以實(shí)現(xiàn)在程序中使用 Delay(N)。


            (二) STM32 SysTick 介紹

            Cortex-M3 的內(nèi)核中包含一個(gè) SysTick 時(shí)鐘。SysTick 為一個(gè) 24 位遞減計(jì)數(shù)器,SysTick 設(shè)定初值并使能后,每經(jīng)過(guò) 1 個(gè)系統(tǒng)時(shí)鐘周期,計(jì)數(shù)值就減 1。計(jì)數(shù)到 0 時(shí),SysTick 計(jì)數(shù)器自動(dòng)重裝初值并繼續(xù)計(jì)數(shù),同時(shí)內(nèi)部的 COUNTFLAG 標(biāo)志會(huì)置位,觸發(fā)中斷 (如果中斷使能情況下)。

            在 STM32 的應(yīng)用中,使用 Cortex-M3 內(nèi)核的 SysTick 作為定時(shí)時(shí)鐘,設(shè)定每一毫秒產(chǎn)生一次中斷,在中斷處理函數(shù)里對(duì) N 減一,在Delay(N) 函數(shù)中循環(huán)檢測(cè) N 是否為 0,不為 0 則進(jìn)行循環(huán)等待;若為 0 則關(guān)閉 SysTick 時(shí)鐘,退出函數(shù)。

            注: 全局變量 TimingDelay , 必須定義為 volatile 類型 , 延遲時(shí)間將不隨系統(tǒng)時(shí)鐘頻率改變。

            (三) ST SysTick 庫(kù)文件

            使用ST的函數(shù)庫(kù)使用systick的方法
            1、調(diào)用SysTick_CounterCmd() -- 失能SysTick計(jì)數(shù)器
            2、調(diào)用SysTick_ITConfig () -- 失能SysTick中斷
            3、調(diào)用SysTick_CLKSourceConfig() -- 設(shè)置SysTick時(shí)鐘源。
            4、調(diào)用SysTick_SetReload() -- 設(shè)置SysTick重裝載值。
            5、調(diào)用SysTick_ITConfig () -- 使能SysTick中斷
            6、調(diào)用SysTick_CounterCmd() -- 開(kāi)啟SysTick計(jì)數(shù)器


            (四) SystemTick 工程實(shí)戰(zhàn)

            外部晶振為 8 MHz,9 倍頻,系統(tǒng)時(shí)鐘為 72MHz,SysTick 的最高頻率為9MHz(最大為HCLK / 8),在這個(gè)條件下,把 SysTick 效驗(yàn)值設(shè)置成9000,將 SysTick 時(shí)鐘設(shè)置為 9 MHz, 就能夠產(chǎn)生 1ms 的時(shí)間基值,即 SysTick 產(chǎn)生 1ms 的中斷。


            RCC_Configuration();
            SysTick_Configuration();


            第一步: 配置 RCC 寄存器 和 SysTick 寄存器

            RCC_Configuration: 配置 RCC 寄存器
            void RCC_Configuration(void)
            {

            RCC_DeInit();


            RCC_HSEConfig(RCC_HSE_ON);


            HSEStartUpStatus = RCC_WaitForHSEStartUp();

            if(HSEStartUpStatus == SUCCESS)
            {

            RCC_HCLKConfig(RCC_SYSCLK_Div1);


            RCC_PCLK2Config(RCC_HCLK_Div1);


            RCC_PCLK1Config(RCC_HCLK_Div2);


            FLASH_SetLatency(FLASH_Latency_2);

            FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);


            RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);


            RCC_PLLCmd(ENABLE);


            while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
            {
            }


            RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);


            while(RCC_GetSYSCLKSource() != 0x08)
            {
            }
            }


            RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |
            RCC_APB2Periph_AFIO, ENABLE);
            }

            SysTick_Configuration: 配置 SysTick
            void SysTick_Configuration(void)
            {

            SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);


            NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 3, 0);


            SysTick_SetReload(72000);


            SysTick_ITConfig(ENABLE);
            }

            第二步: 配置 SysTick 中斷函數(shù)

            這里我們定義了一個(gè) TestSig 全局變量, 用于我們使用 Keil 軟件自帶的邏輯分析儀來(lái)分析.


            volatile vu32 TimingDelay = 0;
            vu8 TestSig = 0;

            void SysTickHandler(void)
            {
            TimingDelay--;
            if(TimingDelay % 2)
            {
            TestSig = 1;
            }
            else
            {
            TestSig = 0;
            }
            }


            第三步: 編寫(xiě) Delay 延時(shí)函數(shù)

            Delay: 系統(tǒng)延時(shí)函數(shù), 使用系統(tǒng)時(shí)鐘操作.

            void Delay(u32 nTime)
            {

            SysTick_CounterCmd(SysTick_Counter_Enable);

            TimingDelay = nTime;

            while(TimingDelay != 0);


            SysTick_CounterCmd(SysTick_Counter_Disable);

            SysTick_CounterCmd(SysTick_Counter_Clear);
            }


            第四步: 主函數(shù)中調(diào)用 Delay

            在 Mini-STM32 開(kāi)發(fā)板上有兩個(gè) LED 燈, 分別是 PA0, PA1. 我們做個(gè)流水燈程序, 讓他們循環(huán)點(diǎn)亮.
            while(1)
            {
            GPIO_SetBits(GPIOA,GPIO_Pin_0);
            Delay(100);
            GPIO_ResetBits(GPIOA,GPIO_Pin_0);
            Delay(100);
            GPIO_SetBits(GPIOA,GPIO_Pin_1);
            Delay(100);
            GPIO_ResetBits(GPIOA,GPIO_Pin_1);
            Delay(100);
            }


            (五) 仿真調(diào)試

            把工程便宜通過(guò)后, 進(jìn)入軟件仿真
            如下圖所示:點(diǎn)擊工程快捷菜單的邏輯分析儀

            在邏輯分析儀中我們點(diǎn)擊 Setup 按鍵會(huì)彈出安裝對(duì)話框.
            點(diǎn)右上方的 "新建" 圖標(biāo), 在菜單中輸入 "TestSig" 這個(gè)全局變量.
            添加完之后就可以點(diǎn) Close 了. 如果您仿真完可以點(diǎn)擊 左下方的 "Kill All" 刪除所有監(jiān)視變量.

            全速運(yùn)行后就可以看到下面的波形了哦

            如果你使用仿真器在 Mini-STM32 上調(diào)試的話你還可以看到兩個(gè) LED 在跑跑馬燈程序了.
            到此我們這章節(jié)的教程就結(jié)束了, 相信大家也掌握了 System Tick 的用法了.



            評(píng)論


            技術(shù)專區(qū)

            關(guān)閉