ARM Cortex-M3架构详解
1. 引言
ARM Cortex-M3 是 ARM 公司推出的一种高性能、低功耗、低本钱的 32 位 RISC 微处置惩罚器架构,广泛应用于嵌入式系统中。本节将详细介绍 ARM Cortex-M3 架构的特点、内部布局、寄存器配置和停止处置惩罚机制。
2. 架构特点
2.1 32位 RISC 架构
ARM Cortex-M3 是一种基于 RISC(精简指令集计算机)架构的处置惩罚器。RISC 架构的特点是:
- 固定长度指令:每条指令的长度都是固定的,通常为 32 位。
- 简单指令集:指令集计划简单,每条指令的功能明确。
- 流水线操作:采取多级流水线,提高指令执行效率。
- 寄存器文件:大量的通用寄存器,淘汰内存访问次数。
2.2 高性能计划
- 单周期乘法:支持单周期乘法操作,提高计算效率。
- 硬件除法:支持硬件除法,淘汰软件实现的开销。
- 分支推测:支持简单的分支推测,淘汰分支耽误。
- Thumb-2 指令集:支持 Thumb-2 指令集,可以在 16 位和 32 位指令之间灵活切换,提高代码密度和执行效率。
2.3 低功耗计划
- 动态功耗管理:支持多种功耗管理模式,如就寝模式和深度就寝模式。
- 低功耗时钟源:支持多种低功耗时钟源,如低频晶振和内部 RC 振荡器。
- 功耗优化的外设:外设计划考虑功耗优化,支持独立运行和低功耗模式。
2.4 高可靠性计划
- 内存保护单元 (MPU):支持内存保护单元,提高系统的安全性。
- 故障捕获:支持多种故障捕获机制,如总线故障、存储器管理故障和使用故障。
- 调试支持:提供丰富的调试支持,如 JTAG 和 SWD 接口。
3. 内部布局
3.1 焦点组件
3.1.1 处置惩罚器核
ARM Cortex-M3 处置惩罚器核包括以下几个主要部门:
- 指令流水线:3 级流水线,包括取指、译码和执行阶段。
- 寄存器文件:32 个 32 位通用寄存器,包括 R0-R12、SP(R13)、LR(R14)和 PC(R15)。
- 状态寄存器:包括步调状态寄存器(PSR)、控制寄存器(Control Register)和停止屏蔽寄存器(Interrupt Mask Register)。
3.1.2 存储器系统
- 内存映射:内存地址空间分为多个区域,每个区域有不同的访问权限和功能。
- 存储器管理单元 (MPU):可选的存储器管理单元,用于保护内存区域。
- 高速缓存:不支持高速缓存,但支持指令预取和数据存储器加速。
3.1.3 停止系统
- 嵌套向量停止控制器 (NVIC):管理停止优先级和嵌套停止。
- 系统异常:包括复位、NMI、硬故障、总线故障、使用故障等。
- 停止向量表:包含停止向量地址,用于快速相应停止。
3.2 流水线操作
3.2.1 取指阶段 (Fetch)
从内存中取出指令并放入指令流水线。
3.2.2 译码阶段 (Decode)
将取出的指令解码为微操作,准备执行。
3.2.3 执行阶段 (Execute)
执行解码后的微操作,完成指令的功能。
3.3 寄存器配置
3.3.1 通用寄存器
- R0-R12:通用寄存器,用于数据操作。
- R13:堆栈指针(SP),用于管理堆栈。
- R14:链接寄存器(LR),用于存储子步调返回地址。
- R15:步调计数器(PC),用于存储下一条指令的地址。
3.3.2 状态寄存器
- 步调状态寄存器 (PSR):包含当前处置惩罚器状态信息,如标志位和模式位。
- 控制寄存器 (Control Register):用于控制处置惩罚器的多种模式。
- 停止屏蔽寄存器 (Interrupt Mask Register):用于控制停止的优先级和屏蔽。
3.4 存储器访问
3.4.1 内存映射
ARM Cortex-M3 的内存地址空间通常分为以下几个区域:
- 闪存:用于存储步调代码。
- SRAM:用于存储数据和堆栈。
- 外设寄存器:用于控制外设。
- 系统控制寄存器:用于系统配置和调试。
3.4.2 存储器管理单元 (MPU)
MPU 可以配置多个区域,每个区域有不同的访问权限和属性。通过 MPU,可以保护关键的内存区域,防止非法访问。
3.5 停止处置惩罚
3.5.1 嵌套向量停止控制器 (NVIC)
NVIC 是 ARM Cortex-M3 中的重要组件,用于管理和控制停止。它支持多个停止源,并可以配置停止优先级和嵌套停止。
3.5.2 停止向量表
停止向量表包含各个停止向量的地址,处置惩罚器在发生停止时会跳转到相应的停止处置惩罚步调。停止向量表通常位于闪存的起始地址。
3.5.3 系统异常
系统异常是一类特别的停止,用于处置惩罚系统的各种异常环境,如复位、NMI、硬故障等。
4. 指令集
4.1 Thumb-2 指令集
Thumb-2 指令集是 ARM Cortex-M3 的一大特点,它结合了 16 位和 32 位指令的上风:
- 16位指令:用于提高代码密度,淘汰内存占用。
- 32位指令:用于提高指令执行效率,支持复杂的操作。
4.2 常用指令
4.2.1 数据处置惩罚指令
- MOV:移动数据
- ADD:加法
- SUB:减法
- AND:逻辑与
- ORR:逻辑或
- EOR:逻辑异或
- LSL:逻辑左移
- LSR:逻辑右移
4.2.2 存储器访问指令
- LDR:加载数据到寄存器
- STR:存储数据到内存
- LDM:批量加载数据到寄存器
- STM:批量存储数据到内存
4.2.3 分支指令
- B:无条件跳转
- BL:带链接的跳转
- BX:改变步调状态寄存器(PSR)的模式
- BGE:大于即是跳转
4.3 指令示例
4.3.1 数据处置惩罚指令示例
- // 将寄存器 R1 的值加 1 并存储到 R2
- ADD R2, R1, #1
- // 将寄存器 R1 和 R2 的值进行逻辑与操作,结果存储到 R3
- AND R3, R1, R2
- // 将寄存器 R1 的值左移 2 位,结果存储到 R2
- LSL R2, R1, #2
复制代码 4.3.2 存储器访问指令示例
- // 从地址 0x20000000 加载一个 32 位数据到寄存器 R0
- LDR R0, [0x20000000]
- // 将寄存器 R1 的值存储到地址 0x20000004
- STR R1, [0x20000004]
- // 从地址 0x20000008 开始批量加载 4 个 32 位数据到寄存器 R2-R5
- LDM R2, R5, [0x20000008]!
- // 从寄存器 R2 开始批量存储 4 个 32 位数据到地址 0x2000000C
- STM R2, R5, [0x2000000C]!
复制代码 4.3.3 分支指令示例
- // 无条件跳转到地址 0x00000100
- B 0x00000100
- // 跳转到地址 0x00000200,并将返回地址存储到寄存器 LR
- BL 0x00000200
- // 跳转到寄存器 R1 中的地址
- BX R1
- // 如果寄存器 R0 大于等于寄存器 R1,跳转到 label
- CMP R0, R1
- BGE label
复制代码 5. 停止和异常处置惩罚
5.1 停止向量表
停止向量表通常位于闪存的起始地址,包含各个停止和异常的处置惩罚步调地址。以下是一个典范的停止向量表布局:
- // 中断向量表
- VECTOR_TABLE:
- .word _estack // 栈顶地址
- .word Reset_Handler // 复位中断处理程序
- .word NMI_Handler // NMI 中断处理程序
- .word Hard_Fault_Handler // 硬故障处理程序
- .word MemManage_Handler // 存储器管理故障处理程序
- .word Bus_Fault_Handler // 总线故障处理程序
- .word Usage_Fault_Handler // 使用故障处理程序
- .word 0 // 保留
- .word 0 // 保留
- .word 0 // 保留
- .word 0 // 保留
- .word SVC_Handler // 服务调用处理程序
- .word DebugMon_Handler // 调试监控处理程序
- .word 0 // 保留
- .word PendSV_Handler // 挂起服务处理程序
- .word SysTick_Handler // 系统定时器处理程序
- .word IRQ0_Handler // 中断 0 处理程序
- .word IRQ1_Handler // 中断 1 处理程序
- // 其他中断处理程序
复制代码 5.2 停止处置惩罚步调
停止处置惩罚步调的编写需要遵循一定的规范,以确保停止可以或许正确处置惩罚。以下是一个简单的停止处置惩罚步调示例:
- // 外部中断 0 处理程序
- void IRQ0_Handler(void) {
- // 处理中断
- // 例如:读取某个 GPIO 引脚的状态
- uint32_t gpio_status = LPC_GPIO0->FIOPIN;
-
- // 根据 GPIO 状态进行相应处理
- if (gpio_status & (1 << 0)) {
- // 引脚 0 高电平
- // 执行相应操作
- } else {
- // 引脚 0 低电平
- // 执行相应操作
- }
-
- // 清除中断标志
- LPC_GPIO0->FIOPIN = 0x00;
- }
- // 系统定时器中断处理程序
- void SysTick_Handler(void) {
- static uint32_t counter = 0;
-
- // 增加计数器
- counter++;
-
- // 每 10 次中断,执行一次任务
- if (counter >= 10) {
- // 执行任务
- // 例如:更新某个外设的状态
- counter = 0;
- }
- }
复制代码 5.3 系统异常处置惩罚
系统异常处置惩罚步调用于处置惩罚系统的各种异常环境。以下是一个简单的硬故障处置惩罚步调示例:
- // 硬故障处理程序
- void Hard_Fault_Handler(void) {
- // 保存当前状态
- uint32_t stacked_r0;
- uint32_t stacked_r1;
- uint32_t stacked_r2;
- uint32_t stacked_r3;
- uint32_t stacked_r12;
- uint32_t stacked_lr;
- uint32_t stacked_pc;
- uint32_t stacked_psr;
-
- __asm volatile (
- "TST lr, #4\t\n"
- "ITE EQ\t\n"
- "MRSEQ r0, msp\t\n"
- "MRSNE r0, psp\t\n"
- "BIC r1, lr, #4\t\n"
- "TST r1, #0xC\t\n"
- "BNE lr_not_8_or_12\t\n"
- "LDR r2, [r0, #24]\t\n" // stacked PC
- "B lr_is_8_or_12\t\n"
- "lr_not_8_or_12:\t\n"
- "MOVS r2, lr\t\n"
- "LSLS r2, r2, #30\t\n"
- "LSRS r2, r2, #30\t\n"
- "TST r2, #2\t\n"
- "BNE in_handler\t\n"
- "LDR r2, [r0, #18]\t\n" // stacked PC
- "B lr_processed\t\n"
- "in_handler:\t\n"
- "LDR r2, [r0, #30]\t\n" // handler mode SP
- "SUBS r2, r2, #4\t\n"
- "LDR r2, [r2]\t\n" // stacked PC
- "lr_processed:\t\n"
- "LDR r3, [r2, #-4]!\t\n" // stacked PSR
- "LDR r12, [r2, #-4]!\t\n" // stacked R12
- "LDR r1, [r2, #-4]!\t\n" // stacked R1
- "LDR r0, [r2, #-4]!\t\n" // stacked R0
- "LDR r1, [r2, #-4]!\t\n" // stacked R1
- "LDR r2, [r2, #-4]!\t\n" // stacked R2
- "LDR r3, [r2, #-4]!\t\n" // stacked R3
- "LDR lr, [r2, #-4]!\t\n" // stacked LR
- "LDR pc, [r2, #-4]!\t\n" // stacked PC
- );
-
- // 打印硬故障信息
- printf("Hard Fault!\n");
-
- // 挂起系统
- while (1) {
- // 无限循环
- }
- }
复制代码 6. 调试支持
6.1 JTAG 接口
JTAG(团结测试行动组)接口是一种标准的调试接口,支持边界扫描测试和调试功能。ARM Cortex-M3 支持 JTAG 接口,可以使用 JTAG 调试器进行调试。
6.2 SWD 接口
SWD(串行线调试)接口是 ARM 公司推出的一种新的调试接口,比 JTAG 接口更简单、更高效。ARM Cortex-M3 支持 SWD 接口,可以使用 SWD 调试器进行调试。
6.3 调试示例
以下是一个使用 SWD 接口进行调试的示例:
- #include <stdio.h>
- #include "LPC17xx.h"
- int main(void) {
- // 初始化 GPIO
- LPC_PINCON->PINSEL0 &= ~(0x3 << 0); // 设置 P0.0 为 GPIO 功能
- LPC_GPIO0->FIOSET = (1 << 0); // 设置 P0.0 为高电平
- LPC_GPIO0->FIODIR = (1 << 0); // 设置 P0.0 为输出
- while (1) {
- // 翻转 P0.0 引脚的状态
- LPC_GPIO0->FIOSET = (1 << 0);
- for (volatile int i = 0; i < 1000000; i++) {
- // 延时
- }
- LPC_GPIO0->FIOCLR = (1 << 0);
- for (volatile int i = 0; i < 1000000; i++) {
- // 延时
- }
-
- // 设置断点
- __asm volatile ("bkpt #0");
- }
-
- return 0;
- }
复制代码 6.4 调试工具
常用的调试工具包括:
- Keil uVision:集成开发环境,支持 ARM Cortex-M3 的调试。
- CMSIS-DAP:基于 USB 的调试接口,支持 SWD 调试。
- OpenOCD:开源的调试和编程工具,支持 JTAG 和 SWD 接口。
7. 总结
ARM Cortex-M3 架构具有高性能、低功耗和高可靠性的特点,恰当应用于各种嵌入式系统。本节详细介绍了 ARM Cortex-M3 的内部布局、流水线操作、寄存器配置、停止处置惩罚和调试支持,为后续的学习和开发提供了坚固的基础。
ARM Cortex-M3架构详解
1. 引言
ARM Cortex-M3 是 ARM 公司推出的一种高性能、低功耗、低本钱的 32 位 RISC 微处置惩罚器架构,广泛应用于嵌入式系统中。本节将详细介绍 ARM Cortex-M3 架构的特点、内部布局、寄存器配置和停止处置惩罚机制。为了更好地理解这些内容,我们将重复一些前文的关键信息,并在此基础上继承深入探讨。
2. 架构特点
2.1 32位 RISC 架构
ARM Cortex-M3 是一种基于 RISC(精简指令集计算机)架构的处置惩罚器。RISC 架构的特点是:
- 固定长度指令:每条指令的长度都是固定的,通常为 32 位。
- 简单指令集:指令集计划简单,每条指令的功能明确。
- 流水线操作:采取多级流水线,提高指令执行效率。
- 寄存器文件:大量的通用寄存器,淘汰内存访问次数。
2.2 高性能计划
- 单周期乘法:支持单周期乘法操作,提高计算效率。
- 硬件除法:支持硬件除法,淘汰软件实现的开销。
- 分支推测:支持简单的分支推测,淘汰分支耽误。
- Thumb-2 指令集:支持 Thumb-2 指令集,可以在 16 位和 32 位指令之间灵活切换,提高代码密度和执行效率。
2.3 低功耗计划
- 动态功耗管理:支持多种功耗管理模式,如就寝模式和深度就寝模式。
- 低功耗时钟源:支持多种低功耗时钟源,如低频晶振和内部 RC 振荡器。
- 功耗优化的外设:外设计划考虑功耗优化,支持独立运行和低功耗模式。
2.4 高可靠性计划
- 内存保护单元 (MPU):支持内存保护单元,提高系统的安全性。
- 故障捕获:支持多种故障捕获机制,如总线故障、存储器管理故障和使用故障。
- 调试支持:提供丰富的调试支持,如 JTAG 和 SWD 接口。
3. 内部布局
3.1 焦点组件
3.1.1 处置惩罚器核
ARM Cortex-M3 处置惩罚器核包括以下几个主要部门:
- 指令流水线:3 级流水线,包括取指、译码和执行阶段。
- 寄存器文件:32 个 32 位通用寄存器,包括 R0-R12、SP(R13)、LR(R14)和 PC(R15)。
- 状态寄存器:包括步调状态寄存器(PSR)、控制寄存器(Control Register)和停止屏蔽寄存器(Interrupt Mask Register)。
3.1.2 存储器系统
- 内存映射:内存地址空间分为多个区域,每个区域有不同的访问权限和功能。
- 存储器管理单元 (MPU):可选的存储器管理单元,用于保护内存区域。
- 高速缓存:不支持高速缓存,但支持指令预取和数据存储器加速。
3.1.3 停止系统
- 嵌套向量停止控制器 (NVIC):管理停止优先级和嵌套停止。
- 系统异常:包括复位、NMI、硬故障、总线故障、使用故障等。
- 停止向量表:包含停止向量地址,用于快速相应停止。
3.2 流水线操作
3.2.1 取指阶段 (Fetch)
从内存中取出指令并放入指令流水线。
3.2.2 译码阶段 (Decode)
将取出的指令解码为微操作,准备执行。
3.2.3 执行阶段 (Execute)
执行解码后的微操作,完成指令的功能。
3.3 寄存器配置
3.3.1 通用寄存器
- R0-R12:通用寄存器,用于数据操作。
- R13:堆栈指针(SP),用于管理堆栈。
- R14:链接寄存器(LR),用于存储子步调返回地址。
- R15:步调计数器(PC),用于存储下一条指令的地址。
3.3.2 状态寄存器
- 步调状态寄存器 (PSR):包含当前处置惩罚器状态信息,如标志位和模式位。
- 控制寄存器 (Control Register):用于控制处置惩罚器的多种模式。
- 停止屏蔽寄存器 (Interrupt Mask Register):用于控制停止的优先级和屏蔽。
3.4 存储器访问
3.4.1 内存映射
ARM Cortex-M3 的内存地址空间通常分为以下几个区域:
- 闪存:用于存储步调代码。
- SRAM:用于存储数据和堆栈。
- 外设寄存器:用于控制外设。
- 系统控制寄存器:用于系统配置和调试。
3.4.2 存储器管理单元 (MPU)
MPU 可以配置多个区域,每个区域有不同的访问权限和属性。通过 MPU,可以保护关键的内存区域,防止非法访问。
3.5 停止处置惩罚
3.5.1 嵌套向量停止控制器 (NVIC)
NVIC 是 ARM Cortex-M3 中的重要组件,用于管理和控制停止。它支持多个停止源,并可以配置停止优先级和嵌套停止。
3.5.2 停止向量表
停止向量表通常位于闪存的起始地址,包含各个停止和异常的处置惩罚步调地址。以下是一个典范的停止向量表布局:
- // 中断向量表
- VECTOR_TABLE:
- .word _estack // 栈顶地址
- .word Reset_Handler // 复位中断处理程序
- .word NMI_Handler // NMI 中断处理程序
- .word Hard_Fault_Handler // 硬故障处理程序
- .word MemManage_Handler // 存储器管理故障处理程序
- .word Bus_Fault_Handler // 总线故障处理程序
- .word Usage_Fault_Handler // 使用故障处理程序
- .word 0 // 保留
- .word 0 // 保留
- .word 0 // 保留
- .word 0 // 保留
- .word SVC_Handler // 服务调用处理程序
- .word DebugMon_Handler // 调试监控处理程序
- .word 0 // 保留
- .word PendSV_Handler // 挂起服务处理程序
- .word SysTick_Handler // 系统定时器处理程序
- .word IRQ0_Handler // 中断 0 处理程序
- .word IRQ1_Handler // 中断 1 处理程序
- // 其他中断处理程序
复制代码 3.5.3 系统异常处置惩罚
系统异常处置惩罚步调用于处置惩罚系统的各种异常环境。以下是一个简单的硬故障处置惩罚步调示例:
- // 硬故障处理程序
- void Hard_Fault_Handler(void) {
- // 保存当前状态
- uint32_t stacked_r0;
- uint32_t stacked_r1;
- uint32_t stacked_r2;
- uint32_t stacked_r3;
- uint32_t stacked_r12;
- uint32_t stacked_lr;
- uint32_t stacked_pc;
- uint32_t stacked_psr;
-
- __asm volatile (
- "TST lr, #4\t\n"
- "ITE EQ\t\n"
- "MRSEQ r0, msp\t\n"
- "MRSNE r0, psp\t\n"
- "BIC r1, lr, #4\t\n"
- "TST r1, #0xC\t\n"
- "BNE lr_not_8_or_12\t\n"
- "LDR r2, [r0, #24]\t\n" // stacked PC
- "B lr_is_8_or_12\t\n"
- "lr_not_8_or_12:\t\n"
- "MOVS r2, lr\t\n"
- "LSLS r2, r2, #30\t\n"
- "LSRS r2, r2, #30\t\n"
- "TST r2, #2\t\n"
- "BNE in_handler\t\n"
- "LDR r2, [r0, #18]\t\n" // stacked PC
- "B lr_processed\t\n"
- "in_handler:\t\n"
- "LDR r2, [r0, #30]\t\n" // handler mode SP
- "SUBS r2, r2, #4\t\n"
- "LDR r2, [r2]\t\n" // stacked PC
- "lr_processed:\t\n"
- "LDR r3, [r2, #-4]!\t\n" // stacked PSR
- "LDR r12, [r2, #-4]!\t\n" // stacked R12
- "LDR r1, [r2, #-4]!\t\n" // stacked R1
- "LDR r0, [r2, #-4]!\t\n" // stacked R0
- "LDR r1, [r2, #-4]!\t\n" // stacked R1
- "LDR r2, [r2, #-4]!\t\n" // stacked R2
- "LDR r3, [r2, #-4]!\t\n" // stacked R3
- "LDR lr, [r2, #-4]!\t\n" // stacked LR
- "LDR pc, [r2, #-4]!\t\n" // stacked PC
- );
-
- // 打印硬故障信息
- printf("Hard Fault!\n");
-
- // 挂起系统
- while (1) {
- // 无限循环
- }
- }
复制代码 4. 指令集
4.1 Thumb-2 指令集
Thumb-2 指令集是 ARM Cortex-M3 的一大特点,它结合了 16 位和 32 位指令的上风:
- 16位指令:用于提高代码密度,淘汰内存占用。
- 32位指令:用于提高指令执行效率,支持复杂的操作。
4.2 常用指令
4.2.1 数据处置惩罚指令
- MOV:移动数据
- ADD:加法
- SUB:减法
- AND:逻辑与
- ORR:逻辑或
- EOR:逻辑异或
- LSL:逻辑左移
- LSR:逻辑右移
4.2.2 存储器访问指令
- LDR:加载数据到寄存器
- STR:存储数据到内存
- LDM:批量加载数据到寄存器
- STM:批量存储数据到内存
4.2.3 分支指令
- B:无条件跳转
- BL:带链接的跳转
- BX:改变步调状态寄存器(PSR)的模式
- BGE:大于即是跳转
4.3 指令示例
4.3.1 数据处置惩罚指令示例
- // 将寄存器 R1 的值加 1 并存储到 R2
- ADD R2, R1, #1
- // 将寄存器 R1 和 R2 的值进行逻辑与操作,结果存储到 R3
- AND R3, R1, R2
- // 将寄存器 R1 的值左移 2 位,结果存储到 R2
- LSL R2, R1, #2
复制代码 4.3.2 存储器访问指令示例
- // 从地址 0x20000000 加载一个 32 位数据到寄存器 R0
- LDR R0, [0x20000000]
- // 将寄存器 R1 的值存储到地址 0x20000004
- STR R1, [0x20000004]
- // 从地址 0x20000008 开始批量加载 4 个 32 位数据到寄存器 R2-R5
- LDM R2, R5, [0x20000008]!
- // 从寄存器 R2 开始批量存储 4 个 32 位数据到地址 0x2000000C
- STM R2, R5, [0x2000000C]!
复制代码 4.3.3 分支指令示例
- // 无条件跳转到地址 0x00000100
- B 0x00000100
- // 跳转到地址 0x00000200,并将返回地址存储到寄存器 LR
- BL 0x00000200
- // 跳转到寄存器 R1 中的地址
- BX R1
- // 如果寄存器 R0 大于等于寄存器 R1,跳转到 label
- CMP R0, R1
- BGE label
复制代码 5. 停止和异常处置惩罚
5.1 停止向量表
停止向量表通常位于闪存的起始地址,包含各个停止和异常的处置惩罚步调地址。以下是一个典范的停止向量表布局:
- // 中断向量表
- VECTOR_TABLE:
- .word _estack // 栈顶地址
- .word Reset_Handler // 复位中断处理程序
- .word NMI_Handler // NMI 中断处理程序
- .word Hard_Fault_Handler // 硬故障处理程序
- .word MemManage_Handler // 存储器管理故障处理程序
- .word Bus_Fault_Handler // 总线故障处理程序
- .word Usage_Fault_Handler // 使用故障处理程序
- .word 0 // 保留
- .word 0 // 保留
- .word 0 // 保留
- .word 0 // 保留
- .word SVC_Handler // 服务调用处理程序
- .word DebugMon_Handler // 调试监控处理程序
- .word 0 // 保留
- .word PendSV_Handler // 挂起服务处理程序
- .word SysTick_Handler // 系统定时器处理程序
- .word IRQ0_Handler // 中断 0 处理程序
- .word IRQ1_Handler // 中断 1 处理程序
- // 其他中断处理程序
复制代码 5.2 停止处置惩罚步调
停止处置惩罚步调的编写需要遵循一定的规范,以确保停止可以或许正确处置惩罚。以下是一个简单的停止处置惩罚步调示例:
- // 外部中断 0 处理程序
- void IRQ0_Handler(void) {
- // 处理中断
- // 例如:读取某个 GPIO 引脚的状态
- uint32_t gpio_status = LPC_GPIO0->FIOPIN;
-
- // 根据 GPIO 状态进行相应处理
- if (gpio_status & (1 << 0)) {
- // 引脚 0 高电平
- // 执行相应操作
- } else {
- // 引脚 0 低电平
- // 执行相应操作
- }
-
- // 清除中断标志
- LPC_GPIO0->FIOPIN = 0x00;
- }
- // 系统定时器中断处理程序
- void SysTick_Handler(void) {
- static uint32_t counter = 0;
-
- // 增加计数器
- counter++;
-
- // 每 10 次中断,执行一次任务
- if (counter >= 10) {
- // 执行任务
- // 例如:更新某个外设的状态
- counter = 0;
- }
- }
复制代码 5.3 系统异常处置惩罚
系统异常处置惩罚步调用于处置惩罚系统的各种异常环境。以下是一个简单的硬故障处置惩罚步调示例:
- // 硬故障处理程序
- void Hard_Fault_Handler(void) {
- // 保存当前状态
- uint32_t stacked_r0;
- uint32_t stacked_r1;
- uint32_t stacked_r2;
- uint32_t stacked_r3;
- uint32_t stacked_r12;
- uint32_t stacked_lr;
- uint32_t stacked_pc;
- uint32_t stacked_psr;
-
- __asm volatile (
- "TST lr, #4\t\n"
- "ITE EQ\t\n"
- "MRSEQ r0, msp\t\n"
- "MRSNE r0, psp\t\n"
- "BIC r1, lr, #4\t\n"
- "TST r1, #0xC\t\n"
- "BNE lr_not_8_or_12\t\n"
- "LDR r2, [r0, #24]\t\n" // stacked PC
- "B lr_is_8_or_12\t\n"
- "lr_not_8_or_12:\t\n"
- "MOVS r2, lr\t\n"
- "LSLS r2, r2, #30\t\n"
- "LSRS r2, r2, #30\t\n"
- "TST r2, #2\t\n"
- "BNE in_handler\t\n"
- "LDR r2, [r0, #18]\t\n" // stacked PC
- "B lr_processed\t\n"
- "in_handler:\t\n"
- "LDR r2, [r0, #30]\t\n" // handler mode SP
- "SUBS r2, r2, #4\t\n"
- "LDR r2, [r2]\t\n" // stacked PC
- "lr_processed:\t\n"
- "LDR r3, [r2, #-4]!\t\n" // stacked PSR
- "LDR r12, [r2, #-4]!\t\n" // stacked R12
- "LDR r1, [r2, #-4]!\t\n" // stacked R1
- "LDR r0, [r2, #-4]!\t\n" // stacked R0
- "LDR r1, [r2, #-4]!\t\n" // stacked R1
- "LDR r2, [r2, #-4]!\t\n" // stacked R2
- "LDR r3, [r2, #-4]!\t\n" // stacked R3
- "LDR lr, [r2, #-4]!\t\n" // stacked LR
- "LDR pc, [r2, #-4]!\t\n" // stacked PC
- );
-
- // 打印硬故障信息
- printf("Hard Fault!\n");
-
- // 挂起系统
- while (1) {
- // 无限循环
- }
- }
复制代码 5.4 停止优先级和嵌套
ARM Cortex-M3 支持多个停止源,并且每个停止源都有一个优先级。NVIC 可以配置停止优先级,以便在多个停止同时发生时确定处置惩罚次序。别的,ARM Cortex-M3 还支持嵌套停止,即在处置惩罚一个停止时可以被更高优先级的停止打断。
5.4.1 停止优先级配置
停止优先级可以通过 NVIC 的停止优先级寄存器(IPR)进行配置。以下是一个配置停止优先级的示例:
- // 配置中断 0 的优先级为 1
- NVIC_SetPriority(IRQ0_IRQn, 1);
- // 配置中断 1 的优先级为 2
- NVIC_SetPriority(IRQ1_IRQn, 2);
复制代码 5.4.2 嵌套停止示例
- // 假设中断 0 的优先级高于中断 1
- // 中断 0 处理程序
- void IRQ0_Handler(void) {
- // 处理中断 0
- // 例如:读取某个 GPIO 引脚的状态
- uint32_t gpio_status = LPC_GPIO0->FIOPIN;
-
- // 根据 GPIO 状态进行相应处理
- if (gpio_status & (1 << 0)) {
- // 引脚 0 高电平
- // 执行相应操作
- } else {
- // 引脚 0 低电平
- // 执行相应操作
- }
-
- // 清除中断标志
- LPC_GPIO0->FIOPIN = 0x00;
- }
- // 中断 1 处理程序
- void IRQ1_Handler(void) {
- // 处理中断 1
- // 例如:读取某个 ADC 的值
- uint32_t adc_value = LPC_ADC->ADGDR;
-
- // 根据 ADC 值进行相应处理
- if (adc_value > 1000) {
- // 执行相应操作
- } else {
- // 执行相应操作
- }
-
- // 清除中断标志
- LPC_ADC->ADGDR = 0x00;
- }
复制代码 在上述示例中,假如停止 1 正在处置惩罚,停止 0 发生且优先级更高,那么停止 0 会打断停止 1 的处置惩罚,先处置惩罚停止 0。处置惩罚完停止 0 后,再继承处置惩罚停止 1。
6. 调试支持
6.1 JTAG 接口
JTAG(团结测试行动组)接口是一种标准的调试接口,支持边界扫描测试和调试功能。ARM Cortex-M3 支持 JTAG 接口,可以使用 JTAG 调试器进行调试。
6.2 SWD 接口
SWD(串行线调试)接口是 ARM 公司推出的一种新的调试接口,比 JTAG 接口更简单、更高效。ARM Cortex-M3 支持 SWD 接口,可以使用 SWD 调试器进行调试。
6.3 调试示例
以下是一个使用 SWD 接口进行调试的示例:
- #include <stdio.h>
- #include "LPC17xx.h"
- int main(void) {
- // 初始化 GPIO
- LPC_PINCON->PINSEL0 &= ~(0x3 << 0); // 设置 P0.0 为 GPIO 功能
- LPC_GPIO0->FIOSET = (1 << 0); // 设置 P0.0 为高电平
- LPC_GPIO0->FIODIR = (1 << 0); // 设置 P0.0 为输出
- while (1) {
- // 翻转 P0.0 引脚的状态
- LPC_GPIO0->FIOSET = (1 << 0);
- for (volatile int i = 0; i < 1000000; i++) {
- // 延时
- }
- LPC_GPIO0->FIOCLR = (1 << 0);
- for (volatile int i = 0; i < 1000000; i++) {
- // 延时
- }
-
- // 设置断点
- __asm volatile ("bkpt #0");
- }
-
- return 0;
- }
复制代码 6.4 调试工具
常用的调试工具包括:
- Keil uVision:集成开发环境,支持 ARM Cortex-M3 的调试。
- CMSIS-DAP:基于 USB 的调试接口,支持 SWD 调试。
- OpenOCD:开源的调试和编程工具,支持 JTAG 和 SWD 接口。
7. 总结
ARM Cortex-M3 架构具有高性能、低功耗和高可靠性的特点,恰当应用于各种嵌入式系统。本节详细介绍了 ARM Cortex-M3 的内部布局、流水线操作、寄存器配置、停止处置惩罚和调试支持,为后续的学习和开发提供了坚固的基础。
7.1 内部布局回首
ARM Cortex-M3 的内部布局包括:
- 处置惩罚器核:3 级流水线,32 个 32 位通用寄存器。
- 存储器系统:内存映射、可选的存储器管理单元(MPU)、指令预取和数据存储器加速。
- 停止系统:嵌套向量停止控制器(NVIC)、系统异常和停止向量表。
7.2 流水线操作回首
流水线操作分为三个阶段:
- 取指阶段 (Fetch):从内存中取出指令并放入指令流水线。
- 译码阶段 (Decode):将取出的指令解码为微操作,准备执行。
- 执行阶段 (Execute):执行解码后的微操作,完成指令的功能。
7.3 寄存器配置回首
寄存器配置包括:
- 通用寄存器:R0-R12、SP(R13)、LR(R14)和 PC(R15)。
- 状态寄存器:步调状态寄存器(PSR)、控制寄存器(Control Register)和停止屏蔽寄存器(Interrupt Mask Register)。
7.4 存储器访问回首
存储器访问包括:
- 内存映射:闪存、SRAM、外设寄存器和系统控制寄存器。
- 存储器管理单元 (MPU):用于保护内存区域,防止非法访问。
7.5 停止处置惩罚回首
停止处置惩罚包括:
- 停止向量表:位于闪存的起始地址,包含停止和异常的处置惩罚步调地址。
- 停止处置惩罚步调:用于处置惩罚特定的停止事件。
- 系统异常处置惩罚:用于处置惩罚系统的各种异常环境,如硬故障、总线故障等。
7.6 调试支持回首
调试支持包括:
- JTAG 接口:标准的调试接口,支持边界扫描测试和调试。
- SWD 接口:比 JTAG 更简单、更高效的调试接口。
- 调试工具:Keil uVision、CMSIS-DAP 和 OpenOCD 等。
通过以上内容,我们对 ARM Cortex-M3 架构有了全面的相识。渴望这些信息可以或许帮助你在嵌入式系统开发中更好地使用 ARM Cortex-M3 的上风。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |