【硬件】嵌入式电子设计基础之单片机

news2024/12/24 10:24:45

本篇文章介绍了基于单片机平台开发的一些基本理论知识,包括了硬件最小系统的说明以及基于单片机开发的过程。文中还额外介绍了ARM体系架构,帮助读者从更深层次去熟悉我们平常最容易接触的开发平台,熟悉这些寄存器定义和处理器模式能够帮助我们在定位诸如死机等难以下手的问题时,提供一些方法。

文章目录

最简单片机系统与开发步骤

单片机最小系统

开发步骤

ARM架构

寄存器

处理器模式


最简单片机系统与开发步骤

我们先从最简单的实现,来介绍单片机的硬件最小系统和单片机系统开发的一般过程。

单片机最小系统

只有一个AT89S51单片机是无法实现任何功能的,除了要向单片机供电之外,还要有若干个简单的外围器件构成最简单片机系统并预留程序烧录的接口。下面介绍了最简单片机系统中都包含什么元素。

  1. 电源(+V_{cc}、GND):下图所示为AT89S51单片机的最简系统构成,40管脚和20管脚分别接电源+V_{cc}和GND。根据AT89S51的技术文档知其工作电压范围为直流+4.0~+5.5V。

  2. 时钟信号(XTAL1、XTAL2):单片机的XTAL1 端(19 管脚)、XTAL2端(18 管脚)接晶振Y1与电容C1和C2如上图所示,这种固定的结构与单片机内部的电路组成一个振荡器,产生单片机时钟脉冲信号。这种使用晶振配合产生时钟脉冲信号的方法称为内部时钟方式。晶振的频率决定了单片机系统的时钟频率。例如晶振频率为 12MHz,那么单片机的时钟频率就是12MHZ。电容C1和C2的容量范围为 20~40pF。除了内部时钟方式外,还可以把适当频率的外部时钟脉冲信号输入到XTAL2端,而把XTAL1端接地。
  3. 复位(RST):在上图中,复位端(9管脚)与+Vcc之间连接了一个 10uF 电解电容 C3,当单片机系统上电时,电解电容 C3 的正极瞬间变为+V,电容对于这个瞬间的电压突变相当于短路,于是+5V 瞬间加到复位端上使单片机复位。很快,电解电容 C3 满电,在电路中相当于断路,于是复位端电平由高转低,单片机开始进入正常工作状态。有时,只使用一个电解电容的复位电路可靠性不高,而下图 所示是两种较好的复位电路。其中,图 b按开关 S1可在手动复位时使用。当按开关闭合时,无论单片机在执行什么操作都会被强行复位。


开发步骤

以控制一个发光二极管为例,介绍单片机系统的开发过程。要想开发一个单片机系统,首先要非常明确系统的功能是什么,然后根据功能要求规划硬件(也就是设计电路)和设计软件(单片机程序),最后把程序下到单片机中进行硬件和软件联合调试,直到系统功能达到设计要求为止。

  1. 功能确定:系统启动后,单片机控制一个发光二极管点亮500ms(毫秒),熄灭 500ms,再点亮 500ms,再熄灭 500ms······如此循环,产生发光二极管闪烁的效果,如图 下图所示。
    要实现单片机控制发光二极管以500ms 为间隔闪烁,则发光二极管需要以某种形式与单片机的管脚进行连接,接受其控制。比如 P1.0口(1管脚),单片机既可以把P1.0口上的信号读入单片机,也可以通过 P1.0口输出1或0。

  2. 电路设计:所有单片机系统都可从最简系统开始,添加所需的模块。如本例控制发光二极管系统中,除了最简系统外,只需要添加一个发光二极管 D1和一支限流电阻 R1。如下图所示,添加的部分连接到P1.0 口上,当然也可以连接到 POP1P2、P3 中任何一个I/0。

  3. 程序设计:硬件电路搭建完毕后,就可以进入程序的设计阶段。单片机之所以有如此大的魅力,全赖于程序对单片机IO口及其他功能模块的控制。根据本系统功能:单片机控制一个发光二极管的点亮500ms,熄灭500ms,再点亮500ms,再熄灭500ms......发光二极管 D1连接在 P1.0口上,并知道当单片机P1.0为0时(低电平)发光二极管D1被点亮,P1.0口为1时(高电平)则熄灭。于是可得用中文描述的程序设计流程,如下图所示。

  4. 单片机并不能“理解”中文,所以还需要把上图流程转化成单片机的语言才能下载到单片机里,转换的结果如下图所示,   

