OpenEdv-开源电子网

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

库函数.h文件中经常会有 #define IS_** 之类的定义 是什么意思 比如:

[复制链接]

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
发表于 2014-3-2 14:50:24 | 显示全部楼层 |阅读模式
#define IS_TIM_OC_MODE(MODE) (((MODE) == TIM_OCMode_Timing) || \
                              ((MODE) == TIM_OCMode_Active) || \
                              ((MODE) == TIM_OCMode_Inactive) || \
                              ((MODE) == TIM_OCMode_Toggle)|| \
                              ((MODE) == TIM_OCMode_PWM1) || \
                              ((MODE) == TIM_OCMode_PWM2))
我是一只摔不死的蚂蚁!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-3-2 15:20:28 | 显示全部楼层
这个是库函数调用的时候,作为函数输入参数的检测,输入参数必须是这几个
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
 楼主| 发表于 2014-3-2 20:05:31 | 显示全部楼层
回复【2楼】745021926:
------------------------------
那麻烦能不能解释一下这个句式 的结构  如果我也想使用这个句式该怎么写?
我是一只摔不死的蚂蚁!
回复 支持 反对

使用道具 举报

39

主题

2026

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2020
金钱
2020
注册时间
2013-5-1
在线时间
87 小时
发表于 2014-3-2 20:39:32 | 显示全部楼层
举个简单的例子,库里面GPIO的读取函数:
/**
  * @brief  Reads the specified GPIO input data port.
  * @param  GPIOx: where x can be (A..I) to select the GPIO peripheral.
  * @retval GPIO input data port value.
  */
  //用于读取STM32的特定GPIO输入数据端口
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx)
{
  /* Check the parameters */
  assert_param(IS_GPIO_ALL_PERIPH(GPIOx));//检查传入参数是否合法

  return ((uint16_t)GPIOx->IDR);
}

上面的IS_GPIO_ALL_PERIPH就是:
#define IS_GPIO_ALL_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \
                                    ((PERIPH) == GPIOB) || \
                                    ((PERIPH) == GPIOC) || \
                                    ((PERIPH) == GPIOD) || \
                                    ((PERIPH) == GPIOE) || \
                                    ((PERIPH) == GPIOF) || \
                                    ((PERIPH) == GPIOG) || \
                                    ((PERIPH) == GPIOH) || \
                                    ((PERIPH) == GPIOI))
传入参数是这几个GPIO的话才是有效参数,否则assert_param()的参数就是0,而assert_param()宏定义是这个:
  #define assert_param(expr) ((expr) ? (void)0: assert_failed((uint8_t *)__FILE__, __LINE__))
所以,如果参数不对,就会打印对应的FILE和LINE,提示参数错误
博观而约取,厚积而薄发。
回复 支持 反对

使用道具 举报

50

主题

243

帖子

1

精华

高级会员

Rank: 4

积分
616
金钱
616
注册时间
2014-2-26
在线时间
1 小时
 楼主| 发表于 2014-3-2 22:52:39 | 显示全部楼层
回复【4楼】745021926:
---------------------------------
哦 非常感谢! 谢谢你~
我是一只摔不死的蚂蚁!
回复 支持 反对

使用道具 举报

8

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2015-7-16
在线时间
0 小时
发表于 2015-8-4 16:51:28 | 显示全部楼层
回复【4楼】745021926:
---------------------------------
expr是什么?好像在其他地方并没有定义;如果说是在宏定义中的变量,又没有指明类型?那为什么在引用的时候assert param(expr);的时候,expr可以直接用表达式取代?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-4 23:06:51 | 显示全部楼层
回复【6楼】bi‘an:
---------------------------------
expr是个表达式的参数,你如果不喜欢,可以改成任何你喜欢的名字。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-24 11:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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