初学者求教端口初始化问题

2019-07-14 21:45发布

德飞莱STM32 mini开发板(STM32F103ZET)带的程序:里面第一个范例程序点亮一个LED灯时首先对端口初始化有这么一段代码:
  1. void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
  2. {
  3.   uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
  4.   uint32_t tmpreg = 0x00, pinmask = 0x00;
  5.   /* Check the parameters */
  6.   assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
  7.   assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
  8.   assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));  
  9.   
  10. /*---------------------------- GPIO Mode Configuration -----------------------*/
  11.   currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
  12.   if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
  13.   {
  14.     /* Check the parameters */
  15.     assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
  16.     /* Output mode */
  17.     currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
  18.   }
复制代码
我只截取了函数的一小部分,最后一句代码感觉好像有点问题啊。就是用到符号“|=”
若当前为输出模式,则设置当前模式current_mode的速度,用的是“|=”而不是等号,这样没有问题吗?
如果上次设置速度为10MHZ(GPIO->SPEED=01),而本次设置速度为2MHZ(GPIO->SPEED=10),那么最后
运算结果不是变成了11,也就是50MHZ。貌似有问题吧。

这个让我想起来以前写51的时候,比如设置定时器时遇到TMOD的设置,我平常都写TMOD=0X01,但是看到很多人
都写成TMOD|=0X01,这样不会出错吗?如果上次TMOD=0X02,而我本次想设置成0X01,那么运算后TMOD实际值不是变成了0X03???怎么解释。
0条回答

一周热门 更多>