历史上的今天
今天是:2024年12月27日(星期五)
2021年12月27日 | 单片机快速将库函数版代码移植为寄存器代码方法
2021-12-27 来源:eefocus
现在单片机开发越来越多用的是库函数版本的,寄存器版本使用越来越少了。但是在有些项目中使用库函数会导致程序运行速度比较慢,没有直接操作寄存器运行起来速度快。所以在对时间要求比较严格的项目中,还是需要使用寄存器来开发。如果不能够找到寄存器相关示例代码的时候,开发起来还是比较困难的。今天就来总结一个快速将库函数移植为寄存器的方法,这个方式为通用方法,在任何单片机上都可以使用。
现在就用一个STM8单片机库函数的工程来举例。


这个代码的主要功能就是使用定时器1的捕获功能来计算输入波形的频率。对于定时器的初始化使用的都是库函数,现在要将定时器初始化部分的库函数修改为寄存器。
首先单步调试,进入初始化函数中。

单步进步到这个函数内部。

可以看到在这个函数中初始化了6个寄存器,将这6个寄存器分别添加到观察窗口中。

在代码中是通过指针的方式去操作寄存器的,所以在将寄存器添加到观察窗口时要注意名字格式,需要将 TIM1->ARRH 修改为 TIM1_ARRH 格式。添加寄存器的时候,可以直接在观察窗口表达式的位置处单击鼠标,直接将寄存器的名字输入进去。

然后将寄存器值显示的方式修改为 16进制显示。在观察窗口中寄存器上单击鼠标右键,选择16进制显示。

按照同样的方法将其他寄存器全部添加进去。

此时寄存器的值都为默认值,然后单步执行程序。观察寄存器值的变化。

当前函数执行完成之后,所有的寄存器值就是库函数设置之后的值。将这些寄存器的值记录下来。

相当于TIM1_TimeBaseInit()函数设置的就是这几个寄存器,然后设置后的寄存器值就是变量观察窗口中的值。按照同样的方法,依次单步调试,记录下所有初始化寄存器的值。

当初始化代码中的寄存器值全部记录完成之后,这时候就可以用寄存器直接替换库函数了。

替换完成后运行程序,观察程序运行结果是否争正确。通过观察串口输出的结果证明程序执行是正确的。

这样通过单步调试的方法,直接观察寄存器的值,就能快速的搞清楚库函数代码到底是设置了哪些寄存器,设置后的值是多少。当设置的寄存器值知道之后,然后通过查阅单片机资料,对比寄存器中的各个位的含义,就明白了使用哪些功能要设置哪些寄存器对应的哪些位。

当看完寄存器资料后,明白了每个寄存器的作用,这时候就可以将寄存器的初始化优化一下,让代码看起来更清晰明了。

将寄存器的设置修改为位操作模式,这样直接通过代码就可以很方法的看出来操作的是哪个寄存器的哪些位。 修改完成后重新编译下载,验证一下修改之后的代码功能是否正常。
通过这种方法就能快速的了解到寄存器的使用,否则只是看单片机寄存器的相关手册的话,没有重点,而且有些手册非常大,看了后面忘了前面,效率非常低。同时在看的过程中也搞不清楚,有些寄存器到底要在哪个功能中去设置。而通过单步调试的方法,直接观察库函数中设置的寄存器,就能快速的了解寄存器的作用,可以做到用什么功能时再去看对应寄存器的资料,避免了单纯看资料浪费时间过程,还提高了学习效率。
史海拾趣
|
光找资料找了2天,初期因为网络问题不得力,因此资料没下载,现在网速好了,下载了很多资料,有一些指导文档和技术文档,都经过分类了。 这个是我初期下载的,可能对熟悉IAR的人有用。 原理的讲解 C语言运用讲解 G2231数据手册 白皮书1 白皮 ...… 查看全部问答> |
|
【我给xilinx资源中心做贡献】三线SPI接口的VHDL源码 三线SPI接口的VHDL源码说明:该段代码为三线制SPI接口(CS,SDA,SCK)的源码,像一般的AD或者DA器件或者时钟芯片如DS1302采用的都是这种接口.本段代码是 我的的一个系统中的一个接口部分,功能比较简单,实现的功能是通过12个SCK完成一次数据的设定.经过 ...… 查看全部问答> |
|
今天查看了一下QQ邮箱的垃圾邮件,发现了一个管理员要求补全信息的邮件,还好论坛的资料更新过已经收到板子啦,没收到的兄弟们注意查查垃圾邮件哦… 查看全部问答> |
|
XDS100仿真器去掉了,Jtag接口还要自己焊上去。习惯了裸板编程,这下可有点不知所措了。。。 听说c2000 launchpad 上的xds100 V2 可以仿真其他的器件,不知道各位有没有吃灰的,低价转让一个呗。。。。 [ 本帖最后由 airqj 于 2013-9-29 13:48 编 ...… 查看全部问答> |




