现在单片机开发越来越多用的是库函数版本的,寄存器版本使用越来越少了。但是在有些项目中使用库函数会导致程序运行速度比较慢,没有直接操作寄存器运行起来速度快。所以在对时间要求比较严格的项目中,还是需要使用寄存器来开发。如果不能够找到寄存器相关示例代码的时候,开发起来还是比较困难的。今天就来总结一个快速将库函数移植为寄存器的方法,这个方式为通用方法,在任何单片机上都可以使用。
现在就用一个STM8单片机库函数的工程来举例。
这个代码的主要功能就是使用定时器1的捕获功能来计算输入波形的频率。对于定时器的初始化使用的都是库函数,现在要将定时器初始化部分的库函数修改为寄存器。
首先单步调试,进入初始化函数中。
单步进步到这个函数内部。
可以看到在这个函数中初始化了6个寄存器,将这6个寄存器分别添加到观察窗口中。
在代码中是通过指针的方式去操作寄存器的,所以在将寄存器添加到观察窗口时要注意名字格式,需要将 TIM1->ARRH 修改为 TIM1_ARRH 格式。添加寄存器的时候,可以直接在观察窗口表达式的位置处单击鼠标,直接将寄存器的名字输入进去。
然后将寄存器值显示的方式修改为 16进制显示。在观察窗口中寄存器上单击鼠标右键,选择16进制显示。
按照同样的方法将其他寄存器全部添加进去。
此时寄存器的值都为默认值,然后单步执行程序。观察寄存器值的变化。
当前函数执行完成之后,所有的寄存器值就是库函数设置之后的值。将这些寄存器的值记录下来。
相当于TIM1_TimeBaseInit()函数设置的就是这几个寄存器,然后设置后的寄存器值就是变量观察窗口中的值。按照同样的方法,依次单步调试,记录下所有初始化寄存器的值。
当初始化代码中的寄存器值全部记录完成之后,这时候就可以用寄存器直接替换库函数了。
替换完成后运行程序,观察程序运行结果是否争正确。通过观察串口输出的结果证明程序执行是正确的。
这样通过单步调试的方法,直接观察寄存器的值,就能快速的搞清楚库函数代码到底是设置了哪些寄存器,设置后的值是多少。当设置的寄存器值知道之后,然后通过查阅单片机资料,对比寄存器中的各个位的含义,就明白了使用哪些功能要设置哪些寄存器对应的哪些位。
当看完寄存器资料后,明白了每个寄存器的作用,这时候就可以将寄存器的初始化优化一下,让代码看起来更清晰明了。
将寄存器的设置修改为位操作模式,这样直接通过代码就可以很方法的看出来操作的是哪个寄存器的哪些位。 修改完成后重新编译下载,验证一下修改之后的代码功能是否正常。
通过这种方法就能快速的了解到寄存器的使用,否则只是看单片机寄存器的相关手册的话,没有重点,而且有些手册非常大,看了后面忘了前面,效率非常低。同时在看的过程中也搞不清楚,有些寄存器到底要在哪个功能中去设置。而通过单步调试的方法,直接观察库函数中设置的寄存器,就能快速的了解寄存器的作用,可以做到用什么功能时再去看对应寄存器的资料,避免了单纯看资料浪费时间过程,还提高了学习效率。
上一篇:STM8单片机ADC采样功能通过定时器触发
下一篇:IAR软件中直接查看编译后代码大小
推荐阅读最新更新时间:2024-11-10 12:35
推荐帖子
- 【TI工程师经验谈】运算放大器增益误差设计指南
- 您坐下来为您的电路选择合适的运算放大器(opamp)时,首先要做的便是确定系统通过该放大器进行传输的信号带宽。一旦您确定下来这一点,您便可以开始寻找正确的放大器。来自高速设计专家的告诫是:您应该避免使用相对您的应用而言速度过快的模拟器件。因此,您要尽量选择一种闭环带宽稍高于信号最大频率的放大器。它听起来好像是一种较好的产品选择方案,但是这种设计方法将可能会给您的应用板带来灾难性的后果。在实验室中,您可能会发现当您将应用最大频率的输入正弦波信号置入系统时,您放大器的输出信号并未穿过希望
- soso 模拟与混合信号
- 16位CRC校验原理与算法分析
- 这里,不讨论CRC的纠错原理以及为什么要选下面提及的生成多项式,只是针对以下的生成多项式,如何获得CRC校验码,作一个比较详细的说明。标准CRC生成多项式如下表:名称生成多项式简记式*标准引用CRC-4x4+x+13ITUG.704CRC-8x8+x5+x4+10x31CRC-8x8+x2+x1+10x07CRC
- Aguilera DSP 与 ARM 处理器
- ESP32-C3上手体验与开发环境搭建
- 1.说明2.开发环境搭建2.1下载ESP-IDF的环境2.2编译代码2.3程序烧录与验证3.ESP32-C3LED分析4.使用WiFi功能5.小结1.说明ESP32-C3采用的是RISCV架构的芯片,目前又专注RISCV研究,所以特此来研究一下这个芯片的使用情况。该芯片的主要特性如下:采用RSCV-V32位的单核处理器,四级流水线架构,主频是160MHz。内置400KBSRAM,384KBROM完善的Wi-Fi子系统低功耗蓝牙外设支持
- 火辣西米秀 国产芯片交流
- Helper2416-19——裸机第十弹——S3C2416中断控制器+定时器中断实践(附源码)
- 本帖最后由yuanlai2010于2014-7-2620:16编辑 裸机第十弹——S3C2416中断控制器+定时器中断实践参与Helper2416开发板助学计划心得看了下S3C2416的中断控制器的配置还是比较简单的,对比之前AM335X的中段控制器,感觉S3C2416的中断用起来不是很灵活,至少这个优先级机制感觉很死板,也不能实现抢占优先级,不知道怎么实现高优先级中断打断低优先级中断而执行。不过也可能是我还没能领悟其中的奥妙之处吧!参考下图,基本就
- yuanlai2010 嵌入式系统
- SD卡的命令
- 3.1.SD卡的命令格式:SD卡的指令由6字节(Byte)组成,如下:Byte1:01xxxxxx(命令号,由指令标志定义CMD39为100111即16进制0x27,那么完整的CMD39第一字节为01100111,即0x27+0x40)。Byte2-5:CommandArguments,命令参数,有些命令没有参数。Byte6:前7位为CRC(CyclicRedundacyCheck,循环冗余校验)
- 13691982107 医疗电子
- 卡尔曼滤波原理的学习
- 《卡尔曼滤波原理及应用:MATLAB仿真》讲了卡尔曼滤波的基本原理及扩展卡尔曼滤波的原理,书中有MATLAB仿真代码,可以作为电子信息类各专业高年级本科生和硕士参考资料,非常适合自学者。卡尔曼滤波原理的学习有时间借本卡尔曼滤波的书来看看有Python仿真的相关书籍吗simulink专门用于仿真的
- ANSHANLIU 测试/测量
设计资源 培训 开发板 精华推荐
- DER-484 - 300W正向电源
- 立创海外代购墨水屏驱动
- AM2G-4818DZ ±18V 2 瓦 DC-DC 转换器的典型应用
- LT3091MPDE 低压差工作在非常低的输出电压下的典型应用
- LTC6990HDCB#TRMPBF 温度到频率转换器的典型应用。从 -20 oC (fOUT - 20kHz) 到 75 oC (fOUT - 25kHz) 的线性度为 3%
- 涂鸦多功能传感器-报警灯和人体传感器电路
- 使用 Semtech 的 SC1660 的参考设计
- RT8450B 高压多拓扑 LED 驱动器通过 ACTL 引脚的典型应用 PWM 调光降压配置
- 使用 NXP Semiconductors 的 MC1319 的参考设计
- LT1072CS8 全隔离转换器的典型应用
- 秋风送爽,你来答题我送礼!看Maxim 深入浅出低功耗处理器视频精彩为您呈现!
- 下载Mentor白皮书,迎接电路板与晶片日益复杂的设计挑战,还有好礼相送哟!
- 有奖直播|MPS电感解决方案,助力更好的开关电源设计
- 有奖学习 | Multi-Die系统的设计和验证很难吗?教你轻松“拿捏”
- DEYISUPPORT:【全新FAQ来袭】今夏且听风吟,你不能错过的精华!
- EEWORLD年度人物公布啦!2013,感谢有你!
- #Micropython大作战#第二弹:发表mciropython原创教程赢好礼!
- 英飞凌&英恒|如何选择一颗合适的车用MOSFET
- 有奖直播|ADI 惯性MEMS应用那些事
- 直播已结束|ADI 振动信号的精密采集信号链设计考量