请选择 进入手机版 | 继续访问电脑版
快捷导航
1 36

STM32固件库中assert_param的作用——学习笔记

taoge 于 2018-12-10 15:43 发表在 [已结贴] [复制链接]

注册后可查看大图哦

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

在学习stm32库函数过程中,笔者遇到大量的assert_param语句。经查明,assert_param的作用就是用来判断传递给函数的参数是否是有效值。


以下是从固件库中复制粘贴的:

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;
  }
}

笔者用keil中的鼠标右键“go to definition xxxxxx"" 查看assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));语句中IS_RCC_APB2_PERIPH的定义,得到如下结果:

/** @defgroup APB2_peripheral
  * @{
  */


#define RCC_APB2Periph_AFIO              ((uint32_t)0x00000001)
#define RCC_APB2Periph_GPIOA             ((uint32_t)0x00000004)
#define RCC_APB2Periph_GPIOB             ((uint32_t)0x00000008)
#define RCC_APB2Periph_GPIOC             ((uint32_t)0x00000010)
#define RCC_APB2Periph_GPIOD             ((uint32_t)0x00000020)
#define RCC_APB2Periph_GPIOE             ((uint32_t)0x00000040)
#define RCC_APB2Periph_GPIOF             ((uint32_t)0x00000080)
#define RCC_APB2Periph_GPIOG             ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000400)
#define RCC_APB2Periph_TIM1              ((uint32_t)0x00000800)
#define RCC_APB2Periph_SPI1              ((uint32_t)0x00001000)
#define RCC_APB2Periph_TIM8              ((uint32_t)0x00002000)
#define RCC_APB2Periph_USART1            ((uint32_t)0x00004000)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00008000)
#define RCC_APB2Periph_TIM15             ((uint32_t)0x00010000)
#define RCC_APB2Periph_TIM16             ((uint32_t)0x00020000)
#define RCC_APB2Periph_TIM17             ((uint32_t)0x00040000)
#define RCC_APB2Periph_TIM9              ((uint32_t)0x00080000)
#define RCC_APB2Periph_TIM10             ((uint32_t)0x00100000)
#define RCC_APB2Periph_TIM11             ((uint32_t)0x00200000)


#define IS_RCC_APB2_PERIPH(PERIPH) ((((PERIPH) & 0xFFC00002) == 0x00) && ((PERIPH) != 0x00))


。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

以这个函数为例:

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState)的作用就是使能APB2外设时钟,而当我们调用这个函数的时候,所给它的参数必须是以上规定的几个数值中的一个,不可随意填一个未定义的值进去。assert_param()函数有效的解决了这个问题,它在函数运行之初,便判断工程师所给的值是否为这个函数的有效值,以达到纠错报错的功能。同时,当我们不知道这个函数该填入什么样的值的时候,就可以使用keil中提供的右键“go to definition xxxx"查看assert_param()括号中的定义。



Connecting & Messaging from Any.

共 1 个关于本帖的回复 最后回复于 2018-12-17 09:30

@TK 注册会员 发表于 2018-12-17 09:30:56 | 显示全部楼层
taoge???????????
Connecting & Messaging from Any.
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2019-2-20 03:37