国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

從滴答時鐘了解STM32庫操作

發布時間:2014-9-24 16:57    發布者:看門狗
關鍵詞: STM32 , 庫函數 , 定時器
作者:areak

  STM32的庫函數操作給設計開發人員帶來了諸多的便利,開發人員不必十分了解STM32的內部寄存器及硬件機制,只要有C語言基礎,即可完成單片機的開發,縮短了開發周期,降低了開發難度,因而備受工程師喜愛。

  基于庫函數的開發模式,與基于API(Application Programming Interface)的軟件開發有著異曲同工之處,程序員通過調用 API 函數對應用程序進行開發,而又無需訪問源碼,或理解內部工作機制的細節,可以減輕編程任務。STM32的基于函數庫的開發模式也是一樣的道理,因此對于有單片機開發經驗的工程師來說,學習STM32,很容易就可以上手。

  雖然可以不考慮庫函數內部的細節,不考慮如何實現硬件寄存器的配置,但是深入了解庫函數對于提高編程能力是很有好處的,下面以系統滴答時鐘為例,詳解其工作流程。

  滴答時鐘是STM32內部的一個24位定時器,其操作相對簡單,配置寄存器較少。大體的工作流程是這樣的,定時器首先要有時鐘源,時鐘源配置好之后,設置定時時間,然后定時器啟動,當定時時間到時,置位標志位,重載定時器初值,系統可采用查詢標志位和中斷兩種工作方式做出相應的響應,下面來看看程序如何實現延時功能。

//初始化配置函數

Void Delay_Init()

{

       RCC_ClocksTypeDef RCC_ClocksStatus;

    RCC_GetClocksFreq(&RCC_ClocksStatus);//獲取時鐘頻率

SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//時鐘源配置為系統主時鐘頻率/8

       SysTick_ITConfig(DISABLE);//不使能中斷,采用查詢方式

delay_fac_us = RCC_ClocksStatus.HCLK_Frequency / 8000000;// 1us的定時初值

}



//實現延時Nus的延時功能

void Delay_us(u32 Nus)

{

SysTick_SetReload(delay_fac_us * Nus);//載入初值

SysTick_CounterCmd(SysTick_Counter_Clear);//計數器清零

SysTick_CounterCmd(SysTick_Counter_Enable);//計數器開始計數

do

{

     Status = SysTick_GetFlagStatus(SysTick_FLAG_COUNT);

}while (Status != SET);//不斷查詢標志位,當載入初值與計數器相等時,標志位置位。

SysTick_CounterCmd(SysTick_Counter_Disable);//關閉計數器

SysTick_CounterCmd(SysTick_Counter_Clear);//清零計數器

}

//實現閃燈

Delay_Init();

While(1)

{

LED1(ON);

       Delay_us(500000);//延時500ms

       LED1(OFF);

}

  下面來看看庫函數如何實現相應的寄存器配置。

void SysTick_ITConfig(FunctionalState NewState)

{

  /* Check the parameters */

  assert_param(IS_FUNCTIONAL_STATE(NewState));



  if (NewState != DISABLE)

  {

    SysTick->CTRL |= CTRL_TICKINT_Set;

  }

  else

  {

    SysTick->CTRL &= CTRL_TICKINT_Reset;

  }

}

  這個函數的作用是配置寄存器開啟/關閉中斷,FunctionalState是自定義的數據類型,是一個枚舉類型,typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;

  枚舉類型是一種基本數據類型而不是構造類型,它用于聲明一組命名的常數,將變量的值一一列出來,變量的值只限于列舉出來的值的范圍內,因此當一個變量有幾種可能的取值時,可以將它定義為枚舉類型。

  assert_param(IS_FUNCTIONAL_STATE(NewState));

  這句話的作用是判斷參數NewState的值是否正確,如果發現參數出錯,它會調用函數assert_failed()向程序員報告錯誤。

void assert_failed(uint8_t* file, uint32_t line)

{

while (1)

{}

}

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

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,而從根本上來說這是一個地址,就是STM32芯片內部分配給滴答時鐘的實際地址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)

{

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

}

  通過對這樣一個簡單定時器的操作,我們可以初步了解到STM32庫函數的使用方法,其實開發人員沒必要深究庫函數內部是如何處理實現的,只需要了解已經封裝好的庫函數,進行調用即可,因此可以大大降低開發周期,提高開發效率,更多的功能留給讀者自行研究開發。
本文地址:http://m.qingdxww.cn/thread-133076-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
lhxzui 發表于 2014-11-26 13:51:27
謝謝分享。
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 利用SAM E54 Xplained Pro評估工具包演示CAN轉USB橋接器以及基于CAN的主機和自舉程序應用程序
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 貿澤電子(Mouser)專區

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色老二精品视频在线观看 | 国产精品成人一区二区不卡 | 91青青在线视频 | 国产精品盗摄一区二区在线 | 青青青国产精品国产精品美女 | 久久国产这里只有精品 | sese亚洲| 日韩毛片免费视频 | 日产精品久久久一区二区 | 免费精品一区二区三区在线观看 | 国片一级 免费看 | 久久99免费| 在线看日本 | 亚洲国产成人在线 | 精品视频在线免费 | 日韩精品一区二区三区中文字幕 | 免费国产成高清人在线视频 | 久久九九精品一区二区 | 动漫免费看的网站 | 日韩在线天堂 | 亚洲韩国日本欧美一区二区三区 | 四虎影视免费观看 | 青春草国产成人精品久久 | 欧美成人午夜视频免看 | 国产高清1024永久免费 | 亚洲成人在线网站 | 国产第4页 | 青青草国产青春综合久久 | 免费成人黄色片 | 亚洲欧美日韩国产精品一区 | 思思91精品国产综合在线 | 99精品视频观看 | 四虎在线视频 | 丁香婷婷网 | 国产欧美日韩灭亚洲精品 | 色播五月激情五月 | 在线免费亚洲 | 日日摸夜夜添夜夜 | 在线观看日本网站 | 一级毛片aaaaaa视频免费看 | 天天舔天天干 |