為了讓程序能夠讀取多個狀態標志位的狀態。固件設計了一個通用的函數RCC_GetStatus(),來讀取各標志位的狀態。
下面是RCC的所有標志位:
* - RCC_FLAG_HSIRDY: HSI oscillator clock ready
* - RCC_FLAG_HSERDY: HSE oscillator clock ready
* - RCC_FLAG_PLLRDY: PLL clock ready
* - RCC_FLAG_LSERDY: LSE oscillator clock ready
* - RCC_FLAG_LSIRDY: LSI oscillator clock ready
* - RCC_FLAG_PINRST: Pin reset
* - RCC_FLAG_PORRST: POR/PDR reset
* - RCC_FLAG_SFTRST: Software reset
* - RCC_FLAG_IWDGRST: Independent Watchdog reset
* - RCC_FLAG_WWDGRST: Window Watchdog reset
* - RCC_FLAG_LPWRRST: Low Power reset
在RCC庫文件中定義了 RCC_FLAG 如下:
#define RCC_FLAG_HSIRDY ((u8)0x20)
#define RCC_FLAG_HSERDY ((u8)0x31)
#define RCC_FLAG_PLLRDY ((u8)0x39)
#define RCC_FLAG_LSERDY ((u8)0x41)
#define RCC_FLAG_LSIRDY ((u8)0x61)
#define RCC_FLAG_PINRST ((u8)0x7A)
#define RCC_FLAG_PORRST ((u8)0x7B)
#define RCC_FLAG_SFTRST ((u8)0x7C)
#define RCC_FLAG_IWDGRST ((u8)0x7D)
#define RCC_FLAG_WWDGRST ((u8)0x7E)
#define RCC_FLAG_LPWRRST ((u8)0x7F)
每個狀態標志位定義為無符號的8位數,通過查找發現,其具體的值表示的是相應寄存器中其標志位所處的位置
例如獨立看門狗的標志位 #define RCC_FLAG_IWDGRST (u8)0x7D
那么如何讀取標志位是0還是1呢
0:無*****發生
1:發生*****
即:判斷寄存器中的標志位是0還是1,但個狀態所在的寄存器總共有三個,且所在寄存器的位也不同
通過源代碼可以發現:采用兩步去完成
1、先判斷該狀態標志是在哪個寄存器中,如下程序:
FlagStatus RCC_GetFlagStatus(u8 RCC_FLAG)
{
u32 tmp = 0;
u32 statusreg = 0;
FlagStatus bitstatus = RESET;
/* Check the parameters */
assert_param(IS_RCC_FLAG(RCC_FLAG));
/* Get the RCC register index */
tmp = RCC_FLAG >> 5;
if (tmp == 1) /* The flag to check is in CR register */
{
statusreg = RCC->CR;
}
else if (tmp == 2) /* The flag to check is in BDCR register */
{
statusreg = RCC->BDCR;
}
else /* The flag to check is in CSR register */
{
statusreg = RCC->CSR;
}
三個寄存器對應于1,2,3
CR=01,BDCR=11, CSR=11; 也對應著每個狀態標志定義數據的高三位,例如:
#define RCC_FLAG_IWDGRST (u8)0x7D =0111 1101 ,其高三位011,即表明它在CSR寄存器中
所以,只要知道每個狀態標志的高三位即可,讓標志狀態右移5位即得高三位數據。
第二步判斷是在所屬寄存器的哪一位。
還是看這個宏定義:#define RCC_FLAG_IWDGRST (u8)0x7D =0111 1101 ,其低五位對應著它所在寄存器的位數
11101=29,說明獨立看門狗復位標志在CSR寄存器的29位。
看固件源程序:
tmp = RCC_FLAG & FLAG_Mask;
if ((statusreg & ((u32)1 << tmp)) != (u32)RESET)
{
bitstatus = SET;
}
else
{
bitstatus = RESET;
}
/* Return the flag status */
return bitstatus;
首先:
#define FLAG_Mask ((u8)0x1F)
即FLAG_Mask=0001 1111
它和任何8位的狀態標志做與運算得到其低五位的值,例如
tmp = RCC_FLAG & FLAG_Mask;
tmp = 11011=29,
statusreg & ((u32)1 << tmp
然后將其與所對應的寄存器做與運算即得到改狀態標志位的值。
最后返回狀態標志位。
固件原函數,根據各個狀態標志位的具體分布,即所在的寄存器與所在寄存器的位置。定義狀態標志 位8位無符號數,通過對這個數的前三位與后五位,來確定該狀態
標志位。
上一篇:STM32 串口固件庫中定義的幾個中斷標志什么意思?
下一篇:stm32 uart清除中斷時機
推薦閱讀
史海拾趣
設計資源 培訓 開發板 精華推薦
- 芯原超低能耗NPU可為移動端大語言模型推理提供超40 TOPS算力
- 芯原AI-ISP芯片定制方案助力客戶智能手機量產出貨
- AI加持,安森美一站式服務推動助聽器市場持續進步
- 意法半導體推出用于匹配遠距離無線微控制器STM32WL33的集成的匹配濾波芯片
- 如何為您的應用選擇光傳感器
- Samtec新型農業漫談系列二 | 垂直農業案列分享
- Samtec應用科普 | C-V2X技術在汽車領域的應用
- 尼得科運動&能源事業本部在印度卡納塔克邦胡布利舉行新工廠竣工儀式
- 貿澤開售Qorvo適用于5G和mMIMO應用的新型QPA9822線性5G高增益/高驅動放大器
- 邊緣計算網關工業物聯網應用:空壓機遠程運維監控管理