在使用STM32单片机时,对于assert_param函数在单片机的各个外设等的初始化作用没有仔细看,本篇博客将表达自己对该函数的理解。
#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函数
函数的作用是:如果参数expr不成立,则调用assert_failed函数,与此同时该函数会报告源文件的名称和调用失败的源行号。
如果参数expr成立,则返回0.
主要的作用就是检测传参的正确性。
以DMA的FIFO_MODE_STATE为例
assert_param(IS_DMA_FIFO_MODE_STATE(hdma->Init.FIFOMode));
经过传参后进入下式函数
#define IS_DMA_FIFO_MODE_STATE(STATE) (((STATE) == DMA_FIFOMODE_DISABLE ) || \
((STATE) == DMA_FIFOMODE_ENABLE))
如果在初始化时选择((STATE) = DMA_FIFOMODE_DISABLE )
则 ((STATE) = =DMA_FIFOMODE_DISABLE ) 的逻辑值为1
则(((STATE) == DMA_FIFOMODE_DISABLE ) ||((STATE) == DMA_FIFOMODE_ENABLE))=1
所以传入的参数有效(即所传入的参数为给定参数之一),返回0