在驱动 1602 液晶等使用8位并口的设备时需要直接在相邻的端口上输出一个字节,而 STM32 使用 HAL 库的情况下并没有直接操作一组 IO 口的函数。
网上查到的一些示例代码直接去操作 ODR 寄存器,有人说可行,但是也有人说在高位端口会带来一些意想不到的问题。
遇到这种疑惑最简单的办法就是去查手册了,下面是官方的手册关于 BSRR
寄存器的描述:
数据手册
我们可以看到 BSRR
寄存器就是在置位或者清除 ODR
寄存器。
BRi | BSi | IO_out |
---|---|---|
0 | 0 | 无影响(保持原来的状态) |
0 | 1 | 1 |
1 | 0 | 0 |
1 | 1 | 1 |
查看 HAL 库中的设置 IO 输出的函数可以发现它也是通过操作 BSRR
来实现 IO 状态设置的。
HAL 库中 Writepin 函数
接下来我们自己测试下
测试 - 定义变量
测试 - 语句
我们定义一个 32 位变量 reg
模拟 32 位的 BSRR
寄存器,8 位变量 da
是我们要输出到引脚的字节。经过操作之后,寄存器中的值变成了下面这样:
测试 - 结果
reg
寄存器的值为 0x00dc0023,也就是 BR[15:0] (BSRR[31:16]) 为0x00dc,BS[15:0] (BSRR[15:0]) 为0x0023。
如图所示,最后输出了我们想要的结果。
输出
总结一下就写出这样的函数:
传输函数
最后附上使用此代码传输数据来驱动的 LCD1602。
LCD1602A