前面利用位运算对代码进行二次优化以后,确实可读性更好,精确性更高了。但是吧,你乍一看这个代码
你可能一下都反应不过来这些的啥意思了,表达式右边上来就是一顿运算,可能刚开始大多数人都看不懂这写的什么,因此在这块我们还可以再次优化一下。如同一次优化那块,我们利用宏定义让寄存器地址的查找更加清楚,可读性更高了,那么寄存器中数据特定位是不是也有宏定义呢?
确实是有的,同样也在之前的那个stm32f10x.h头文件中。然后宏定义的就是我们这些要自己根据技术手册来确定的数值。大家可以自行在头文件中使用ctrl+F用查找功能去查看,操作方式与一次优化时我们探索宏定义文件方法类似。点击代码优化(一)宏定义寄存器名称可以直接进入。
下面我们直接利用代码联想功能直接试试看
那么我们继续输入我们这个寄存器名称,发现下面出现IOPAEN等,实际上这就是对应该寄存器控制的GPIO时钟的特定位了。
我们直接替换
接着,我们继续替换其他表达式
这里,因为GPIO端口配置寄存器中每一个端口的数据位都是类似的,所以在定义特定位的宏时直接用GPIO打头了
其次,这里CNF0表示了它里面的两个位,其中也可以利用CNF0_0 _1去单独修改这两位
这里,我们看一下手册,避免不记得了
由此就可以看见, CNFx和MODEx构成的(x=0,1,...,),其中x就表示了端口位PA0,1...,且一个包括两个特定位,我们修改的就是这两部分。
由于我们点亮第一个灯是让CNF0变成00,MODE0变成11,所以我们继续替换修改代码
然后就是设置端口高低电平的部分
同理去修改
在这里,我们看见显示出了很多端口对应的特定位的宏定义,最后的数字0,1...就是代表PA0等,所以我们直接选择PA0,即ODR0
修改完了,现在展示一下完整代码
现在,我们测试一下,看有没有问题
很明显,没有错误
现在直接运行,然后下载程序,很明显,可以运行成功,灯亮了
利用宏定义,将我们进行位运算要用的值利用特定位对应的宏进行替换即可,其他运算符都不用做改变。
根据这个原理,我们也可以顺势将其他灯也点亮,代码也简洁了不少,可读性也提高了。这也是我们今后写代码最常用的格式,到目前为止,我们才算刚刚入门。
最后,经过这三次代码的优化,我们逐渐掌握了stm32开发的代码编写风格,认识到了一些寄存器并进行了几次技术手册的翻阅,王后将继续深入学习GPIO相关知识。加油