1. 程式人生 > >【BLE】CC2541之解析協議棧的晶振初始化過程

【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

香瓜微控制器之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘寶店):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振盪電路已經沒用了,即可關掉,省電。

相關推薦

BLECC2541解析協議初始過程

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral為例,解析協議棧的晶振初始化過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart

BLECC254132.768kHZ外部

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文介紹外部的32.768K晶振對於CC2541的作用。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Smart RF(主晶片CC2

BLECC2541通訊協議

本篇博文最後修改時間:2016年12月12日,10:51。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何在一個可讀、可寫、可通知、20位元組長的特徵值char6基礎上,新增一個香瓜自定義的通訊協議,並用app傳送指令實現P11口上的LE

BLECC2541主機端讀取特征值

roi repl void 定時 store val star content else if 本篇博文最後改動時間:2017年01月06日,11:06。

BLECC2541連線引數

轉載自: https://blog.csdn.net/feilusia/article/details/46909723 一、簡介 本文介紹CC2541的連線引數。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:S

BLECC2541電池電量服務

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個電池電量服務。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體: IAR 8.20.2 硬體平臺: Smar

BLECC2541新增特徵值

本篇博文最後修改時間:2017年03月21日,15:32。 一、簡介 本文以SimpleBLEPeripheral工程為例,介紹如何新增一個可讀、可寫、可通知、20位元組長的特徵值char6,並用app實現資料的收發。 二、實驗平臺 協議棧版本:BLE-CC254

BLECC2541發現服務與特徵值

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程為例,解析CC2541作為主機時是如何發現從機的服務和特徵值的。二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2

BLECC2541indicate

本篇博文最後修改時間:2017年08月31日,17:00。 一、簡介 本文以SimpleBLEPeripheral為例,講述如何通過按五項按鍵的“center”鍵傳送indicate資料給btool,用PC的串列埠工具打印出“indicate”的“發資料”和“應答”的過程

BLECC2541回撥函式

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程中simpleBLECentralEventCB函式,來簡要說明回撥函式的定義和呼叫過程。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編

BLECC2541開啟廣播過程

本篇博文最後修改時間:2016年11月11日,09:31。 一、簡介 本文介紹在應用層如何開啟廣播,且解析協議棧在此操作後做了什麼。 二、實驗平臺 協議棧版本:BLE-CC254x-1.4.0 編譯軟體:IAR 8.20.2 硬體平臺:Amart RF開發板(主晶

BLECC2541主機端獲取notify資料

本篇博文最後修改時間:2017年01月06日,11:06。 一、簡介 本文以SimpleBLECentral工程和SimpleBLEPeripheral工程為例,介紹CC2541作為主機時是如何獲取從機char4通道的notify資料。 二、實驗平臺 協議棧版

BLECC2541通過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:

BLECC2541實時更新廣播包advertData內容

advertData[]是廣播包資料。 實時更新廣播包的API: extern bStatus_t GAP_UpdateAdvertisingData( uint8 taskID, uint8 ad

BLECC2541獲取裝置的MAC地址實驗

安卓除錯工具掃描時直接顯示就是MAC地址。 蘋果裝置是以UUID的方式顯示。 所以我們直接用安卓裝置來測試。 我們連線時可以知道主機的地址。 變數是gapRole_ConnectedDevAddr,可以在peripherial.c裡搜尋GAP_LINK_

BLECC2541低功耗測試-系統執行篇

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; }; 這種是錯誤的,類並不是一個實體,並不佔儲存空間,顯然無處容納