【BLE】CC2541之解析協議棧的晶振初始化過程
本篇博文最後修改時間:2017年01月06日,11:06。
一、簡介
本文以SimpleBLEPeripheral為例,解析協議棧的晶振初始化過程。
二、實驗平臺
協議棧版本:BLE-CC254x-1.4.0
編譯軟體:IAR 8.20.2
硬體平臺:Smart RF開發板(主晶片CC2541)
三、
博主:甜甜的大香瓜
宣告:喝水不忘挖井人,轉載請註明出處。
原文地址:http://blog.csdn.NET/feilusia
聯絡方式:[email protected]
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
甜甜的大香瓜的小店(淘寶店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i 四、實驗前提 1、在進行本文步驟前,請先閱讀以下博文: 暫無 2、在進行本文步驟前,請先實現以下博文:
暫無
五、基礎知識
暫無
六、解析程式碼
1、程式碼位置
在2541的協議棧初始化最開頭的HAL_BOARD_INIT處,協議棧對晶振進行了初始化。
2、晶振初始化的流程
/* Board Initialization */ #define HAL_BOARD_INIT() \ { \ /* Set to 16Mhz to set 32kHz OSC, then back to 32MHz */ \ START_HSOSC_XOSC();//開啟內部16M的RC振盪器和外部32M晶振 SET_OSC_TO_HSOSC();//切換到內部16M的RC振盪器(是32k的OSC切換的前提) SET_32KHZ_OSC(); //切換32k的OSC32k SET_OSC_TO_XOSC(); //切換到外部32M晶振 STOP_HSOSC(); //停止內部16M的RC振盪器 \ /* Enable cache prefetch mode. */ \ PREFETCH_ENABLE(); \ }
要想切換OSC32k小晶振,就必須先把OSC切換到內部16M的RC振盪器。
所以在HAL_BOARD_INIT中才頻繁地對晶振各種起震、切換。
3、各個函式解析
1)START_HSOSC_XOSC()(開啟內部16M的RC振盪器和外部32M晶振):
#define START_HSOSC_XOSC() \ { \ SLEEPCMD &= ~OSC_PD; /* start 16MHz RCOSC & 32MHz XOSC */ \ while (!(SLEEPSTA & XOSC_STB)); /* wait for stable 32MHz XOSC */ \ }
然而我去查詢CC254X的晶片手冊,發現SLEEPCMD沒有OSC_PD(第2位)、SLEEPSTA也沒有XOSC_STB(第6位),如下圖:
於是參考CC2430的datasheet:
協議棧在這裡將OSC_PD清零,也就是同時起震內部16M的RC振盪器和外部的32M晶振。
然後判斷XOSC_STB狀態位,等待外部晶振起震並穩定。
2)SET_OSC_TO_HSOSC()(切換到內部16M的RC振盪器)
// switch to the 16MHz HSOSC and wait until it is stable
#define SET_OSC_TO_HSOSC() \
{ \
CLKCONCMD = (CLKCONCMD & 0x80) | CLKCONCMD_16MHZ; \
while ( (CLKCONSTA & ~0x80) != CLKCONCMD_16MHZ ); \
}
其中第一行程式碼是讓CLKCONCMD暫存器的第7位保持、其他位清零,然後第6、3、0位置1,也就是值變成x100 1001。
參照datasheet來看:
也就是不改變32k小晶振的配置、只切換到內部16M的RC振盪器。
這麼做的意義在於:在切換32k小晶振前,必須先將OSC配置為16M。
所以接下來就可以配置32k小晶振了。
3)SET_32KHZ_OSC()(切換32k的OSC)
// set 32kHz OSC and wait until it is stable
#define SET_32KHZ_OSC() \
{ \
CLKCONCMD = (CLKCONCMD & ~0x80) | OSC_32KHZ; \
while ( (CLKCONSTA & 0x80) != OSC_32KHZ ); \
}
預設是使用外部的32k的OSC小晶振。
// For non-USB, assume external, unless an internal crystal is explicitly indicated.
#if !defined (XOSC32K_INSTALLED) || (defined (XOSC32K_INSTALLED) && (XOSC32K_INSTALLED == TRUE))
#define OSC_32KHZ EXTERNAL_CRYSTAL_OSC
#else
#define OSC_32KHZ INTERNAL_RC_OSC
#endif
如果要使用低功耗,外部的32k小晶振是必須的。參看《CC2541之32.768kHZ外部晶振》。4)SET_OSC_TO_XOSC()(重新切換到32M外部晶振)
內部的32K的RC振盪電路已經配置好,所以這時候系統時鐘即可配置為最快的外部32M晶振。
5)STOP_HSOSC()(停止內部16M的RC振盪器)
內部的16M的RC振盪電路已經沒用了,即可關掉,省電。
相關推薦
【BLE】CC2541之解析協議棧的晶振初始化過程
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral為例,解析協議棧的晶振初始化過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart
【BLE】CC2541之32.768kHZ外部晶振
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文介紹外部的32.768K晶振對於CC2541的作用。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart RF(主晶片CC2
【BLE】CC2541之通訊協議
本篇博文最後修改時間:2016年12月12日,10:51。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何在一個可讀、可寫、可通知、20位元組長的特徵值char6基礎上,新增一個香瓜自定義的通訊協議,並用app傳送指令實現P11口上的LE
【BLE】CC2541之主機端讀取特征值
roi repl void 定時 store val star content else if 本篇博文最後改動時間:2017年01月06日,11:06。
【BLE】CC2541之連線引數
轉載自: https://blog.csdn.net/feilusia/article/details/46909723 一、簡介 本文介紹CC2541的連線引數。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:S
【BLE】CC2541之電池電量服務
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個電池電量服務。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體: IAR 8.20.2 硬體平臺: Smar
【BLE】CC2541之新增特徵值
本篇博文最後修改時間:2017年03月21日,15:32。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個可讀、可寫、可通知、20位元組長的特徵值char6,並用app實現資料的收發。 二、實驗平臺 協議棧版本:BLE-CC254
【BLE】CC2541之發現服務與特徵值
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程為例,解析CC2541作為主機時是如何發現從機的服務和特徵值的。二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2
【BLE】CC2541之indicate
本篇博文最後修改時間:2017年08月31日,17:00。 一、簡介 本文以SimpleBLEPeripheral為例,講述如何通過按五項按鍵的“center”鍵傳送indicate資料給btool,用PC的串列埠工具打印出“indicate”的“發資料”和“應答”的過程
【BLE】CC2541之回撥函式
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程中simpleBLECentralEventCB函式,來簡要說明回撥函式的定義和呼叫過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編
【BLE】CC2541之開啟廣播過程
本篇博文最後修改時間:2016年11月11日,09:31。 一、簡介 本文介紹在應用層如何開啟廣播,且解析協議棧在此操作後做了什麼。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Amart RF開發板(主晶
【BLE】CC2541之主機端獲取notify資料
本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程和SimpleBLEPeripheral工程為例,介紹CC2541作為主機時是如何獲取從機char4通道的notify資料。 二、實驗平臺 協議棧版
【BLE】CC2541之通過RSSI測距
本篇博文最後修改時間:2016年11月11日,09:21。 一、簡介 本文介紹如何在SimpleBLEPeripheral工程中,通過RSSI粗略測距。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:
【BLE】-CC2541低功耗測試實驗-晶片驗證篇
實驗介紹 通過檢視晶片手冊cc2541的電氣特性表,cc2541低功耗(LowPower)有三種狀態:PowerMode1(簡稱:PM1)、PowerMode2(簡稱:PM2)、PowerMode3(簡稱:PM3)。 描述: PM1:
【BLE】CC2541實時更新廣播包advertData內容
advertData[]是廣播包資料。 實時更新廣播包的API: extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 ad
【BLE】CC2541獲取裝置的MAC地址實驗
安卓除錯工具掃描時直接顯示就是MAC地址。 蘋果裝置是以UUID的方式顯示。 所以我們直接用安卓裝置來測試。 我們連線時可以知道主機的地址。 變數是gapRole_ConnectedDevAddr,可以在peripherial.c裡搜尋GAP_LINK_
【BLE】CC2541低功耗測試-系統執行篇
1.osal_pwrmgr_powerconserve 描述: osal_pwrmgr_powerconserve()函式低功耗具體的處理函式,可以發現要想支援此功能,必須首先包含POWER_SAVI
【閱讀】資料之美,一本書學會視覺化設計
這裡把《資料之美,一本書學會視覺化設計》的摘抄分享下吧,圖示上有不清晰的地方還請包容。 你真的理解資料了嗎? 1.對原始資料瞭解得越多,打造的基礎就越堅實,也就越可能製作成令人信服的資料圖表。 2.好的視覺化設計,需要具備統計學和設計方面的知識。
【C++】類中靜態成員的宣告、初始化
【C++】類中靜態成員的宣告、初始化 類中靜態成員的宣告 初始化 靜態資料成員值的改變 完整例子 有參考大佬 零點零一 的文章: https://blog.csdn.net/thanklife/article/details/784
【C++】利用建構函式對類物件進行初始化
一、物件的初始化 每一個物件都應當在它建立之時就有就有確定的內容,否則就會失去物件的意義。 class Time { int hour = 0; int min = 0; int sec = 0; }; 這種是錯誤的,類並不是一個實體,並不佔儲存空間,顯然無處容納