合宙AIR105(二): 時鐘設置和延遲函數

来源:https://www.cnblogs.com/milton/archive/2022/06/18/16387525.html
-Advertisement-
Play Games

Air105 的時鐘 高頻振蕩源 * 晶元支持使用內部振蕩源, 或使用外置12MHz晶體 * 晶元上電覆位後 ROM boot 啟動過程基於內部12MHz的振蕩器 * 晶元內部集成的12MHz振蕩源精度為±2%, 精度一般 * 使用外置12MHz晶體, 需要軟體切換 * 經過PLL倍頻後為系統提供... ...


目錄

Air105 的時鐘

高頻振蕩源

  • 晶元支持使用內部振蕩源, 或使用外置12MHz晶體
    • 晶元上電覆位後 ROM boot 啟動過程基於內部12MHz的振蕩器
    • 晶元內部集成的12MHz振蕩源精度為±2%, 精度一般
    • 使用外置12MHz晶體, 需要軟體切換
  • 經過PLL倍頻後為系統提供輸入
  • 倍頻後的PLL時鐘頻率可通過寄存器進行配置,可選頻率為:108MHz, 120MHz, 132MHz, 144MHz, 156MHz, 168MHz, 180MHz, 192MHz, 204MHz

分頻結構

  • PLL_CLK
    • 外部 XTAL12M 或 內部 OSC12M -> 直通, 或PLL產生 108MHz - 204MHz
  • FCLK / CPU_CLK
    • PLL_CLK -> 2bit分頻(0, 2分頻, 4分頻) -> FCLK
    • FCLK就是主程式迴圈的時鐘
  • HCLK
    • FCLK -> 1bit分頻(預設=1, 2分頻) -> HCLK
    • 當 FCLK 小於 102MHz 時不分頻, 否則2分頻
  • PCLK
    • HCLK -> 1bit分頻(預設=0, 不分頻) -> PCLK (外設頻率)
    • PCLK 是大部分外設 TIMER, ADC, SPI, WDT, GPIO, I2C, UART 的時鐘
  • QSPI
    • FCLK -> 3bit分頻(預設=3, 4分頻) -> QSPI

低頻振蕩源

  • 晶元安全區基於內部32KHz,RTC預設基於內部OSC 32K, 使用外部XTAL 32K需要軟體切換
  • 支持內部或外部32KHz輸出

時鐘結構

  • (外部或內部 32K RTC OSC) -> SYSTICK
  • 內部 32K OSC -> Security

時鐘設置

以下代碼基於 air105_project 的庫函數

寄存器

寄存器手冊 Air105晶元數據手冊_1.1.pdf

寄存器的基礎地址, 定義在 air105.h

#define AIR105_FLASH_BASE                       (0x01000000UL)                /*!< (FLASH     ) Base Address */
#define AIR105_SRAM_BASE                        (0x20000000UL)                /*!< (SRAM      ) Base Address */
#define AIR105_PERIPH_BASE                      (0x40000000UL)                /*!< (Peripheral) Base Address */

#define AIR105_AHB_BASE                         (AIR105_PERIPH_BASE)
#define AIR105_APB0_BASE                        (AIR105_PERIPH_BASE + 0x10000)

#define SYSCTRL_BASE                            (AIR105_APB0_BASE + 0xF000)

SYSCTRL_BASE

  • 地址 = 外設基礎地址 0x40000000UL + APB0 偏移 0x10000 + SYSCTRL 偏移 0xF000
  • 範圍 [0x4001_F000, 0x4001_FFFF]

時鐘振蕩源

振蕩源選擇

SYSCTRL_SYSCLKSourceSelect(SELECT_EXT12M);

12MHz 時鐘來源選擇: 0:片外 XTAL, 1:片內 OSC

void SYSCTRL_SYSCLKSourceSelect(SYSCLK_SOURCE_TypeDef source)
{
    assert_param(IS_SYSCLK_SOURCE(source));
    
    switch (source)
    {
    case SELECT_EXT12M:
        // FREQ_SEL 是一個32bit的寄存器, 先與補碼(清零第12位), 然後寫入值(0)
        SYSCTRL->FREQ_SEL = ((SYSCTRL->FREQ_SEL & (~SYSCTRL_FREQ_SEL_CLOCK_SOURCE_Mask)) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_EXT);
        break;
    
    case SELECT_INC12M:
        // 先與補碼(清零第12位), 然後寫入值(1)
        SYSCTRL->FREQ_SEL = ((SYSCTRL->FREQ_SEL & (~SYSCTRL_FREQ_SEL_CLOCK_SOURCE_Mask)) | SYSCTRL_FREQ_SEL_CLOCK_SOURCE_INC);
        break;
    }
}

時鐘頻率

設置使用預設的內部時鐘HSI(Internal clock)

void SystemClock_Config_HSI(void)
{
    // 設置CPU頻率, 直接選擇, 不需要計算
    SYSCTRL_PLLConfig(SYSCTRL_PLL_204MHz);
    // 分頻後產生 FCLK -> 這是主程式的時鐘
    SYSCTRL_PLLDivConfig(SYSCTRL_PLL_Div_None);
    // 分頻產生 HCLK, 如果 FCLK > 102MHz 則無論如何設置, 都會被二分頻
    SYSCTRL_HCLKConfig(SYSCTRL_HCLK_Div2);
    // 分頻產生 PCLK -> 這是大部分外設的時鐘
    SYSCTRL_PCLKConfig(SYSCTRL_PCLK_Div2);
    QSPI_SetLatency((uint32_t)0);
}