因为现在很少有使用汇编语音进行编程的工程师了,我们这边只对这门语言根据上面提到的代码片做一些简要的介绍。

汇编语言(assembly language)是一种低级的与硬件打交道的语言。这段程序代码由 6行组成,除第一行的标号 START 外,其余5行就是5条指令(instruction。每一条指令会对单片机下一条命令,使单片机完成某种操作。这5条指令从头到尾执行一遍,就实现了发光二极管 D1 点亮500ms->熄灭500ms,即一次闪烁。
单片机会顺序地执行每一条指令并实现相应的操作。如第2行指令"MOV P1,#00H"让单片机的 P1 口输出0,执行完这条指令后,P10~P1.7 均为0。于是连接在 P1.0上的发光二极管被点亮。
完整的指令由标号(可选)、助记符、目的操作数、源操作数及注释(可选)组成如下图所示。

标号是以英文字母开头的字母、数字或某些特殊符号的组合,例如 D_1:、START:等。汇编语言对字母的大小写不敏感,但习惯上都使用大写字母。另外,标号可以和其他指令在同一行,也可以单独为一行。以下两种写法是等价的。

指令中助记符是必不可少的,它用来表示指令的操作功能。如上图中助记符 MOV是单词 Move 的简写,其功能是把源操作数 (00H)载入目的操作数(P1)中。而目的操作数是指令最终作用的对象。源操作数参与指令的操作,指令的执行将使用到源操作数。如指令MOV P1,#00H的功能是把 00H载入P1中。源操作数中,#号代表其后的00H是一个立即数,也就是说该指令的源操作数由一个立即数充当,指令执行完毕后,P1=00H,即P1.0~P1.7口输出均为0。

注释是程序编写人员为了他人或自己阅读程序时方便而标记的,可以用来提高程序的可读性和调试的方便性。在汇编语言中,分号后面的部分是不会影响指令的,只是程序中解释说明的部分。也就是说,分号后的部分并不是可执行程序的一部分。下图是控制发光二极管闪烁的完整程序。

我们开发单片机程序的工具称之为Keil,是国际上比较流行的单片机程序的开发和仿真软件。我们可以在Keil选择芯片的型号,这样集成开发环境就会自动帮我们拉取诸如启动文件等资源。

程序的下载首先需要我们正确的将下载器和板卡预留的下载接口相连,然后我们把使用下载软件把通过集成开发环境编译出来的可执行文件烧录到芯片上即可。

ARM架构

ARM架构,曾称进阶精简指令机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)处理器架构。

寄存器

ARM一共有37个寄存器,七个处理模式。处理模式包括:用户模式(USR),快速中断模式(FIQ),普通中断模式(IRQ),管理模式(SVC),数据访问中止模式(ABT),未定义指令中止模式(UND),系统模式(SYS)

37个寄存器,其中31个为通用寄存器,6个位状态寄存器,都是 32 位的寄存器。

下面是通用寄存器按作用分类:

  • r0~r3 主要用于子程序间传递参数。
  • r4~r11 主要用于保存局部变量,但在 Thumb 程序中,通常只能使用 r4~r7 来保存局部变量。
  • r12 用作子程序间scratch 寄存器ip。
  • r13 通常用做栈指针sp。
  • r14 寄存器又被称为连接寄存器lr。
  • r15 用作程序计数器(pc)。

通用寄存器有针对不同模式专属的,也有所有模式公用的寄存器。R0-R7(8个所有模式共用)、R8-R12(FIQ单独用,其他六种模式共用,共有10个)、R13-R1(USR和SYS共用2个,其他模式单独用2*5=10个,共12个)、R15(8个所有模式公用),则有总数31 =8+10+12+1。

6 个状态寄存器,都是 32 位的寄存器。CPSR(1个)/SPSR(5个)。

  • SPSR:Saved Program Status Register;保存的程序状态寄存器
  • CPSR:Current Program Status Register;当前程序状态寄存器


