举个简单的例子,库里面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,提示参数错误
/**
* @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,提示参数错误