历史上的今天
今天是:2025年06月09日(星期一)
2018年06月09日 | stm32中关于读取状态标志位函数的自我理解
2018-06-09 来源:eefocus
为了让程序能够读取多个状态标志位的状态。固件设计了一个通用的函数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位无符号数,通过对这个数的前三位与后五位,来确定该状态
标志位。
史海拾趣
|
开幕式升降舞台部分有“石家庄造” 世界瞩目的北京奥运会开幕式在期待中揭开了面纱。开幕式大气磅礴的气势、绚丽缤纷的色彩吸引了每一位观众。产生这样美妙的效果,除了大师的导演,位于鸟巢中央升降舞台也起到不可估量的作用。记者了解到,开幕式 ...… 查看全部问答> |
|
调查:大学毕业生与农民工收入仅高200—300元 专家:收入多少与身份无关 近日,人力资源和社会保障部部长尹蔚民表示:“有可能,同龄刚毕业的大学生与农民工收入逐步趋向一致”。 昨(10)日,记者来到成都市人力资 ...… 查看全部问答> |
|
刚装上WINDRIVER.TORNADO.V2.2.FOR.POWERPC 什么都没加 只是一个最简单bootable的工程 想用VXSIM仿真一下 结果连编译都过不了 具体异常如下 Exception 0xC0000005: EXCEPTION_ACCESS_VIOLATION Log file has been generated and saved as: C:\\ ...… 查看全部问答> |
|
摘要:为测量高速运动状态下印刷机滚筒表面位移偏差, 采用了黑白条形码编码为基础的光电检测方法 , 设计并实 现了一套非接触式光电检测系统。通过精确设计的检测条形码, 得到了系统在高速测量情况下的工作状态和测量精度, 量误差低于 ± ...… 查看全部问答> |
|
还有一天就要放假了,一个学期的学习生活算是告一段落。这个假期还是挺长的,有近一个月的时间,大家的打算如何度过呢?随便聊聊,看看谁有更好的主意,我们怎么样安排?做点什么小的实践来提高自己的FPGA的水平呢?我计划把实验室的FPGA的板子带回 ...… 查看全部问答> |




