嵌入式系统基础

news2024/12/24 20:57:06

嵌入式系统学习的3条路线

在这里插入图片描述

路线差别

单片机入门(HAL)
简单、快速,实际上工作中涉及单片机编程时,也提倡使用HAL库。对于学习来说,HAL库封装了很多技术细节,对技术成长帮助不大。

比如,可能接触不到这些知识:
重定位、代码段数据段BSS段、位置无关码、相对跳转、绝对跳转、
设置栈、中断上下文、保存/恢复中断现场、ARM架构

这些知识,是单片机的核心,学习了它,有助于在RTOS领域发展。

单片机深入(基于寄存器)
抛开HAL库,从芯片手册开始,自己写出一切代码。
注意:工作中绝对不建议这样做,但是学习时,这才能学到更深刻的知识。
这些知识,也是后续学习RTOS、学习Linux的u-boot的必备知识。

不学单片机,直接上手Linux
如果有一定的硬件基础,或者对硬件操作不敢兴起,那么可以不学习单片机。
Linux驱动 = 面向对象的编程思想 + 良好的程序框架 + 硬件操作(这就跟单片机类似)

如果你要学习Linux驱动开发,单片机虽然是基础,但是也可以在学习驱动过程中掌握。

XIP的概念

XIP:eXecute In Place,本地执行。可以不将代码拷贝到内存,而直接在代码的存储空间运行。

嵌入式系统:支持多种设备启动

系统支持SPI FLASH启动,意味着可以运行SPI FLASH上的代码。
但是SPI FLASH不是XIP设备,CPU无法直接执行里面的代码。

所以,CPU如何执行SPI FLASH上的代码?
一上电,CPU执行的第1个程序、第1条指令在哪里?

ARM板子支持多种启动方式:XIP设备启动、非XIP设备启动等等。
比如:Nor Flash、SD卡、SPI Flash, 甚至支持UART、USB、网卡启动。
这些设备中,很多都不是XIP设备。

CPU无法直接运行非XIP设备的代码,为何可以从非XIP设备启动呢?
上电后,CPU运行的第1条指令、第1个程序,位于片内ROM中,它是XIP设备。
这个程序会执行必要的初始化,比如设置时钟,设置内存;
再从“非XIP设备”中把程序读到内存
最后启动这个程序

ARM芯片内部有很多部件,这是一个片上系统(System On Chip)
比如有:

  • cpu
  • rom
  • ram
  • memory controller ---- ddr
  • sd/mmc controller ---- sd card
  • spi controller ----- spi flash
  • usb controller ----- usb storage device
  • uart controller
  • interrupt controller

b. 跟PC的类比
CPU ---- 单独的芯片
启动设备 ---- BIOS芯片
DDR ---- 单独的可拔插式模块
存储设备 ---- SATA硬盘,可拔插
usb controller …

嵌入式系统启动流程概述

主芯片内部有ROM,ROM程序协助从非XIP设备启动。
以SD卡启动为例。
而CPU只能运行XIP设备中的程序,ROM程序做什么?
ROM需要把SF卡上的程序读到内存里(片内RAM或是片外的DDR)。

ROM程序要做的事情:
a. 初始化硬件
初始化时钟,提高CPU、外设速度
初始化内存:DDR需要初始化才能使用
初始化其他硬件,比如看门狗、SD卡等

b. 从外设把程序复制到内存
b.1
支持那么多的启动方式,SD卡、SPI FLASH、USB DISK,
怎么选择?
通过跳线,选择某个设备;

通过跳线,选择一个设备列表,按列表顺序逐个尝试

不让客户选择,按固定顺序逐个尝试

Cortex-M3内核 & 芯片

在这里插入图片描述
MCU厂商,经ARM公司授权,添加不同的外设=各种xx32芯片

F1系统架构

4个主动单元(主动发起通信)+4个被动单元

  1. Cortex M3内核 DCode总线(D-Bus)
  2. Cortex M3内核 系统总线(S-Bus)
  3. 通用DMA1
  4. 通用DMA2
  5. 内部FLASH
  6. 内部SRAM
  7. FSMC
  8. AHB到APB的桥,它连接的所有APB外设

AHB:高级高性能总线
APB:高级外围总线

在这里插入图片描述

ICode总线直接连接Flash接口,不需要经过总线矩阵。
总线时钟频率:

  • AHB:72MHz
  • APB1:36MHz
  • APB2:72MHz

STM32的寻址范围

