德飞莱
STM32 mini
开发板(STM32F103ZET)带的程序:里面第一个范例程序点亮一个LED灯时首先对端口初始化有这么一段代码:
- void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
- {
- uint32_t currentmode = 0x00, currentpin = 0x00, pinpos = 0x00, pos = 0x00;
- uint32_t tmpreg = 0x00, pinmask = 0x00;
- /* Check the parameters */
- assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
- assert_param(IS_GPIO_MODE(GPIO_InitStruct->GPIO_Mode));
- assert_param(IS_GPIO_PIN(GPIO_InitStruct->GPIO_Pin));
-
- /*---------------------------- GPIO Mode Configuration -----------------------*/
- currentmode = ((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x0F);
- if ((((uint32_t)GPIO_InitStruct->GPIO_Mode) & ((uint32_t)0x10)) != 0x00)
- {
- /* Check the parameters */
- assert_param(IS_GPIO_SPEED(GPIO_InitStruct->GPIO_Speed));
- /* Output mode */
- currentmode |= (uint32_t)GPIO_InitStruct->GPIO_Speed;
- }
复制代码
我只截取了函数的一小部分,最后一句代码感觉好像有点问题啊。就是用到符号“|=”
若当前为输出模式,则设置当前模式current_mode的速度,用的是“|=”而不是等号,这样没有问题吗?
如果上次设置速度为10MHZ(GPIO->SPEED=01),而本次设置速度为2MHZ(GPIO->SPEED=10),那么最后
运算结果不是变成了11,也就是50MHZ。貌似有问题吧。
这个让我想起来以前写51的时候,比如设置定时器时遇到TMOD的设置,我平常都写TMOD=0X01,但是看到很多人
都写成TMOD|=0X01,这样不会出错吗?如果上次TMOD=0X02,而我本次想设置成0X01,那么运算后TMOD实际值不是变成了0X03???怎么解释。
一周热门 更多>