修改WriteLED()的代码以直接使用ODR寄存器。该代码应该读取当前的 寄存器的值,然后根据要打开的 LED 写回修改后的值 打开或关闭。
给我的示例代码
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
/* Check the parameters */
assert_param(IS_GPIO_PIN(GPIO_Pin));
GPIOx->ODR ˆ= GPIO_Pin;
}
需要修改的代码
WriteLED (uint8_t LED, uint8_t State)
{
// Check for correct state
if ((State != LED_OFF) && (State != LED_ON))
{
return;
}
// Turn on/off the LED
switch (LED)
{
case 'L':
HAL_GPIO_WritePin (LD4_GPIO_Port, LD4_Pin, State);
break;
case 'T':
HAL_GPIO_WritePin (LD3_GPIO_Port, LD3_Pin, State);
break;
case 'B':
HAL_GPIO_WritePin (LD6_GPIO_Port, LD6_Pin, State);
break;
case 'R':
HAL_GPIO_WritePin (LD5_GPIO_Port, LD5_Pin, State);
break;
}
return;
}
上面的代码输出到 ODR 寄存器时应该是什么样子
最佳答案
您需要了解 C 位运算。三者分别是^
(异或)、&
(按位与)、|
(按位或)
清除一点
GPIO->ODR &= ~pin_mask;
设置一点
GPIO->ODR |= pin_mask;
这应该为您提供足够的信息。
关于c - 在STM32上直接使用ODR寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56351752/