处理器模式

当异常发生,MCU进入相应的异常模式时,以下工作是由硬件自动完成的:

  1. 在异常模式的R14中保存前一工作模式的下一条即将执行的指令地址。
  2. 将CPSR的值复制到异常模式的SPSR中。
  3. 将CPSR的工作模式设为该异常模式对应的工作模式。
  4. 令PC值等于这个异常模式在异常向量表中的地址,即跳转去执行异常向量表中的相应指令。

从异常工作模式退回到之前的工作模式时,需要由软件来完成以下工作:

  1. 将异常模式的R14减去一个适当的值(4或8)后赋给PC寄存器。
  2. 将异常模式SPSR的值赋给CPSR。

ARM处理器对7种工作模式的定义如下:

  1. 用户模式(USR):正常程序执行模式,不能直接切换到其他模式。
  2. 系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权。
  3. 快中断模式(FIQ):支持高速数据传输及通道处理,FIQ异常响应时进入此模式。
  4. 中断模式(IRQ):用于通用中断处理,IRQ异常响应时进入此模式。
  5. 管理模式(SVC):操作系统保护模式,系统复位和软件中断响应时进入此模式(由系统调用执行软中断SWI命令触发)。
  6. 中止模式(ABT):用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处。
  7. 未定义模式(UND):支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式。

十六宿舍 原创作品,转载必须标注原文链接。

©2023 Yang Li. All rights reserved.

欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/656669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为什么说网络安全是IT行业最后的红利?

前言 “没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。 网络安全行业特点 1、就业薪资非常高,涨薪快 2021年猎聘网发布网络安全行业就业薪资行业最高人均33.77万…

Python实现京东茅台抢购脚本, 原来这么简单

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 开发环境: python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 京东茅台抢购脚本可以分为以下几部分,具体实现步骤如下: 1. 登录京东账号 首先需要登录京东账号。 一个简单的方式是使用Pyth…

Linux 读书笔记之《鸟哥的 Linux 私房菜 基础学习篇(第四版)》

文章目录 鸟哥 Linux 私房菜(基础学习篇)第零章、计算器概论第一章、Linux 是什么与如何学习第二章、主机规划与磁盘分区第四章、首次登入与在线求助第五章、Linux 的文件权限与目录配置第六章、Linux 文件与目录管理第七章、Linux 磁盘与文件系统管理第…

springCloudAlibaba组件-Nacos-服务发现与负载均衡(三)

文章目录 服务发现概述服务发现两种形式nacos的负载均衡机制 服务发现概述 如果项目使用微服务架构,如果A微服务需要访问B微服务,需要http请求进行调用,当然需要B微服务的地址与端口号,微服务可以向之前提到的服务中心进行获取B服…

U盘无法格式化?快速解决方法大揭秘!

简介:本文将介绍如何解决U盘无法格式化的问题,并提供快速解决方法。无法格式化的U盘可能会导致数据无法读取或写入,因此解决这个问题具有重要价值。 工具原料: 电脑品牌型号:Lenovo ThinkPad T480 操作系统版本&…

开源代码分享(4)—考虑自动重合闸与DG的配电网可靠性评估(附matlab代码)

摘要:电力系统的可靠性是现代电力系统规划、设计和运行中的一个关键方面。智能电网概念的崛起为开发一个能够成为自愈电网的智能网络带来了很高的希望,提供了克服效用面临的中断问题的能力,并花费了数千万美元的维修和损失。在这项工作中&…

【C语言】C语言从入门到精通第1章C语言概述

目录 一、C语言发展史 (一)程序语言简述 1、机器语言 2、汇编语言 3、高级语言 (二)C语言的历史 二、C语言的特点 (一)高效性 (二)灵活性 (三)功能丰…

常用的几种图像置乱算法

图像置乱算法是一种用于保护图像信息安全的技术,它可以将原始的图像信息进行加密和混淆,使得未经授权的用户无法获取到原始的图像信息。在信息安全领域中,图像置乱技术被广泛应用于图像加密、数字水印、安全传输等方面。下面是几种常用的图像…

