c - STM32上直接使用ODR寄存器
问题描述
修改 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;
这应该给你足够的信息。
推荐阅读
- tensorflow - 使用 Keras 进行 GPU 优化
- jquery - 使用模态和局部视图编辑数据的问题
- javascript - 在不增加 colIds 的情况下更新 agGrid 中的 columnDef
- android - 如何在谷歌地图上显示经纬度
- c# - 对调用使用 HTTPClient 的私有方法的控制器操作进行单元测试
- javascript - .select2() 显示原始和 select2 下拉列表
- arrays - Qt3D统一整数数组
- r - R随机森林:当特征表中的列序列发生变化时,OOB错误率会发生变化
- javascript - 在 node.js 中使用 docker 引擎 API 创建 docker 服务
- tensorflow2.0 - 如果你使用 Tensorflow 数据集,你必须上传你的数据吗?