32位的单片机可以有32根地址线(每根地址线有两种状态:导通或不导通)。
单片机内存地址访问的存储单元是按字节编址的(而不是bit)。

STM32寻址大小:232=4G(字节)
0x00000000 ~ 0xFFFFFFFF

存储器映射

存储器指可以存储数据的设备,本身没有地址信息,对存储器分配地址的过程称为存储器映射。

存储器功能划分

ST将4GB地址空间分成8个块。
在这里插入图片描述

寄存器映射

寄存器是单片机内部一种特殊的内存,可以实现对单片机各个功能的控制。

寄存器就是单片机内部的控制机构

寄存器是特殊的存储器,给寄存器地址命名的过程,就叫寄存器映射
在这里插入图片描述

直接操作寄存器地址
*(unsigned int *)(0x4001 0x080C) = 0XFFFF;
定义一个名字后再操作
#define GPIOA_ODR *(unsigned int *)(0x4001 080C)
GPIOA_ODR = 0XFFFF;

为了方便编写代码及使用,将寄存器地址分为三个部分:

  1. 总线基地址(BUS_BASE_ADDR)
  2. 外设基于总线基地址的偏移量(PERIPH_OFFSET)
  3. 寄存器相对于外设基地址的偏移量(REG_OFFSET)

寄存器地址 = 以上三个相加

使用结构体,可以很方便的完成对寄存器的映射

typedef struct
{
	__IO uint32_t CRL;
	__IO uint32_t CRH;
	...
}GPIO_TypeDef;

GPIOA_BASE 0X4001 0800 
#define GPIOA ((GPIO_TypeDef *)GPIOA_BASE)

GPIOA->ODR = 0xFFFF;

STM32寄存器分类

内核寄存器

  • 内核相关寄存器:包含R0~R15,xPSR、特殊功能寄存器等。
  • 中断控制寄存器:包含NVIC和SCB相关寄存器
  • SysTick寄存器:包含CTRL、LOAD、VAL和CALIB四个寄存器
  • 内存保护寄存器:可选功能,STM32F103没有。
  • 调试系统寄存器

外设寄存器

  • 包含GPIO、UART、IIC等寄存器

stm32f103xe.h主要组成部分

  • 中断编号定义:定义IRQn_Type枚举类型,包含STM32F103内部所有中断编号(中断号),方便后续编写代码。
  • 外设寄存器结构体类型定义:以外设为单位,使用结构体类型定义每个外设所有寄存器,方便寄存器映射。
  • 寄存器映射:1.定义总线地址和外设基地址。2.使用外设结构体类型定义将外设基地址强制转换成结构体指针,完成寄存器映射。
  • 寄存器位定义:定义外设寄存器每个功能位的位置及掩码。
  • 外设判定:判断某个外设是否合法(即是否存在该外设)。
typedef struct
{
	__IO uint32_t CRL;
	__IO uint32_t CRH;
	...
}GPIO_TypeDef;

#define GPIOA (GPIO_TypeDef *)(GPIOA_BASE)

GPIOA->ODR = 0xFFFF;

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

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

相关文章

前后端开发鄙视链的真相,希望对从事前后端开发的小伙伴有些帮助

一、常规的工资对比 前后端的工资情况怎么样?过来人可以负责任的告诉大家:据我所知,至少在杭的网易、阿里,前端跟后端是一个批发价。

探索泰勒级数在机器学习中的作用:从函数逼近到模型优化

一、介绍 泰勒级数是数学中的一个基本概念,在机器学习领域有着重要的应用。本文将探讨泰勒级数的基础知识、它在机器学习中的相关性以及一些具体应用。 揭开复杂性:利用泰勒级数增强机器学习应用的理解和效率。 二、理解泰勒级数 在数学中,泰…

excel手撕神经网络(只需高中数学基础)

神经网络最基础部分是由神经元组成,一个神经元相当于是一个一次函数,yaxb 即在已知x,和y情况下,怎么使用神经网络求解a和b 如下是使用excel求解的神经网络,可以方便理解神经网络运行原理 excel玩具神经网络下载地址 百…

swing快速入门(十五)

注释很详细,直接上代码 上一篇 新增内容 1.文件对话框(保存文件) 2.文件对话框(打开文件) import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class swing_tes…

软实力篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、HR 最喜欢问程序员的 20 个问题二、面试中的礼仪与举止前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、HR 最喜欢…

tomcat启动异常:子容器启动失败(a child container failed during start)

