| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> MCU_DESIGN_01 Cortex-M3内核了解 -> 正文阅读 |
|
[嵌入式]MCU_DESIGN_01 Cortex-M3内核了解 |
1.M3整体架构整体的架构刚接触时并不明白各个模块的作用,但是主要的4个部分以及一些测试点
一开始了解一下就好,慢慢去熟悉; 2.内核寄存器(19组)
R0 - R7的寄存器:32位Thumb-2指令与16位Thumb指令均可访问 R8 - R12的寄存器:32位Thumb-2指令可访问 R14:连接寄存器,存储子程序指针 R15:程序计数寄存器 程序状态字寄存器组xPSR:可分为3个寄存器进行访问,包括应用程序APSR、中断号IPSR、执行EPSR 中断屏蔽寄存器组: FAULTMASK ,单一比特位,置位后,除NMI外,其他中断都不响应; BASEPRI,共有9位,中断号小于等于该寄存器设置值的中断都不响应; 控制寄存器CONTROL: Control[1] 0主堆栈;1进程堆栈;
3.内核流水技术如下图,如果不采用流水的话,那么只能等到N中的execute执行完毕后才进行N+1中的fetch,此时如果后面排了很多指令的话那么将会浪费很多时间。 4.内核接口
它主要分为3个部分: ①指令接口Icode (0x00000000~0x1FFFFFFF) ②数据接口Dcode (0x00000000~0x1FFFFFFF) ③系统总线System bus (0x20000000~0xDFFFFFFF)
内部的debug以及寄存器的访问 5.NVIC向量中断控制器,简称NVIC;NVIC共支持1至240外部中断输入(IRQs)+1不可屏蔽中断(NMI);NVIC的访问起始地址是0xE000E000;所有NVIC的中断控制/状态寄存器都只能在特权级下访问;软件触发中断寄存器可以在用户级下访问以产生软件中断;所有的中断控制/状态寄存器均可按字/半字/字节的方式访问 5.1 中断使能与清除
5.2 中断Pending在当前中断执行时,有更高优先级的中断触发,那么当前中断则会被挂起,通过pending存入寄存器中,等更高级的优先级完成后,继续刚才的中断; 6.中断机制
①入栈,把8个寄存器的值压入Dcode ②取向量,从向量表中找出对应的入口地址Icode ③更新相关的寄存器,如:
①退出指令 ②出栈,先前压入栈中的寄存器恢复 ③更新NVIC寄存器,活动位硬件清零
和ARM7对比,减少了不必要的出栈和入栈,节省了时间
①定义:从检测到某中断请求,到执行了其服务例程的第一条指令时间 ②理想条件:12个处理器时钟周期 ③增加延迟的因素(如果延迟太长则需要排除下面的一些因素): 多周期指令(除法、LDRD,STRD)
经过相应的一些寄存器上报到core进行处理: 入栈异常:总线fault状态寄存器(BFSR,0xE000_ED29 bit4 : STKERR) 出栈异常:总线fault状态寄存器(BFSR,0xE000_ED29 bit3 : UNSTKERR) 取向量异常:硬fault状态寄存器(HFSR,0xE000_ED2C bit1 : VECTTBL) 响应异常:用法Fault状态寄存器(UFSR,0xE000_ED2A bit2 : INVPC or bit1 : INVSTATE) 7.内存映射Cortex-m3是一个32位处理器,其地址总线、数据总线都是32位的,故可在4G的地址范围上资源寻址。Cortex-m3内核把4G空间划定了基本的框架,定义不同的使用用途: 0x0000 0000 ----0x1FFF FFFF (512MB) 该区域为code区(flash区),供指令总线与数据总线取指取数使用;可以执行指令; 0x2000 0000 ----0x3FFF FFFF (512MB) 该区域为片上SRAM区,芯片制造商可在此布设RAM,可以将代码复制到此处运行,该区域也是可以执行指令code的;低1MB空间可位寻址,通过位带别名可扩展为32Mb的位寻址。 0x4000 0000 ----0x5FFF FFFF (512MB)该区域为"片上外设"区 ,主要为片上外设的相关寄存器,即特殊功能寄存器区,同理低1MB也可位寻址;该区域不可执行代码; 0x6000 0000 ----0x9FFF FFFF(1G)该区域为片外RAM区,该区域可执行代码; 0xA000 0000 ----0xDFFF FFFF(1G)该区域为片外外设区,该区域不可执行代码; 0xE000 0000 ----0xFFFF FFFF(1G)该区域为系统区,该区域不可执行代码; 该系统区又分为两部分: 内部私有外设区0xE000 0000 ----0xE003 FFFF(256KB)主要有NVIC,FPB,DWT,ITM等 外部私有外设区0xE004 0000 ----0xE00F FFFF(512+256=768KB)有ROM表,ETM,TPIU等 8.bit banding我们都知道一个地址对应8bit,那么地址0x20000000对应8bit;当我想操作0x20000000的第[0]位时,我直接可以用公式来计算出其对应的地址;公式:word_addr = bit_base + (byte_offset x 32)+ (bit_number x 4) 而以前是怎么做的呢?以前需要将0x20000000存到寄存器中做or的操作再取出,操作很麻烦; 参考: |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 0:41:25- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |