OpenEdv-开源电子网

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

今天刚入手STM32,看到配置IO口地方有些疑问,求指导!

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-8-4
在线时间
0 小时
发表于 2016-8-4 17:00:30 | 显示全部楼层 |阅读模式
1金钱
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)
{
  /* Check the parameters */
  assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
  assert_param(IS_FUNCTIONAL_STATE(NewState));
  if (NewState != DISABLE)
  {
    RCC->APB2ENR |= RCC_APB2Periph;
  }
  else
  {
    RCC->APB2ENR &= ~RCC_APB2Periph;
  }
}

我展开assert_param的宏定义,如下:
/* Exported macro ------------------------------------------------------------*/
#ifdef  USE_FULL_ASSERT

/**
  * @brief  The assert_param macro is used for function's parameters check.
  * @param  expr: If expr is false, it calls assert_failed function which reports
  *         the name of the source file and the source line number of the call
  *         that failed. If expr is true, it returns no value.
  * @retval None
  */
  #define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))
/* Exported functions ------------------------------------------------------- */
  void assert_failed(uint8_t* file, uint32_t line);
#else
  #define assert_param(expr) ((void)0)

#endif /* USE_FULL_ASSERT */
查看USE_FULL_ASSERT的定义后发现,他的定义被屏蔽掉了,所以对其assert_param的定义就有点搞不懂了,为什么一个展开为((void)0)的宏,可以用来检测IO口?


还有IS_RCC_APB2_PERIPH(RCC_APB2Periph) 与 IS_FUNCTIONAL_STATE(NewState),实际上就是一个逻辑判断而已,逻辑中有一个条件符合,这2个函数就返回1,否则为0. 但是,在这个
#define assert_param(expr) ((void)0)
的宏定义中,expr是否为0也并没有什么实际的意义呀?


    以下就是我的问题,还望大家帮忙回答解惑下!谢谢!

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-8-4 18:34:28 | 显示全部楼层
assert_param是检查你变量是否在规定的范围内
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 19:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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