微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 初学者求教端口初始化问题

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

时间:10-02 整理:3721RD 点击:
德飞莱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?怎么解释。

这个等价于A=A|B,和+=一个意思,这个是按位或的。不知到理解的对不对,有错请帮忙指出

上一篇:GPS轨迹记录
下一篇:ISD1420分段录音

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top