历史上的今天
返回首页

历史上的今天

今天是: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位无符号数,通过对这个数的前三位与后五位,来确定该状态


标志位。


推荐阅读

史海拾趣

BOT公司的发展小趣事

广西来宾电厂是中国第一个国家正式批准的BOT试点项目。该项目由法国电力国际和通用电气阿尔斯通公司作为项目公司的主要股东,总投资为6.16亿美元。这个电厂的装机规模为72万千瓦,安装了两台36万千瓦的进口燃煤机组。在长达18年的特许经营期内,该项目为广西地区提供了稳定的电力供应,同时也为项目公司带来了可观的投资回报。随着时间的推移,该项目成为了BOT模式在中国成功应用的典范,为后来的类似项目提供了宝贵的经验。

Datatronic公司的发展小趣事

Datatronic公司深知人才是企业发展的核心。因此,公司一直注重人才的培养和引进。公司建立了完善的人才培训体系,为员工提供广阔的发展空间和机会。同时,公司还积极引进国内外优秀人才,为公司的技术创新和市场拓展提供了有力支持。这些举措使得Datatronic公司在人才方面形成了竞争优势。

Fractus公司的发展小趣事

1999年,Carles Puente博士和Ruben Bonet联合创立了Fractus公司,致力于将几何结构天线技术商业化。公司成立之初便取得了重大突破,获得了全球首个分形天线和多重分形天线专利。这些专利不仅展示了Fractus在天线设计领域的领先地位,也为公司后续的发展奠定了坚实的技术基础。

DOMINANT公司的发展小趣事

随着公司业务的不断发展,统明亮开始积极拓展全球市场。它通过与国内外知名企业的合作,不断提升自身的品牌影响力和市场竞争力。同时,统明亮还积极参加各类国际展会和交流活动,与全球各地的客户建立了紧密的合作关系。这些努力使得统明亮在全球LED市场中的份额不断扩大,其品牌影响力也得到了进一步提升。

请注意,由于篇幅限制,以上仅为三个简要故事。如果需要更多关于DOMINANT公司的发展故事,建议查阅相关报道和资料。

德崧电子(D-SWITCH)公司的发展小趣事

作为一家有社会责任感的企业,德崧电子始终关注环保和可持续发展。公司在生产过程中积极采用环保材料和工艺,减少对环境的影响。同时,公司还积极参与公益事业,为社会做出贡献。例如,在疫情期间,德崧电子捐赠了一批医疗设备和物资给当地的医疗机构,为抗击疫情做出了积极贡献。这种勇于担当社会责任的精神不仅赢得了社会的赞誉,也为公司树立了良好的企业形象。

中移物联网(Chinamobile)公司的发展小趣事

中移物联网自2012年成立以来,便致力于物联网专用网络的建设。根据中国移动的整体战略布局,公司开发并运营了物联网连接管理平台OneLink和物联网应用开放平台OneNET,为各行业提供稳定、高效的物联网连接服务。这些平台的建立,不仅满足了市场对于物联网连接的需求,也为公司后续业务的拓展奠定了坚实基础。

问答坊 | AI 解惑

开幕式升降舞台部分有“石家庄造”

开幕式升降舞台部分有“石家庄造” 世界瞩目的北京奥运会开幕式在期待中揭开了面纱。开幕式大气磅礴的气势、绚丽缤纷的色彩吸引了每一位观众。产生这样美妙的效果,除了大师的导演,位于鸟巢中央升降舞台也起到不可估量的作用。记者了解到,开幕式 ...…

查看全部问答>

实用电源电路集锦

实用电源电路集锦…

查看全部问答>

苦读四年 月薪等同农民工?

调查:大学毕业生与农民工收入仅高200—300元     专家:收入多少与身份无关     近日,人力资源和社会保障部部长尹蔚民表示:“有可能,同龄刚毕业的大学生与农民工收入逐步趋向一致”。 昨(10)日,记者来到成都市人力资 ...…

查看全部问答>

辩论一下--ARM嵌入式系统有必要跑操作系统吗

正所谓:买了个洗脸盘,不见得一定要用来洗脸,洗衣服。洗菜都可以!   大家对ARM上跑操作系统有什么理解?      …

查看全部问答>

PLC

在设计PLC电气电路时有什么方法,具体的思维像设计数字电路一样的方法去实现自动控制!!充分利用好:那些接触器,如何的去联接组合呢?请哪位高手指点下!!比如说用接触器开关去实现控制电机起动!!由星型到三角型起动!1…

查看全部问答>

tornado 2.2 连编译都抛异常

刚装上WINDRIVER.TORNADO.V2.2.FOR.POWERPC 什么都没加 只是一个最简单bootable的工程 想用VXSIM仿真一下 结果连编译都过不了 具体异常如下 Exception 0xC0000005: EXCEPTION_ACCESS_VIOLATION Log file has been generated and saved as: C:\\ ...…

查看全部问答>

str710和IARforARM问题一个

                                 我在IAR for ARM4.41A中编写了一段代码,是汉字库,只有40个汉字。现在我遇到了一个问题。如果我不用con ...…

查看全部问答>

【为C2000做贡献】合众达SEED-DSP2812开发板原理图及实例源程序

合众达SEED-DSP2812开发板原理图及实例源程序 给大家参考下::::…

查看全部问答>

【MSP430共享】用于测量印刷机套印误差的光电检测系统

摘要:为测量高速运动状态下印刷机滚筒表面位移偏差, 采用了黑白条形码编码为基础的光电检测方法 , 设计并实 现了一套非接触式光电检测系统。通过精确设计的检测条形码, 得到了系统在高速测量情况下的工作状态和测量精度,  量误差低于 ± ...…

查看全部问答>

假期你准备怎么安排学习FPGA?

还有一天就要放假了,一个学期的学习生活算是告一段落。这个假期还是挺长的,有近一个月的时间,大家的打算如何度过呢?随便聊聊,看看谁有更好的主意,我们怎么样安排?做点什么小的实践来提高自己的FPGA的水平呢?我计划把实验室的FPGA的板子带回 ...…

查看全部问答>