入手新单片机流程&提高可移植性的编程技巧

2023-05-16

    现在单片机种类众多,各有各的优势与不足。体现在价格、速度、外设、功耗、封装等许多方面,这些单片机不可能一一去学习,因此今后有很大可能需要应用到自己不熟的单片机,对此,我总结了一些经验(个人经验之谈,仅供参考)。

    有条件的话,在开始之前最好是买个开发版或最小系统,实在买不到也可自己搭个最小系统。

    一、掌握自己领域可能用到的几种主流单片机或编程软件(SDK)使用方法,具体可分为:

            1、看数据手册:了解对象单片机电气特性如供电电压、最小系统要求、各管脚名称作用。

            2、选编程工具:了解对象单片机编程工具和编程前准备工作,不同单片机编程工具盒编程方式可能不同,编程前可能需要提前配置。如STC的51可直接通过串口编程,STM8可用STLINK或串口并可能要先配置选项字节(Option Byte)。

            3、选编程软件:了解对象单片机的主流软件编程,不同软件编程方便程度差别较大,各有各的特色,不过选择最好遵循一下几点:

                   ①:使用主流编程软件,主流软件有大量参考例程,许多代码可以方便的移植。软件的稳定性可靠性较高,编译优              化较好。

                  ②:使用自己熟悉的软件,许多软件如Keil有51、AVR、ARM等多种版本,用自己熟悉的软件可以大大减少软件               方面的适应时间。

            4、验证编译下载过程(可省略):在网上找几个简单的如亮灯、中断使用等例程刷在单片机中验证编译、下载过程能正常工作。

            5、学习软件编程模版:不同的软件的驱动库不一样,中断服务函数格式不一样。寄存器编程时,包含单片机头文件时可以打开头文件去看看,编程时也需要经常查询其中的内容。中断过程要了解(不同SDK不一样):包括开关总中断,开关外部中断,中断中断服务函数进入和推出格式。至此应该能驱动GPIO了。

            6、学习编程参考手册:编程参考手册上有各模块的详细介绍和使用方法,通过学习参考手册结合可以掌握大多数外设的使用(如GPIO、时钟、定时器、中断、ADC、UART、I2C、SPI、EEPROM和SDIO等高级外设)。

      至此已经可以使用该单片机的绝大多数功能了,新种单片机入手也就差不多完成了,学习时间最长的可能还是在各种外设的学习和编制对应驱动程序了,为了找到一种方便以后快速移植的方法提高可移植性。我做了如下总结。

    二、外设驱动库的编写:

          外设驱动主要分为三大块:初始化函数、接口函数和中断服务函数。

          外设驱动库有两种:官方外设库函数(如果有,如STM32系列)、自编外设库库函数。官方外设库函数优点是函数稳定,描述性编程便于使用和理解,缺点是函数不够精简,代码占用空间大,运行稍慢(可忽略不计),写程序时输入量较大。自编库函数优点是代码透明便于自己修改,代码可对应不同应用做深度优化,代码精简,占用空间小,运行效率高,写代码时输入量小。

           官方驱动库程序已经有很成熟的几种版本,一般全新开发就用最新的驱动库版本,产品升级就用原来使用的驱动库版本以确保兼容性。程序已开发好,只用管调用,这里不讨论。

           自编外设库函数:自编库函数需要写头文件和源文件。分别写定义声明和函数体。一下就具体注意事项分别叙述:

           1、初始化函数:参考编程参考手册对外设相应各项进行配置,并做好注释(最好用英文注释,以防以后注释出现乱码),可以写带几种主要参数的初始化,没用到的部分给注释掉,留以后修改。为使参数便于阅读,可给参数定义一个别名。

            2、接口函数:接口函数会被外设频繁调用要有足够的可移植性,因此定义接口函数时应考虑到各种单片机各种软件调用这种功能是的一般形式。传入参数和返回值要慎重设计。

            简单的接口函数结合传入参数直接操作寄存器(一定要做好英文注释)。

            复杂点的接口函数分两层,第一层接口函数(应用程序直接调用的)不要直接操作硬件(不直接操作寄存器),第二层做底层操作,直接操作硬件(寄存器操作),给第一层API提供服务,以后不同单片机移植也是改这一层。

            3、中断函数:类似接口函数的编写,分两层,中断函数中不直接操作寄存器。将开关中断和清标志位函数等直接操作寄存器的函数封装到固定的函数名中。

            这些编写好后做下整理,将底层硬件操作放在驱动文件头部并用注释标明方便以后找到直接修改。

            另外:编写驱动库尽量不要定义全局变量。更多的可以参考各种芯片驱动库的编写方式。

    总结:单片机就是通过执行写在里面的程序使用各种片上外设实现各种输入与输出,以实现各种功能。熟悉单片机无外乎熟悉它的各种片上功能、外设与编程软件。不同的单片机编程方式会有些不同但只要解决了单片机硬件层的驱动程序就可以方便的让单片机跑起来。

    而提高可移植性的要点就是将硬件层抽象为一个个接口函数,屏蔽硬件之间的差异,并提供一个统一的与平台无关的函数名(接口)供上层程序调用。如果一个复杂的程序通过此方法一层层建立起来,程序的会逻辑更加清晰,不光硬件平台的转换会变得方便许多,对以后的程序修改、优化和扩展也帮助良多。

            


            


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

