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

  现在就用一个STM8单片机库函数的工程来举例。



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

  首先单步调试,进入初始化函数中。

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

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

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

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

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

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

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

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

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

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

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

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

  将寄存器的设置修改为位操作模式,这样直接通过代码就可以很方法的看出来操作的是哪个寄存器的哪些位。 修改完成后重新编译下载,验证一下修改之后的代码功能是否正常。

  通过这种方法就能快速的了解到寄存器的使用,否则只是看单片机寄存器的相关手册的话,没有重点,而且有些手册非常大,看了后面忘了前面,效率非常低。同时在看的过程中也搞不清楚,有些寄存器到底要在哪个功能中去设置。而通过单步调试的方法,直接观察库函数中设置的寄存器,就能快速的了解寄存器的作用,可以做到用什么功能时再去看对应寄存器的资料,避免了单纯看资料浪费时间过程,还提高了学习效率。

单片机快速将库函数版代码移植为寄存器代码方法相关推荐

  1. 将Ojective-C代码移植转换为Swift代码

    相比于Objective-C,Swift语言更加简练.有时我们需要把原来写的一些Objective-C代码转换成Swift,下面总结了各种常见的情况. 1,构造函数的迁移 Objective-C为: ...

  2. STM32入门笔记(02):MPU6050、MPU9250、ICM20948及姿态解算(SPL库函数版)

    目录 MPU6050 什么是MPU6050? MPU6050的特点 MPU6050框图 MPU6050初始化 MPU6050寄存器 电源管理寄存器1(0X6B) 陀螺仪配置寄存器(0X1B) 加速度传 ...

  3. 实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    贺邦+原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数 ...

  4. 【51单片机快速入门指南】6.1:LCD1602的八线、四线控制及自定义符号,完美兼容Proteus仿真

    目录 硬知识 显示特性 接口定义 操作时序 写操作时序 读操作时序 寄存器 忙标志位BF 地址计数器(AC) 显示数据寄存器(DDRAM) CGROM CGRAM 指令 清屏指令 光标归位指令 进入模 ...

  5. 【51单片机快速入门指南】4.3.1: MPU6050调用DMP库获取四元数和欧拉角

    目录 相关介绍 DMP库相关 DMP加载步骤: DMP设置数据写入 更新DMP DMP数据包结构 程序实现 DMP.c DMP.h 测试程序 四元数 实验现象 欧拉角的获取 普中51-单核-A2 ST ...

  6. 【51单片机快速入门指南】4.3: I2C读取MPU6050陀螺仪的原始数据

    目录 硬知识 特性参数 MPU6050 简介 模块重要寄存器简介 电源管理寄存器 1 陀螺仪配置寄存器 加速度传感器配置寄存器 FIFO 使能寄存器 陀螺仪采样率分频寄存器 配置寄存器 电源管理寄存器 ...

  7. 历时 7 天,我把一万行 Scala 代码移植到了 Kotlin 上!

    [CSDN编者按]去年,Google 宣布 Kotlin 正式成为 Android 官方开发语言,由此引发了迁移 Kotlin 的一股热潮.在本文中,作者分享了他在七天内把代码从 Scala 移植到 ...

  8. 【51单片机快速入门指南】4.2: SSD1306 OLED屏(0.96寸、1.3寸)的I2C控制详解

    目录 硬知识 SSD1306简介 I2C 接口 从机地址位(SA0) I2C 总线写数据 命令解码器 晶振电路和显示时间发生器 复位 图形显示数据RAM (GDDRAM) 命令表 基本命令表 部分指令 ...

  9. MPU6050的dmp代码移植的过程--转

    让自己别忘了大学里学的东西,那么就把它记录下下来,效率会比忘记然后重新再去找资料再重头学高的多 一开始自己死命的去网上找现成的代码,但是发现大多都是打着dmp的幌子,给的是得出原始数据的代码,或者确实 ...

最新文章

  1. iOS 减少编译时间
  2. ATLAS数学库编译
  3. uos20专业版是linux哪个版本,WPS Office 2019 for Linux 专业版已与统一操作系统 UOS 完成适配...
  4. Java DataInputStream readUnsignedByte()方法(带示例)
  5. python server酱_用Python抢到回家的车票,so easy
  6. CS224N刷题——Assignment3.2_Recurrent neural nets for NER
  7. 课程管理系统 Moodle 初体验
  8. bt磁力链接转换种子中的问题
  9. javaScript深度克隆
  10. 认知升级三部曲(深度好文)
  11. GoogleVoice群发WhatsApp翻译谷歌语音消息自动群发
  12. 3.2 电话号码对应英语单词
  13. 远程桌面--某些设置由你的组织管理
  14. Windows超级管理器-便携版
  15. 适合python的vim设置
  16. 热更新Tinker的集成使用
  17. 吉时利Keithley软件2600系列2635B|2636B|2651A|2657A NS-SourceMeter源表软件
  18. MySQL数据库集群实战(1)——MySQL数据库基础知识
  19. 手机号证件号等加密方案
  20. 计算机学院迎接新生标语,大学迎接新生标语

热门文章

  1. Android数据存储:Shared Preferences
  2. trunk配置功能详解
  3. 贪心+优先队列之更改优先级-hdu1896
  4. 非结构化数据和结构化数据提取
  5. Maven 打包过滤掉jar包、class文件和指定jsp文件
  6. 基于 bootstrap 字体图标,用纯CSS实现星级评分功能
  7. python中数字类型与处理工具
  8. Spring-mvc设置@RequestMapping标签更改返回头及@RequestMapping简述
  9. 利用条件运算符的嵌套来完成此题:学习成绩 =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。...
  10. 【转】wireshark过滤规则