最近在使用eclipse启动Tomcat时,发现一个问题,启动以前的项目突然报子容器启动异常。 异常信息如下: 严重: 子容器启动失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 无法启动组件[org.apache.…

运维对数据库的一些要求(安装,部署,权限,mysqldump,xtrabackup的备份和还原)

目录 一、安装部署二、数据库的权限分配1.密码策略2.MySQL中授权(grant)和撤销授权(revoke) 三、数据库的备份还原1、mysqldump备份数据库2、Percona XtraBackup备份数据库1、Percona XtraBackup的介绍2、Percona XtraBackup安装3、Percona XtraBackup8.0的使用1.全…

低代码是什么?可能取代人工吗?

低代码开发是近年来迅速崛起的软件开发方法,让编写应用程序变得更快、更简单。有人说它是美味的膳食,让开发过程高效而满足,但也有人质疑它是垃圾食品,缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢,…

PyCharm控制台异常堆栈乱码问题解决

目录 1、问题描述2、问题原因3、问题解决 1、问题描述 PyCharm环境都已经配置成了UTF-8编码,控制台打印中文也不会出现乱码,但异常堆栈信息中如果有中文会出现中文乱码: 这种该怎么解决呢? 2、问题原因 未将PyCharm编码环境与项目…

如何使用ycsb工具对mongodb进行性能测试过程

测试环境: linux系统:Centos 7.2 ,版本:Red Hat 4.8.5-44) YCSB简介 ycsb是一款性能测试工具,用Java写的,并且什么都可以压,像是mongodb,redis,mysql,hbase,等…

Leetcode的AC指南 —— 链表:19.删除链表的倒数第N个节点

摘要: Leetcode的AC指南 —— 链表:19.删除链表的倒数第N个节点。题目介绍:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 文章目录 一、题目二、解析1、滑动窗口/快慢指针(傻傻分不清&…

探索灵活性与可维护性的利器:策略(Strategy)模式详解

目录 ​编辑 1. 策略模式概述: 2. 主要角色: 3. 实例场景: 4. 具体实现步骤: 步骤一:定义策略接口 5. 使用策略模式的客户端代码: 总结: 我的其他博客 1. 策略模式概述: 策…

【Jmeter】Jmeter基础6-Jmeter元件介绍之前置处理器

前置处理器主要用于处理请求前的准备工作,如:参数、环境变量的设置等。 2.6.1、JSR223预处理程序 作用:请求前的准备工作。 参数说明: 语言:开发脚本所使用的语言,可通过下拉列表选择。参数:传…

Vue3快速上手笔记

Vue3快速上手 1.Vue3简介 2020年9月18日,Vue.js发布3.0版本,代号:One Piece(海贼王)耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址:https://github.com/vuejs/vue-next/release…

DC-2靶场

DC-2 下载地址:DC and Five86 Series Challenges - Downloads​编辑https://www.five86.com/downloads.html DC-2环境配置:解压后在vm虚拟机点击左上方文件-->打开-->选择解压后的DC-2。把kali和DC-2的网路适配器都改成NAT模式 flag1 首先进行主…

vue-element-admin如何把mock换成使用真实后台接口

1)修改vue.config.js文件 use strict const path require(path) const defaultSettings require(./src/settings.js)function resolve(dir) {return path.join(__dirname, dir) }const name defaultSettings.title || vue Element Admin // page title// If you…

数据结构面试题和题目解析

以下是一些数据结构的面试题和解析: 1. 什么是链表? 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。链表的主要优点是插入和删除操作比较方便,但访问链表中的元素不如访问数组…

Windows7下双网卡绑定(双网络冗余)

1.首先需要电脑主机里至少有两张网卡。 2.打开计算机管理,点击左侧的设备管理器: 3.点击展开右侧的 网络适配器: 4.如下是我们即将需要进行绑定的两张网卡: 5.右键点击第一张网卡,选择属性: 6.选择 分组 栏…

Angular中使用Intersection Observer API实现无限滚动

背景&#xff1a; 实现原理为 在data下面加一个loading元素 如果此元素进入视窗 则调用api获取新的数据加到原来的数据里面&#xff0c;这时loading就会被新数据顶下去&#xff0c;如此循环。 <div id"dataContainer"></div> <div id"loadingCo…

linux添加环境变量

一、查看当前环境变量 echo $PATH 二、将工作空间添加到环境变量&#xff0c;vim是编辑器&#xff0c;可以换成别的编辑器&#xff0c;vim编辑器的使用法可以百度一下 vim ~/.bashrc编辑器添加&#xff1a; source ~/scan_ws/devel/setup.bash