05_从0运行,重定位,初始化,中断再到定时器

news2024/9/21 14:44:05

总结

这边简单讲讲,代码上电后从0开始发生了什么,为什么要重定位把代码复制到sdram,
bin文件前面几条跳转函数都跳转去哪 中断产生后发生什么

重定位问题

1.为什么需要重定位
把程序从一个位置移到另一个位置 叫重定位
可以只重定位部分段的数据 也可以把所有的都重定位到sdram中
一个程序有代码段,数据段,只读数据段,和bss段
整个程序开始能在 norflash上 运行的时候代码段从norflash上0位置开始运行
但是对于数据段 必须在sdram里面运行 因为norflash不支持简单的读写 和速度需求

代码跑动流程

当时用norflash启动的时候,整个cpu通过内存控制器控制地址如下
在这里插入图片描述
1.cpu从0开始运行,也就是norflash上面开始运行,我们把bin文件烧在norflash上面
在bin文件前面的代码中也就需要把整个程序复制到sdram中
2.在链接脚本里面 指定runtime_addr(运行时地址) 变成sdram的地址 0x03000000
3.中断属于异常的一种,arm芯片有7种模式 通过cpu寄存器CPSR寄存器,表面自己目前处于哪种状态
在每种状态都有着专属的cpu寄存器(r0~PC15)能方便更快处理异常状态,当进入异常的时候,就会发送硬件行为,主动的跳到
异常向量表,这也就是为什么0地址,4地址,8地址等等等用来存放一些跳转地址,用来配置硬件的跳转
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据架构上的设定,在开发裸机的初始化程序,按照上面出来的设定有了如下的结构
编译出来的bin文件烧录到norflash后存储如下(注意:arm32位 一条指令占4位)
![在这里插入图片描述](https://img-blog.csdnimg.cn/5b558f9bff2247d6b86695c95cb36309.png在这里插入图片描述

cpu从norflash的0地址开始运行 直接跳转到复位程序的地址,开始进行初始化跑动
初始化一般需要做重定位操作,把整个程序从nor_flash复制到sdram中,再从nor_flash跳到sdram继续运行,继续完成初始化操作
如果这时候突然发生了异常或者中断,会按照中断向量表的产生硬件行为,直接跳回nor_flash中 根据异常的不同进行 进行异常程序的跳转

用中断来举个例子

有很多种中断 什么软件中断 未识别指令异常中断

说到按键中断

在这里插入图片描述

1.初始化 设置中断,让它能发生中断(按键设置为中断引脚,定时器,网络数据这种硬件)

1.设置gpio为中断引脚
2.设置中断触发方式 中断方式为双边沿书触发
3.使能中断
4.读eintpend寄存器,分辨是哪个中断产生了

2.设置中断控制器,让中断控制器能发送中断给cpu

在这里插入图片描述

1.看起来外部中断4~7合用一条中断source通知中断控制器,也就是为什么上面的引脚设置中断还要读eintpend寄存器知道是哪条中断
2设置SRCPEND寄存器,知道是哪个中断产生了,同时执行完后需要清除对应位(bit0=外部中断0,bit2=外部中断2,bit5=外部中断8_23
如果bit5置1,还要读刚刚的eintpend寄存器,看是哪个中断产生了
3.设置是否要屏蔽这个中断(就算置为1,也不告诉cpu)
4.可能有多个中断产生,此时SRCPEND多个位设置为1,经过PRIORITY优先级寄存器,只有一个到cpu
5.最后优先级最高的被cpu处理,读取INTPND寄存器就知道哪个被cpu处理

3.设置cpu里面的寄存器cpsr寄存器,里面有个i位中断总开关,设置它使能中断

把cpu寄存器的CPSR第7位置0,这是中断总开关,bit7设置为1,cpu无法响应任何中断

4.中断发生,硬件处理

中断发生直接跳中断向量表的IRQ地址 ,再从这个地址跳去处理中断的函数地址
在这里插入图片描述
根据图中中断发生,此时硬件直接跳转到 0x18地址,在这个地址我们写的汇编为
b irq_handle 让cpu专门跳到我们写的中断处理函数地址,对中断进行识别和处理

5.跳过去的地址为我们自己写的中断处理函数,里面包含

1.程序先保存cpu寄存器地址,保存现场
cpu的lr_irq寄存器保存被中断时候,要处理的下一条地址
进入irq模式的时候会修改cpu寄存器的r0~r12所以要先保存
lr是处理完异常后的返回地址也要保存,处理完后把lr的值给cpu的PC寄存器就能返回上一次的地方
cpu寄存器SPSR_irq 保存被中断时候的 CPSR(区分cpu模式的cpu寄存器)
cpu寄存器CPSR M4~M0位置为10010,说明现在在中断模式
硬件主动跳到 0x18 中断向量表的IRQ地址 ,再从这个地址跳去处理中断的地址
2.程序处理异常
分辨中断源
读取INTPND寄存器就知道哪个中断被cpu处理
根据中断类型选择这个中断对应的中断函数
清理中断
3.恢复现场
把cpu寄存器的CPSR第7位清零,这是中断总开关,bit7设置为1,cpu无法响应任何中断

定时器怎么使用

定时器和pmw 只有先设置好定时器,才能初始化pwm
在这里插入图片描述

定时器设置

1.有个时钟进入定时器,每来个时钟 tcnt寄存器-1
2.当tcnt寄存器减少到 等于 tcnt_cmp寄存器的值 产生一个中断,也可以让对应的PMW引脚反转
3.tcnt寄存器继续减1,当tcnt寄存器等于0的时候,也能产生一个中断,pmw引脚也能翻转
4.当上面两个寄存器等于0的时候,可以选择从TCMPBN和TCNTBN里面把数值放入刚刚两个寄存器
上面就是定时器会触发中断 和 根pwm的关系

怎么使用定时器呢 也有个图

在这里插入图片描述
1,设置时钟
从PCLK(低速时钟)过来设置PREschar预分频寄存器
2.设置初值
3.加载初值, 启动时钟
4.设置为自动加载初始化值
5,上面的中断程序怎么产生的
去中断那一章找到和定时器有关的中断
和上面一样触发了中断后 看是哪个中断源产生的中断
如果是INT_TIMER0 调用定时器的中断函数

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

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

相关文章

Linux运维之shell基础

一.流程控制 1.if判断 基本语法: if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 else 程序 fi注意事项: ①[ 条件判断式 ],中括号和条件判断式之间必须有空格②if 后要有空格 例如,现在写一个if.sh脚本文件 #…

echarts关于自定义饼图数据刷新和颜色渲染问题

在使用echarts的自定义饼图Customized Pie时,定义的动态数据会发生颜色无法渲染的问题,如下图所示: 该图表的颜色是根据itemStyle内的color属性而来,如下: itemStyle: {color: #4d90fe, /* 图表的颜色 */shadowBlur:…

【python知识】importlib包详解

importlib — The implementation of import — Python 3.11.3 documentation 目录 一、说明 二、 模块导入简介 2.1 最简单的 importlib用途 2.2 importlib 包的目的有三个 2.3 import_module() 和__import__() 三、高级模块使用 3.1 动态引入 3.2 模块引入检查 3…

SpringBoot整合Mybatis-Plus、Jwt实现登录token设置

Spring Boot整合Mybatis-plus实现登录常常需要使用JWT来生成用户的token并设置用户权限的拦截器。本文将为您介绍JWT的核心讲解、示例代码和使用规范,以及如何实现token的生成和拦截器的使用。 一、JWT的核心讲解 JWT(JSON Web Token)是一种…

JavaWeb——HTML和CSS

HTML和CSS定义 标记语言 :比如XML:可扩展的标记语言&#xff0c;标签可以自己定义&#xff0c;解析时需要按照定义的规则去解析。 学习目的:掌握常见标签和常见样式的使用 HTML 结构: 特点: 1.不区分大小写&#xff0c;不管是<html>还是<HTML>都是一样的作用 …

错题笔记第一篇

目录 1. strlen的用法2. case3. switch4. 二分查找 1. strlen的用法 正确答案 &#xff1a;C strlen计算的是字符串的长度&#xff0c;二字符串是以\0结尾&#xff0c;而咱们并没有存储\0&#xff0c;后序的空间是未知的&#xff0c;strlen找不到\0就会一直找&#xff0c;所以它…

如何使 VSCode 中 CMake Debug 的输出显示在 cmd 上而不是自带的 debug console

如何使 VSCode 中 CMake Debug 的输出显示在 cmd 上而不是自带的 debug console 首先需要明确的一点是从 VSCode 插件商店下载的 CMake 是默认打印输出的结果在 debug console 中的&#xff0c;就像下面这样&#xff1a; 可以看到&#xff0c;一个问题是在加载 dll 时候会频繁…

82. Python split方法-分割字符串

82. split方法-分割字符串 文章目录 82. split方法-分割字符串1. 什么是split( )函数2. split( )方法的语法格式如下&#xff1a;3. 实操练习4. 列表索引取值知识回顾5. 用split方法分解网址提取有效信息6. 从地址信息中拆分省、市、区信息 1. 什么是split( )函数 split[splɪ…

深度学习模型压缩与优化加速

1. 简介 深度学习&#xff08;Deep Learning&#xff09;因其计算复杂度或参数冗余&#xff0c;在一些场景和设备上限制了相应的模型部署&#xff0c;需要借助模型压缩、系统优化加速、异构计算等方法突破瓶颈&#xff0c;即分别在算法模型、计算图或算子优化以及硬件加速等层…

《LearnUE——基础指南:上篇—2》——GamePlay架构之Level和World

目录 听说世界是由多个Level组成的 1.2.1 引言 1.2.2 建造大陆&#xff08;ULevel&#xff09; 1.2.3构建世界&#xff08;World&#xff09; 1.2.4总结 听说世界是由多个Level组成的 1.2.1 引言 上小节谈到Actor和Component的关系&#xff0c;UE利用Actor的概念组成了世…

GitLab统计代码量

gitlab官方文档&#xff1a;https://docs.gitlab.com/ee/api/index.html 1、生成密钥 登录gitlab&#xff0c;编辑个人资料&#xff0c;设置访问令牌 2、获取当前用户所有可见的项目 接口地址 GET请求 http://gitlab访问地址/api/v4/projects?private_tokenxxx 返回参数 …

【文章学习系列之模型】Non-stationary Transformers

本章内容 文章概况总体结构主要模块Series Stationarization&#xff08;序列平稳化模块&#xff09;De-stationary Attention&#xff08;逆平稳化注意力模块&#xff09; 实验结果消融实验总结 文章概况 《Non-stationary Transformers:Exploring the Stationarity in Time …

Docker 存储

Docker 存储 docker 默认存储方式docker 持久化存储Volumes &#xff08;卷&#xff09;简介推荐使用情况 Bind mounts &#xff08;绑定挂载&#xff09;简介推荐使用情况 绑定挂载与卷注意点 docker 非持久化存储tmpfs mounts &#xff08;tmpfs 挂载&#xff09;简介推荐使用…

leetcode100——相同的树

文章目录 题目详情分析Java完整代码 题目详情 leetcode100 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例&#xff1a; 分析 主要想法…

vue3头像上传组件

用到了自定义组件v-model的双向绑定使用input的typefile这个原生html元素&#xff0c;通过监听change事件&#xff0c;获取到选择的文件&#xff08;注意&#xff0c;选择完文件值后&#xff0c;要把这个隐藏的input的typefile元素的value置为空&#xff0c;否则&#xff0c;下…

【关于C++中----异常】

文章目录 一、C语言中处理错误的方式二、C异常概念三、异常的使用3.1 异常的抛出和捕获3.2 异常的重新抛出3.3 异常安全3.4 异常规范 四、自定义异常体系五、C标准库的异常体系六、异常的优缺点 一、C语言中处理错误的方式 C语言中常见的错误类型包括&#xff1a;语法错误、逻…

访问 virtualbox中的mysql

在 mysql.user 中存储这用户可访问的的host地址 select user,host from user;修改访问权限 可以使用sql语句 use mysql; mysql>update user set host % where user root; flush privileges或者使用mysql的权限语句 use mysql; Grant all on *.* to root% identified b…

深入浅出C++ ——异常

文章目录 一、C语言传统的处理错误的方式二、C异常概念三、异常的使用异常的抛出和捕获异常的重新抛出异常安全异常规范 四、自定义异常体系无、C标准库的异常体系六、异常的优缺点 一、C语言传统的处理错误的方式 C语言传统的处理错误的机制&#xff1a; 终止程序&#xff0…

docker打包部署spring boot应用(mysql+jar+Nginx)

文章目录 一、基本准备二、mysql部署二、jar部署三、Nginx部署 一、基本准备 小唐拿的就是之前放置在我们服务器上的应用进行部署&#xff0c;主要就是mysql和jar还有Vue的部署。 目前已经有的是jar、已经打包好的vue 项目参考&#xff1a;小破站数据大屏可视化&#xff08;…

【IPv6】IPv6有无状态地址分配及IPv6路由

IPv6有无状态区分 有状态可控、可管理。有IP地址管理者&#xff0c;能够识别客户端。根据不同客户端分配对应v6地址&#xff0c;客户端和服务器存在租期及续约。无状态无控、难管理。无IP地址管理者&#xff0c;没人识别客户端。客户端根据网关发送的相同的RA报文内容&#xf…