本文來源電子發燒友社區,作者:Michael, 帖子地址:https://bbs.elecfans.com/jishu_2287602_1_1.html
Air105 的時鐘
高頻振蕩源
分頻結構
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
低頻振蕩源
時鐘結構
(外部或內部 32K RTC OSC) -> SYSTICK
內部 32K OSC -> Security
時鐘設置
以下代碼基于 air105_project 的庫函數https://gitee.com/iosetting/air105_project
寄存器
寄存器手冊Air105芯片數據手冊_1.1.pdf
寄存器的基礎地址, 定義在 air105.h
復制代碼
SYSCTRL_BASE
地址 = 外設基礎地址 0x40000000UL + APB0 偏移 0x10000 + SYSCTRL 偏移 0xF000
范圍 [0x4001_F000, 0x4001_FFFF]
時鐘振蕩源
振蕩源選擇
復制代碼
12MHz 時鐘來源選擇: 0:片外 XTAL, 1:片內 OSC
復制代碼
時鐘頻率
設置使用默認的內部時鐘HSI(Internal clock)
復制代碼
PLL分頻的選項
復制代碼
設置 SysTick
復制代碼
調用 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個小時后會溢出, 所以這里有一個延遲的極限.
復制代碼
延遲函數
為避免溢出造成的延遲錯誤, 需要做一個判斷
復制代碼
延遲函數
復制代碼
代碼
代碼地址:https://gitee.com/iosetting/air105_project
可以使用Keil5 MDK 直接打開 Demos 目錄下的示例項目, 與Air105開發板接線參考前一篇合宙AIR105(一): Keil MDK開發環境, DAP-Link 燒錄和調試。
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 的庫函數https://gitee.com/iosetting/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 燒錄和調試。
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
合宙通信
+關注
關注
0文章
160瀏覽量
2472 -
Air105
+關注
關注
0文章
48瀏覽量
442
發布評論請先 登錄
相關推薦
熱點推薦
猛!合宙MCU模組:Air1601/1602雙星出擊!
在嵌入式開發中,你是否曾面臨這樣的困境:高清UI渲染依賴昂貴高端芯片、圖像處理卡頓、多網通信協同復雜、工業級穩定設計繁瑣……合宙Air1601/Ai
高效接入語音交互:合宙模組音頻方案如何選?
本文特別分享4G模組選型與硬件設計要點,為開發者提供實用參考。 一、模組音頻支持概況 從主芯片是否原生支持音頻功能來看,合宙4G模組大致可分為兩類: 1.1 主芯片支持音頻功能 比如:經典老
Air780EPM開發板上的FFT應用實現:關鍵技術深度剖析
以Air780EPM開發板為硬件平臺,快速傅里葉變換(FFT)的應用實現成為嵌入式信號處理中的關鍵環節。本文將圍繞該開發板的硬件適配特性、FFT算法在嵌入式環境中的部署流程,深入解析代碼結構、關鍵
以Air780EPM開發板為例:FFT應用示例核心要點全解析
以Air780EPM開發板作為實踐載體,本文將對FFT應用示例的核心要點展開全面解析。從開發板的硬件特性適配、FFT算法的實現流程,到示例代碼的核心模塊與調試要點,逐一拆解,確保開發者
實戰Air780EPM:構建4G共享網關,服務WiFi與有線設備!
通過Air780EPM開發板,我們可以輕松實現4G網絡作為數據出口,為周邊的WiFi設備和以太網設備提供互聯網共享,適用于移動辦公、遠程部署等場景。 一、多網融合概述 ? Air780EPM
以太網數傳輕松實現:Air8101+Air ETH_1000的完美搭檔
Air8101核心板搭配Air ETH_1000以太網小板,可快速實現設備與以太網網絡的連接,為數據實時上傳、遠程控制等功能提供堅實硬件基礎。 本文特別分享AirETH_1000+Air
Air8101多網融合戰略升級:Air780EPM模塊助力4G聯網落地
應用邁向新高度。 本文將分享Air8101核心板通過外掛Air780EPM整機開發板,實現4G聯網的功能示例。 ? 一、硬件準備工作 ? 1.1 ?所需硬件
基于RK3576處理器,米爾RK3576開發板免費試用
年7月19日 ? 評測數量: 3塊 ? 更多熱點文章閱讀 基于平頭哥TH1520芯片,潤開鴻HH-SCDAYU800A開發板免費試用 RISC-V開發板深度評測!頂級開發板免費
基于RK處理器,創龍TL3562-MiniEVM開發板試用體驗
數量: 10塊 ? 更多熱點文章閱讀 基于平頭哥TH1520芯片,潤開鴻HH-SCDAYU800A開發板免費試用 RISC-V開發板深度評測!頂級開發板免費
性能強悍!合眾HZ-RK3568開發板試用體驗
月19日 ? 評測數量: 10塊 ? 更多熱點文章閱讀 基于平頭哥TH1520芯片,潤開鴻HH-SCDAYU800A開發板免費試用 RISC-V開發板深度評測!頂級開發板免費
技術篇——Air8000開發板,一站式滿足多功能高擴展開發需求!
對于追求高效開發的你來說,Air8000開發板最新資料庫的開放絕對不容錯過。無論是智能控制、數據采集還是多場景應用開發,其多功能內核與高擴展接口,為各類項目提供“即插即用”式的解決方案
Air8101革新物聯網配網:AirKiss方案讓設備連接更智能!
、 Air8101開發板AirKiss配網示例? 下文以Air8101開發板為例,演示AirKiss配網實操要點。 此配網方式極為簡單,使用示例源碼將
【合宙Air105開發板試用體驗】Air105的時鐘和延遲函數
評論