入手新单片机流程&提高可移植性的编程技巧 的相关文章

  • 单幅图像场景理解,论文解读

    Karsch K Liu C Kang S B Depth Transfer Depth Extraction from Video Using Non Parametric Sampling J IEEE Transactions on
  • AD转换 XPT2046

    首先介绍一下csdn屏蔽广告 这个至关重要 xff0c 请参考 https blog csdn net Demo Liu article details 81538222 应用电路 引脚功能描述 控制位命令 控制字节各位描述 单端模式输入配
  • Windows VNC远程连接用法

    VNC Virtual Network Console 是虚拟网络控制台 被控端 被控端需要打开服务 xff0c 等待主控端连接 服务端已经启动成功 xff0c 右下角有小图标 主控端 打开主控端 xff0c 连接被控端 输入被控端ip 输
  • Cheat Engine 基本用法

    首先介绍一下csdn屏蔽广告 这个至关重要 xff0c 请参考 https blog csdn net Demo Liu article details 81538222 打开游戏 当前血量2620 打开Cheat Engine 扫描262
  • SPL06-001 气压计

    歌尔是全球领先的MEMS厂家 xff0c 最新推出新款气压传感器SPL06 001 xff0c 定位精度可达5cm 手册地址 https download csdn net download zhangxuechao 10548473 寄存
  • 易语言网页登录 POST

    首先介绍一下csdn屏蔽广告 这个至关重要 xff0c 请参考 https blog csdn net Demo Liu article details 81538222 使用精易模块 打开网页登录窗口 抓取数据 输入用户名密码 xff0c
  • 十六进制字符串转换为十进制

    十进制字符串转换为十进制数 char str 61 34 123 34 int n 61 atoi str printf 34 d n 34 n 输出 xff1a 123 十六进制字符串转换为十进制数 法一 long long change
  • QTableWidget获取选中行内容

    首先介绍一下csdn屏蔽广告 这个至关重要 xff0c 请参考 https blog csdn net Demo Liu article details 81538222 QList lt QTableWidgetItem gt items
  • AT+CNUM获取不到手机号

    原因是卡商没有写入SIM卡 解决办法 手动写入 1 先确认SIM卡的本机号码 2 选择电话本存储 span class hljs comment AT 43 CPBS Select phonebook memory storage 34 O
  • linux远程桌面连接 VNC Server

    更新源 sudo apt get update 安装vnc4server sudo apt get install vnc4server 修改vnc远程连接密码 vncpasswd 编辑vnc4server的配置文件 vi vnc xsta
  • 上传gitee教程,Gitee怎么上传代码到仓库

    目录 第一步 xff1a 配置git的用户名和邮箱 第二步 xff1a 上传到远程仓库 第三步 xff1a 将仓库的master分支拉取过来和本地的当前分支进行合并 第四步 xff1a 将修改的所有代码添加到暂存区 第五步 xff1a 将缓
  • HJ6 质数因子

    描述 功能 输入一个正整数 xff0c 按照从小到大的顺序输出它的所有质因子 xff08 重复的也要列举 xff09 xff08 如180的质因子为2 2 3 3 5 xff09 输入描述 xff1a 输入一个整数 输出描述 xff1a 按
  • strstr字符串查找

    1 查找字符串 strstr是在字符串str1中查找是否含有字符串str2 如果有则返回字符串 xff0c 无则返回NULL 没有找到字符串 using namespace std include lt iostream gt includ
  • pip install cupy安装缓慢,安装cupy-cuda101 (for CUDA 10.1)代替

    直接安装cupy会特别的慢 xff0c 甚至以为卡死了 直接安装对应的cupy cuda包即可 cupy cuda101 for CUDA 10 1 cupy cuda100 for CUDA 10 0 cupy cuda92 for CU
  • WDS ISC-DHCP-SERVER PXE

    Debian Linux bullseye gt cat etc os release PRETTY NAME 61 34 Debian GNU Linux bullseye sid 34 NAME 61 34 Debian GNU Lin
  • [QT]QMessageBox 的四种用法

    http blog csdn net liukang325 article details 13768481 之前的一些QT笔记 xff0c 整理一下 cpp view plain copy print void MainWindow on
  • C语言宏定义技巧(常用宏定义)(转)

    写好C语言 xff0c 漂亮的宏定义很重要 xff0c 使用宏定义可以防止出错 xff0c 提高可移植性 xff0c 可读性 xff0c 方便性 等等 下面列举一些成熟软件中常用得宏定义 1 xff0c 防止一个头文件被重复包含 ifnde
  • 【Linux】Ubuntu通过命令行设置用于apt安装的网络代理

    以下设置适用于Ubuntu 20 04系统 1 打开apt设置文件所在的文件夹 cd etc apt apt conf d 2 在该文件夹下新建一个名为proxy conf的文件 vi proxy conf 3 在文件中写入以下内容 Acq
  • ROS入门跟着我就够了(一)ROS概述与环境搭建

    写在最前面的话 xff1a 这是第一次在CSDN写博客 xff0c 也算是正式踏入这个圈子 准备两三天一更 xff0c 把学习经历完整记录下来 希望最后回看过来能收获很多 查了很多资料 xff0c 入门ROS比较好的免费资源是古月居的讲授以
  • 电脑windows,ubuntu系统vnc-viewer和服务器ubuntu的连接,以及灰屏现象处理

    目录 1 在服务端 xff08 Ubuntu xff09 安装vncserver xff1a 2 在客户端安装vnc viewer3 启动3 1 先kill掉之前启动的2号端口3 2 修改服务器端的xstartup3 3 给权限3 4 再启

随机推荐