English Learning - L3 作业打卡 Lesson6 Day39 2023.6.12 周一

English Learning - L3 作业打卡 Lesson6 Day39 2023.6.12 周一 引言🍉句1: A Festival for the Dead is held once a year in Japan.成分划分弱读连读语调 🍉句2: This festival is a cheerful occasion.成分划分弱读连读语调 🍉句3: For on…

腾讯太狠:40亿QQ号, 给你1G内存,怎么去重?

说在前面 在40岁老架构师 尼恩的读者社区(50)中,最近有小伙伴拿到了一线互联网企业如腾讯、美团、阿里、拼多多、极兔、有赞、希音的面试资格,遇到一几个很重要的面试题: 40亿Q号如何设计算法去重,相同的Q号码仅保留一个&#x…

在 Quarkus 中的使用 Mutiny 进行响应式编程

在 Quarkus 中使用 Mutiny - 事件驱动的 Java 响应式编程库 本教程介绍在 Quarkus 中使用事件驱动的 Mutiny 响应式编程库 以应对异步系统开发中的挑战。 概述 Mutiny 是一个(Reactive Programming)响应式编程库, 事件是 Mutiny 的设计核心&#xff0…

1.3 springboot项目中,数据层HikariCP与MyBatis整合

步骤1&#xff1a;在顶级父工程中pom引入mysql和mybatis依赖 <!-- mysql驱动 --> <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.41</version> </dependency> <…

微信公众号每天定时发送消息给女朋友

前言 这是我在这个网站整理的笔记&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;RodmaChen 每天定时发送消息给女朋友 一. 环境准备二. 代码拉取和配置三. 项目部署3.1 直接运行3.2 后台运行 四. 效果图 参考地址&#xff1a;https://github.com/limoes…

云服务器部署极简版openGauss,本地Data Studio远程连接

openGauss是一款开源关系型数据库管理系统&#xff0c;华为研发&#xff0c;2020年7月1日开源。Data Studio提供了一个图形化界面来管理openGauss数据库。 1.下载安装包 在华为云上租一台服务器&#xff0c;操作系统选&#xff1a;openEuler 20.03 64bit (64-bit) 获取openGa…

C程序设计(第五版)

文章目录 前言第3章 顺序程序设计第4章 选择结构程序设计c第5章 循环程序设计第6章 利用数组处理批量数据第7章 用函数实现模块化程序设计第8章 善于利用指针第9章 用户建立数据类型结构体字节对齐 第10章 对文件的输入输出 前言 鉴于写CSDN博客一篇一篇查找比较麻烦&#xff0…

day55_springmvc

今日内容 零、 复习昨日 零、 复习昨日 1 maven项目编译后代码在target 2 发现代码都没有错,该写的都有,但是已启动服务器404,查看target,如果编译会后资源不全面,那就删除重新编译 3 重新看一下,如何使用mavne创建javaweb项目 一、参数绑定 【重点】 所谓参数绑定,就是前端发请…

【GPT LLM】跟着论文学习gpt

GPT1开山之作&#xff1a;Improving language understanding by generative pre-training 本文提出了gpt1&#xff0c;即使用无标签的数据对模型先进行训练&#xff0c;让模型学习能够适应各个任务的通用表示&#xff1b;后使用小部分 task-aware的数据对模型进行微调&#xff…

csdn编辑

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【tensorflow】连续输入+离散输入的神经网络模型训练代码

【tensorflow】连续输入离散输入的神经网络模型训练代码 离散输入的转化问题 构造词典 创建离散数据、转化字典索引、创建连续数据 创建离散输入连续输入模型 训练输出 全部代码 - 复制即用 查看本系列三种模型写法&#xff1a;   【tensorflow】连续输入的线性回归模型训…

基于知识图谱的电影推荐系统——Neo4jPython

文章目录 1. 数据解下载与配置2. 将处理好的数据导入数据库中3. 执行项目 1. 数据解下载与配置 选择TMDB电影数据集&#xff0c;Netflix Prize 数据集下载。 也可直接从这里下载&#xff1a;链接: https://pan.baidu.com/s/1l6wjwcUzy5G_dIlVDbCkpw 提取码: pkq6 。 执行prep…