新聞中心

        EEPW首頁 > 模擬技術 > 牛人業話 > 從滴答時鐘了解STM32庫操作

        從滴答時鐘了解STM32庫操作

        作者:areak 時間:2014-05-04 來源:電子產品世界 收藏

          SysTick->CTRL |= CTRL_TICKINT_Set;這句話就是用來配置寄存器的語句, SysTick是系統定義的一個結構體如下,SysTick->CTRL即為滴答時鐘的控制寄存器。

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

        typedef struct

        {

          __IO uint32_t CTRL;     /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */

          __IO uint32_t LOAD;    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register     */

          __IO uint32_t VAL;       /*!< Offset: 0x008 (R/W)  SysTick Current Value Register    */

          __I  uint32_t CALIB; /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */

        } SysTick_Type; //聲明一個SysTick_Type型的結構體。

        #define SysTick   ((SysTick_Type   *)     SysTick_BASE  ) /*!< SysTick configuration struct */

        #define SysTick_BASE   (SCS_BASE +  0x0010UL) /*!< SysTick Base Address  */

        #define SCS_BASE   (0xE000E000UL) /*!< System Control Space Base Address  */

          定義一個SysTick_Type類型的結構體實例SysTick,而從根本上來說這是一個地址,就是芯片內部分配給滴答時鐘的實際地址0xE000E000UL+0x0010UL。

          CTRL_TICKINT_Set是一個宏定義,定義如下

        /* CTRL TICKINT Mask */

        #define CTRL_TICKINT_Set      ((u32)0x00000002)

        #define CTRL_TICKINT_Reset    ((u32)0xFFFFFFFD)

          至此,SysTick->CTRL |= CTRL_TICKINT_Set;這句話的意義已經很清晰了,就是給地址0xE000E000+0x0010 +0x000賦一個0x00000002的值,對應滴答時鐘的CTRL寄存器的第2位置1。即為開啟中斷的意思。

          上面講的是用查詢的方式,下面再說下中斷觸發。只需調用下面這個函數即可完成中斷的設置。

          SysTick_Config(uint32_t ticks);具體實現如下:

        __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)

        {

          if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);    

          SysTick->LOAD  = ticks - 1;                              

          NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); 

          SysTick->VAL   = 0;                                

          SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |

                           SysTick_CTRL_TICKINT_Msk   |

                           SysTick_CTRL_ENABLE_Msk;   

          return (0);                                      

        }

          函數的參數為ticks,是要裝入寄存器SysTick->LOAD的計數值,如果系統時鐘為72M,把ticks賦值為SystemFrequency/10000,表示計數到720個時鐘周期產生一次中斷,而一個時鐘周期的時間為(1/72)us,所以720x(1/72)=10us,也就實現了定時10us的功能。

          NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);為SysTick中斷設置優先級。將寄存器SysTick->VAL的值清0。然后使能中斷,使能SysTick,時鐘源選擇為AHB時鐘。當定時時間到時,進入中斷函數

        void SysTick_Handler(void)

        {

        //具體函數實現由用戶編寫。

        }

          通過對這樣一個簡單的操作,我們可以初步了解到的使用方法,其實開發人員沒必要深究內部是如何處理實現的,只需要了解已經封裝好的,進行調用即可,因此可以大大降低開發周期,提高開發效率,更多的功能留給讀者自行研究開發。

        c語言相關文章:c語言教程


        塵埃粒子計數器相關文章:塵埃粒子計數器原理

        上一頁 1 2 下一頁

        關鍵詞: STM32 庫函數 定時器

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 浠水县| 中山市| 泾阳县| 乌什县| 洛川县| 麟游县| 启东市| 沛县| 台前县| 上林县| 商水县| 随州市| 霞浦县| 郧西县| 大悟县| 盐源县| 监利县| 衡水市| 新疆| 涿鹿县| 安龙县| 丰城市| 东城区| 平乐县| 阜平县| 固始县| 紫云| 内乡县| 美姑县| 锦州市| 潍坊市| 白银市| 固安县| 凤阳县| 临邑县| 小金县| 陆丰市| 姚安县| 大足县| 广宁县| 云梦县|