PLL分頻的選項

#define SYSCTRL_PLL_Div_None                       ((uint32_t)0x00)
#define SYSCTRL_PLL_Div2                           ((uint32_t)0x01)
#define SYSCTRL_PLL_Div4                           ((uint32_t)0x10)

設置 SysTick

void Delay_Init(void)
{
    SYSCTRL_ClocksTypeDef clocks;

    SYSCTRL_GetClocksFreq(&clocks);
    SysTick_Config(clocks.CPU_Frequency / 1000000);   ///< 1us
}

調用 SysTick_Config 將單個 SysTick 設置為 1 us.

也可以直接使用SYSCTRL->HCLK_1MS_VAL * 2 / 1000這個變數代表了當前時鐘配置下, 1ms需要的HCLK時鐘周期, 根據當前FCLK是否大於108MHz 確定是否要乘以2.

之後就會每隔1us調用 SysTick_Handler(void), 在這裡設置 32bit g_current_tick 遞增, 可以用於延時控制. 因為32bit數的限制, 1.2個小時後會溢出, 所以這裡有一個延遲的極限.

void SysTick_Handler(void)
{
    g_current_tick++;
}

延遲函數

為避免溢出造成的延遲錯誤, 需要做一個判斷

uint32_t get_diff_tick(uint32_t cur_tick, uint32_t prior_tick)
{
    if (cur_tick < prior_tick)
    {
        // 如果當前值比前值還小, 說明發生了溢出, 用當前值加上原值取反(即原值離溢出的距離)
        return (cur_tick + (~prior_tick));
    }
    else
    {
        return (cur_tick - prior_tick);
    }
}

延遲的函數

void Delay_us(uint32_t usec)
{
    uint32_t old_tick;

    old_tick = g_current_tick;
    while (get_diff_tick(g_current_tick, old_tick) < usec);
}

void Delay_ms(uint32_t msec)
{
    uint32_t old_tick;

    old_tick = g_current_tick;
    while (get_diff_tick(g_current_tick, old_tick) < (msec * 1000));
}

代碼

代碼地址: https://gitee.com/iosetting/air105_project

可以使用Keil5 MDK 直接打開 Demos 目錄下的示例項目, 與Air105開發板接線參考前一篇合宙AIR105(一): Keil MDK開發環境, DAP-Link 燒錄和調試


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、題目 描述 給定一個僅包含0和1的n*n二維矩陣,請計算二維矩陣的最大值。 計算規則如下 1、每行元素按下標順序組成一個二進位數(下標越大約排在低位),二進位數的值就是該行的值,矩陣各行之和為矩陣的值 2、允許通過向左或向右整體迴圈移動每個元素來改變元素在行中的位置 比如:[1,0,1,1,1] ...
  • 做下記錄, 首先插入一個dataGridView控制項,兩個button按鈕(導入數據,導出數據),一個ComboBox(獲取列標題使用),一個textbox(輸入關鍵字),一個定位按鈕(定位使用) 1,導入數據(NPOI) 1 2 private void daoRuShuJu_cmd_Click( ...
  • 最近在看 C++ 的方法和類模板,我就在想 C# 中也是有這個概念的,不過叫法不一樣,人家叫模板,我們叫泛型,哈哈,有點意思,這一篇我們來聊聊它們底層是怎麼玩的? 一:C++ 中的模板玩法 畢竟 C++ 是相容 C 語言,而 C 是過程式的玩法,所以 C++ 就出現了兩種模板類型,分別為:函數模板 ...
  • 一、CDN是什麼? CDN的全稱是Content Delivery Network,即內容分髮網絡。其目的是通過在現有的Internet中增加一層新的CACHE(緩存)層,將網站的內容發佈到最接近用戶的網路”邊緣“的節點,使用戶可以就近取得所需的內容(就近原則),提高用戶訪問網站的響應速度。從技術上 ...
  • Air105 有 1 個 Timer 單元,包含 8 個獨立定時器: Timer0 到 Time7, 8 個定時器中斷源獨立,每個定時器單獨占 1 個中斷源, 使用 PCLK 時鐘頻率作為定時器計時鐘源, 定時器採用向下計數方式. 每個 Timer 單元定時器都支持 PWM 模式, PWM 模式最高... ...
  • #一、防火牆配置 前言:電腦的防火牆配置保證了別的主機無法訪問本機非開放埠 1、防火牆介紹 Linux預設防火牆是開啟的,而且所以的埠對外都是不可訪問的,該策略保證了電腦的安全 但同時也帶來了問題如:其他電腦無法訪問本機上項目開啟的埠號 在Linux上安裝Tomcat,Tomcat軟體需 ...
  • 一、功能變數名稱系統概述 功能變數名稱系統DNS(Domain Name System)是網際網路使用的命名系統,用來把便於人們使用的機器名字轉換成為IP地址。功能變數名稱系統其實就是名字系統。為什麼不叫“名字”而叫“功能變數名稱”呢?這是因為在這種網際網路的命名系統中使用了許多的“域(domain)”,因此就出現了“功能變數名稱”這個名詞。 ...
  • vmstat 是一個查看虛擬記憶體(Virtual Memory)使用狀況的工具,但是怎樣通過 vmstat 來發現系統中的瓶頸呢? 1。 使用vmstat 使用前我們先看下命令介紹及參數定義 Usage: vmstat [options] [delay [count]] Options: -a, - ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...