为什么有的函数他能用 或 来同时执行两个呢?

2019-08-14 19:21发布


比如这一类:
原函数:
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;
  }
}

调用的函数:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);

为什么他可以用或来使能两个呢?
小弟从51那边过来,第一次见到函数的参数可以这样用,百度查不出个所以然(可能我查的关键词不太对),求C高手为我指点一二,先谢谢各位
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
haysen
1楼-- · 2019-08-14 21:44
就是位操作啊,举个例子  定义寄存器的时候 B001 代表开灯1,B010代表开灯2,  B100代表开灯三

#define  LIGHT_OPEN_1  0X1
#define  LIGHT_OPEN_2  0X2
#define  LIGHT_OPEN_3  0X4

LIGHT =LIGHT|LIGHT_OPEN_1|LIGHT_OPEN_2|LIGHT_OPEN_1
895855647
2楼-- · 2019-08-15 02:55
还有个困扰很久的小问题,刚开始的教程里的库函数默认时钟为72mhz,
#if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)  //如果有定义这些,则编译24hmhz的,否则编译72mhz的
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
#define SYSCLK_FREQ_24MHz  24000000
#else
/* #define SYSCLK_FREQ_HSE    HSE_VALUE */
/* #define SYSCLK_FREQ_24MHz  24000000 */
/* #define SYSCLK_FREQ_36MHz  36000000 */
/* #define SYSCLK_FREQ_48MHz  48000000 */
/* #define SYSCLK_FREQ_56MHz  56000000 */
#define SYSCLK_FREQ_72MHz  72000000       //默认为72mhz,例如默认改为36mhz,这段改为#define SYSCLK_FREQ_36MHz 36000000即可
#endif
取决的原因是启动文件,还是魔术棒里的C/C++的那个define里宏定义了STM32F10X_HD,按我理解是后者,然后if不满足,编译else后面的,也就默认为了72mhz,请问我这样理解对吗?
csmjmcc
3楼-- · 2019-08-15 03:24
请查看外围时钟使能寄存器 (APB2 外设时钟使能寄存器 (RCC_APB2ENR))手册,该寄存器是针对多个端口的。该函数的功能就是将多个或单个端口相对应的位置位,使端口时钟使能。
895855647
4楼-- · 2019-08-15 04:16
 精彩回答 2  元偷偷看……
895855647
5楼-- · 2019-08-15 09:12
haysen 发表于 2017-8-3 08:02
就是位操作啊,举个例子  定义寄存器的时候 B001 代表开灯1,B010代表开灯2,  B100代表开灯三

#define  ...

通过你的例子瞬间明白了,谢谢你

一周热门 更多>