OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3770|回复: 1

stm32库函数

[复制链接]

4

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-3-7
在线时间
9 小时
发表于 2016-5-2 12:21:00 | 显示全部楼层 |阅读模式
1金钱
stm32库函数中,有一个函数是这样的
FlagStatus RCC_GetFlagStatus(uint8_t RCC_FLAG)
{
  uint32_t tmp = 0;
  uint32_t 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;
  }

  /* Get the flag position */
  tmp = RCC_FLAG & FLAG_MASK;
  if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET)   
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  /* Return the flag status */
  return bitstatus;
}

为什么(tmp == 1)就可以判断/* The flag to check is in CR register */    ??
为什么(tmp == 2)就可以判断 /* The flag to check is in BDCR register */  ??
为什么其它的就可以判断 /* The flag to check is in CSR register */   ??
另外  if ((statusreg & ((uint32_t)1 << tmp)) != (uint32_t)RESET)   
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
这是为什么?

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true]#define RCC_FLAG_HSIRDY ((uint8_t)0x21) #define RCC_FLAG_HSERDY ((uint8_t)0x31) #define RCC_FLAG_PLLRDY ((uint8_t)0x39) #define RCC_FLAG_LSERDY ((uint8_t)0x41) #define RCC_FLAG_LSIRDY ((uint8_t)0x61) #define RCC_FLAG_PINRST ((uint8_t)0x7A) #define RCC_FLAG_PORRST ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

294

主题

1414

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7792
金钱
7792
注册时间
2015-10-15
在线时间
2858 小时
发表于 2016-5-2 12:21:01 | 显示全部楼层
[mw_shl_code=c,true]#define RCC_FLAG_HSIRDY                  ((uint8_t)0x21)
#define RCC_FLAG_HSERDY                  ((uint8_t)0x31)
#define RCC_FLAG_PLLRDY                  ((uint8_t)0x39)
#define RCC_FLAG_LSERDY                  ((uint8_t)0x41)
#define RCC_FLAG_LSIRDY                  ((uint8_t)0x61)
#define RCC_FLAG_PINRST                  ((uint8_t)0x7A)
#define RCC_FLAG_PORRST                  ((uint8_t)0x7B)
#define RCC_FLAG_SFTRST                  ((uint8_t)0x7C)
#define RCC_FLAG_IWDGRST                 ((uint8_t)0x7D)
#define RCC_FLAG_WWDGRST                 ((uint8_t)0x7E)
#define RCC_FLAG_LPWRRST                 ((uint8_t)0x7F)[/mw_shl_code]

时钟就绪标志位有很多个,他分布在几个寄存器里面。。。
上面的宏定义就是这个函数的入口参数,库函数在处理的时候,他自己定义了这些宏定义的值,用来方便库函数去判断。。。
仅仅只是库函数自己的逻辑而已。。。。

比如3个在CR寄存器,3个在BDCR寄存器,那么他就自己定义这些值,定义到3个是在CR寄存器里面的标志位的话,他就把第5位弄为1.方便他自己去判断。。。

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 16:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表