IT评测·应用市场-qidao123.com

标题: ARM Cortex-M3架构详解 [打印本页]

作者: 郭卫东    时间: 2024-12-1 18:14
标题: 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 架构的特点是:

2.2 高性能计划


2.3 低功耗计划


2.4 高可靠性计划


3. 内部布局

3.1 焦点组件

3.1.1 处置惩罚器核

ARM Cortex-M3 处置惩罚器核包括以下几个主要部门:

3.1.2 存储器系统


3.1.3 停止系统


3.2 流水线操作

3.2.1 取指阶段 (Fetch)

从内存中取出指令并放入指令流水线。
3.2.2 译码阶段 (Decode)

将取出的指令解码为微操作,准备执行。
3.2.3 执行阶段 (Execute)

执行解码后的微操作,完成指令的功能。
3.3 寄存器配置

3.3.1 通用寄存器


3.3.2 状态寄存器


3.4 存储器访问

3.4.1 内存映射

ARM Cortex-M3 的内存地址空间通常分为以下几个区域:

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 位指令的上风:

4.2 常用指令

4.2.1 数据处置惩罚指令


4.2.2 存储器访问指令


4.2.3 分支指令


4.3 指令示例

4.3.1 数据处置惩罚指令示例

  1. // 将寄存器 R1 的值加 1 并存储到 R2
  2. ADD R2, R1, #1
  3. // 将寄存器 R1 和 R2 的值进行逻辑与操作,结果存储到 R3
  4. AND R3, R1, R2
  5. // 将寄存器 R1 的值左移 2 位,结果存储到 R2
  6. LSL R2, R1, #2
复制代码
4.3.2 存储器访问指令示例

  1. // 从地址 0x20000000 加载一个 32 位数据到寄存器 R0
  2. LDR R0, [0x20000000]
  3. // 将寄存器 R1 的值存储到地址 0x20000004
  4. STR R1, [0x20000004]
  5. // 从地址 0x20000008 开始批量加载 4 个 32 位数据到寄存器 R2-R5
  6. LDM R2, R5, [0x20000008]!
  7. // 从寄存器 R2 开始批量存储 4 个 32 位数据到地址 0x2000000C
  8. STM R2, R5, [0x2000000C]!
复制代码
4.3.3 分支指令示例

  1. // 无条件跳转到地址 0x00000100
  2. B 0x00000100
  3. // 跳转到地址 0x00000200,并将返回地址存储到寄存器 LR
  4. BL 0x00000200
  5. // 跳转到寄存器 R1 中的地址
  6. BX R1
  7. // 如果寄存器 R0 大于等于寄存器 R1,跳转到 label
  8. CMP R0, R1
  9. BGE label
复制代码
5. 停止和异常处置惩罚

5.1 停止向量表

停止向量表通常位于闪存的起始地址,包含各个停止和异常的处置惩罚步调地址。以下是一个典范的停止向量表布局:
  1. // 中断向量表
  2. VECTOR_TABLE:
  3.     .word _estack              // 栈顶地址
  4.     .word Reset_Handler        // 复位中断处理程序
  5.     .word NMI_Handler          // NMI 中断处理程序
  6.     .word Hard_Fault_Handler   // 硬故障处理程序
  7.     .word MemManage_Handler    // 存储器管理故障处理程序
  8.     .word Bus_Fault_Handler    // 总线故障处理程序
  9.     .word Usage_Fault_Handler  // 使用故障处理程序
  10.     .word 0                    // 保留
  11.     .word 0                    // 保留
  12.     .word 0                    // 保留
  13.     .word 0                    // 保留
  14.     .word SVC_Handler           // 服务调用处理程序
  15.     .word DebugMon_Handler      // 调试监控处理程序
  16.     .word 0                    // 保留
  17.     .word PendSV_Handler        // 挂起服务处理程序
  18.     .word SysTick_Handler       // 系统定时器处理程序
  19.     .word IRQ0_Handler          // 中断 0 处理程序
  20.     .word IRQ1_Handler          // 中断 1 处理程序
  21.     // 其他中断处理程序
复制代码
5.2 停止处置惩罚步调

停止处置惩罚步调的编写需要遵循一定的规范,以确保停止可以或许正确处置惩罚。以下是一个简单的停止处置惩罚步调示例:
  1. // 外部中断 0 处理程序
  2. void IRQ0_Handler(void) {
  3.     // 处理中断
  4.     // 例如:读取某个 GPIO 引脚的状态
  5.     uint32_t gpio_status = LPC_GPIO0->FIOPIN;
  6.    
  7.     // 根据 GPIO 状态进行相应处理
  8.     if (gpio_status & (1 << 0)) {
  9.         // 引脚 0 高电平
  10.         // 执行相应操作
  11.     } else {
  12.         // 引脚 0 低电平
  13.         // 执行相应操作
  14.     }
  15.    
  16.     // 清除中断标志
  17.     LPC_GPIO0->FIOPIN = 0x00;
  18. }
  19. // 系统定时器中断处理程序
  20. void SysTick_Handler(void) {
  21.     static uint32_t counter = 0;
  22.    
  23.     // 增加计数器
  24.     counter++;
  25.    
  26.     // 每 10 次中断,执行一次任务
  27.     if (counter >= 10) {
  28.         // 执行任务
  29.         // 例如:更新某个外设的状态
  30.         counter = 0;
  31.     }
  32. }
复制代码
5.3 系统异常处置惩罚

系统异常处置惩罚步调用于处置惩罚系统的各种异常环境。以下是一个简单的硬故障处置惩罚步调示例:
  1. // 硬故障处理程序
  2. void Hard_Fault_Handler(void) {
  3.     // 保存当前状态
  4.     uint32_t stacked_r0;
  5.     uint32_t stacked_r1;
  6.     uint32_t stacked_r2;
  7.     uint32_t stacked_r3;
  8.     uint32_t stacked_r12;
  9.     uint32_t stacked_lr;
  10.     uint32_t stacked_pc;
  11.     uint32_t stacked_psr;
  12.    
  13.     __asm volatile (
  14.         "TST lr, #4\t\n"
  15.         "ITE EQ\t\n"
  16.         "MRSEQ r0, msp\t\n"
  17.         "MRSNE r0, psp\t\n"
  18.         "BIC r1, lr, #4\t\n"
  19.         "TST r1, #0xC\t\n"
  20.         "BNE lr_not_8_or_12\t\n"
  21.         "LDR r2, [r0, #24]\t\n"  // stacked PC
  22.         "B lr_is_8_or_12\t\n"
  23.         "lr_not_8_or_12:\t\n"
  24.         "MOVS r2, lr\t\n"
  25.         "LSLS r2, r2, #30\t\n"
  26.         "LSRS r2, r2, #30\t\n"
  27.         "TST r2, #2\t\n"
  28.         "BNE in_handler\t\n"
  29.         "LDR r2, [r0, #18]\t\n"  // stacked PC
  30.         "B lr_processed\t\n"
  31.         "in_handler:\t\n"
  32.         "LDR r2, [r0, #30]\t\n"  // handler mode SP
  33.         "SUBS r2, r2, #4\t\n"
  34.         "LDR r2, [r2]\t\n"      // stacked PC
  35.         "lr_processed:\t\n"
  36.         "LDR r3, [r2, #-4]!\t\n" // stacked PSR
  37.         "LDR r12, [r2, #-4]!\t\n" // stacked R12
  38.         "LDR r1, [r2, #-4]!\t\n" // stacked R1
  39.         "LDR r0, [r2, #-4]!\t\n" // stacked R0
  40.         "LDR r1, [r2, #-4]!\t\n" // stacked R1
  41.         "LDR r2, [r2, #-4]!\t\n" // stacked R2
  42.         "LDR r3, [r2, #-4]!\t\n" // stacked R3
  43.         "LDR lr, [r2, #-4]!\t\n" // stacked LR
  44.         "LDR pc, [r2, #-4]!\t\n" // stacked PC
  45.     );
  46.    
  47.     // 打印硬故障信息
  48.     printf("Hard Fault!\n");
  49.    
  50.     // 挂起系统
  51.     while (1) {
  52.         // 无限循环
  53.     }
  54. }
复制代码
6. 调试支持

6.1 JTAG 接口

JTAG(团结测试行动组)接口是一种标准的调试接口,支持边界扫描测试和调试功能。ARM Cortex-M3 支持 JTAG 接口,可以使用 JTAG 调试器进行调试。
6.2 SWD 接口

SWD(串行线调试)接口是 ARM 公司推出的一种新的调试接口,比 JTAG 接口更简单、更高效。ARM Cortex-M3 支持 SWD 接口,可以使用 SWD 调试器进行调试。
6.3 调试示例

以下是一个使用 SWD 接口进行调试的示例:
  1. #include <stdio.h>
  2. #include "LPC17xx.h"
  3. int main(void) {
  4.     // 初始化 GPIO
  5.     LPC_PINCON->PINSEL0 &= ~(0x3 << 0);  // 设置 P0.0 为 GPIO 功能
  6.     LPC_GPIO0->FIOSET = (1 << 0);        // 设置 P0.0 为高电平
  7.     LPC_GPIO0->FIODIR = (1 << 0);        // 设置 P0.0 为输出
  8.     while (1) {
  9.         // 翻转 P0.0 引脚的状态
  10.         LPC_GPIO0->FIOSET = (1 << 0);
  11.         for (volatile int i = 0; i < 1000000; i++) {
  12.             // 延时
  13.         }
  14.         LPC_GPIO0->FIOCLR = (1 << 0);
  15.         for (volatile int i = 0; i < 1000000; i++) {
  16.             // 延时
  17.         }
  18.         
  19.         // 设置断点
  20.         __asm volatile ("bkpt #0");
  21.     }
  22.    
  23.     return 0;
  24. }
复制代码
6.4 调试工具

常用的调试工具包括:

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 架构的特点是:

2.2 高性能计划


2.3 低功耗计划


2.4 高可靠性计划


3. 内部布局

3.1 焦点组件

3.1.1 处置惩罚器核

ARM Cortex-M3 处置惩罚器核包括以下几个主要部门:

3.1.2 存储器系统


3.1.3 停止系统


3.2 流水线操作

3.2.1 取指阶段 (Fetch)

从内存中取出指令并放入指令流水线。
3.2.2 译码阶段 (Decode)

将取出的指令解码为微操作,准备执行。
3.2.3 执行阶段 (Execute)

执行解码后的微操作,完成指令的功能。
3.3 寄存器配置

3.3.1 通用寄存器


3.3.2 状态寄存器


3.4 存储器访问

3.4.1 内存映射

ARM Cortex-M3 的内存地址空间通常分为以下几个区域:

3.4.2 存储器管理单元 (MPU)

MPU 可以配置多个区域,每个区域有不同的访问权限和属性。通过 MPU,可以保护关键的内存区域,防止非法访问。
3.5 停止处置惩罚

3.5.1 嵌套向量停止控制器 (NVIC)

NVIC 是 ARM Cortex-M3 中的重要组件,用于管理和控制停止。它支持多个停止源,并可以配置停止优先级和嵌套停止。
3.5.2 停止向量表

停止向量表通常位于闪存的起始地址,包含各个停止和异常的处置惩罚步调地址。以下是一个典范的停止向量表布局:
  1. // 中断向量表
  2. VECTOR_TABLE:
  3.     .word _estack              // 栈顶地址
  4.     .word Reset_Handler        // 复位中断处理程序
  5.     .word NMI_Handler          // NMI 中断处理程序
  6.     .word Hard_Fault_Handler   // 硬故障处理程序
  7.     .word MemManage_Handler    // 存储器管理故障处理程序
  8.     .word Bus_Fault_Handler    // 总线故障处理程序
  9.     .word Usage_Fault_Handler  // 使用故障处理程序
  10.     .word 0                    // 保留
  11.     .word 0                    // 保留
  12.     .word 0                    // 保留
  13.     .word 0                    // 保留
  14.     .word SVC_Handler           // 服务调用处理程序
  15.     .word DebugMon_Handler      // 调试监控处理程序
  16.     .word 0                    // 保留
  17.     .word PendSV_Handler        // 挂起服务处理程序
  18.     .word SysTick_Handler       // 系统定时器处理程序
  19.     .word IRQ0_Handler          // 中断 0 处理程序
  20.     .word IRQ1_Handler          // 中断 1 处理程序
  21.     // 其他中断处理程序
复制代码
3.5.3 系统异常处置惩罚

系统异常处置惩罚步调用于处置惩罚系统的各种异常环境。以下是一个简单的硬故障处置惩罚步调示例:
  1. // 硬故障处理程序
  2. void Hard_Fault_Handler(void) {
  3.     // 保存当前状态
  4.     uint32_t stacked_r0;
  5.     uint32_t stacked_r1;
  6.     uint32_t stacked_r2;
  7.     uint32_t stacked_r3;
  8.     uint32_t stacked_r12;
  9.     uint32_t stacked_lr;
  10.     uint32_t stacked_pc;
  11.     uint32_t stacked_psr;
  12.    
  13.     __asm volatile (
  14.         "TST lr, #4\t\n"
  15.         "ITE EQ\t\n"
  16.         "MRSEQ r0, msp\t\n"
  17.         "MRSNE r0, psp\t\n"
  18.         "BIC r1, lr, #4\t\n"
  19.         "TST r1, #0xC\t\n"
  20.         "BNE lr_not_8_or_12\t\n"
  21.         "LDR r2, [r0, #24]\t\n"  // stacked PC
  22.         "B lr_is_8_or_12\t\n"
  23.         "lr_not_8_or_12:\t\n"
  24.         "MOVS r2, lr\t\n"
  25.         "LSLS r2, r2, #30\t\n"
  26.         "LSRS r2, r2, #30\t\n"
  27.         "TST r2, #2\t\n"
  28.         "BNE in_handler\t\n"
  29.         "LDR r2, [r0, #18]\t\n"  // stacked PC
  30.         "B lr_processed\t\n"
  31.         "in_handler:\t\n"
  32.         "LDR r2, [r0, #30]\t\n"  // handler mode SP
  33.         "SUBS r2, r2, #4\t\n"
  34.         "LDR r2, [r2]\t\n"      // stacked PC
  35.         "lr_processed:\t\n"
  36.         "LDR r3, [r2, #-4]!\t\n" // stacked PSR
  37.         "LDR r12, [r2, #-4]!\t\n" // stacked R12
  38.         "LDR r1, [r2, #-4]!\t\n" // stacked R1
  39.         "LDR r0, [r2, #-4]!\t\n" // stacked R0
  40.         "LDR r1, [r2, #-4]!\t\n" // stacked R1
  41.         "LDR r2, [r2, #-4]!\t\n" // stacked R2
  42.         "LDR r3, [r2, #-4]!\t\n" // stacked R3
  43.         "LDR lr, [r2, #-4]!\t\n" // stacked LR
  44.         "LDR pc, [r2, #-4]!\t\n" // stacked PC
  45.     );
  46.    
  47.     // 打印硬故障信息
  48.     printf("Hard Fault!\n");
  49.    
  50.     // 挂起系统
  51.     while (1) {
  52.         // 无限循环
  53.     }
  54. }
复制代码
4. 指令集

4.1 Thumb-2 指令集

Thumb-2 指令集是 ARM Cortex-M3 的一大特点,它结合了 16 位和 32 位指令的上风:

4.2 常用指令

4.2.1 数据处置惩罚指令


4.2.2 存储器访问指令


4.2.3 分支指令


4.3 指令示例

4.3.1 数据处置惩罚指令示例

  1. // 将寄存器 R1 的值加 1 并存储到 R2
  2. ADD R2, R1, #1
  3. // 将寄存器 R1 和 R2 的值进行逻辑与操作,结果存储到 R3
  4. AND R3, R1, R2
  5. // 将寄存器 R1 的值左移 2 位,结果存储到 R2
  6. LSL R2, R1, #2
复制代码
4.3.2 存储器访问指令示例

  1. // 从地址 0x20000000 加载一个 32 位数据到寄存器 R0
  2. LDR R0, [0x20000000]
  3. // 将寄存器 R1 的值存储到地址 0x20000004
  4. STR R1, [0x20000004]
  5. // 从地址 0x20000008 开始批量加载 4 个 32 位数据到寄存器 R2-R5
  6. LDM R2, R5, [0x20000008]!
  7. // 从寄存器 R2 开始批量存储 4 个 32 位数据到地址 0x2000000C
  8. STM R2, R5, [0x2000000C]!
复制代码
4.3.3 分支指令示例

  1. // 无条件跳转到地址 0x00000100
  2. B 0x00000100
  3. // 跳转到地址 0x00000200,并将返回地址存储到寄存器 LR
  4. BL 0x00000200
  5. // 跳转到寄存器 R1 中的地址
  6. BX R1
  7. // 如果寄存器 R0 大于等于寄存器 R1,跳转到 label
  8. CMP R0, R1
  9. BGE label
复制代码
5. 停止和异常处置惩罚

5.1 停止向量表

停止向量表通常位于闪存的起始地址,包含各个停止和异常的处置惩罚步调地址。以下是一个典范的停止向量表布局:
  1. // 中断向量表
  2. VECTOR_TABLE:
  3.     .word _estack              // 栈顶地址
  4.     .word Reset_Handler        // 复位中断处理程序
  5.     .word NMI_Handler          // NMI 中断处理程序
  6.     .word Hard_Fault_Handler   // 硬故障处理程序
  7.     .word MemManage_Handler    // 存储器管理故障处理程序
  8.     .word Bus_Fault_Handler    // 总线故障处理程序
  9.     .word Usage_Fault_Handler  // 使用故障处理程序
  10.     .word 0                    // 保留
  11.     .word 0                    // 保留
  12.     .word 0                    // 保留
  13.     .word 0                    // 保留
  14.     .word SVC_Handler           // 服务调用处理程序
  15.     .word DebugMon_Handler      // 调试监控处理程序
  16.     .word 0                    // 保留
  17.     .word PendSV_Handler        // 挂起服务处理程序
  18.     .word SysTick_Handler       // 系统定时器处理程序
  19.     .word IRQ0_Handler          // 中断 0 处理程序
  20.     .word IRQ1_Handler          // 中断 1 处理程序
  21.     // 其他中断处理程序
复制代码
5.2 停止处置惩罚步调

停止处置惩罚步调的编写需要遵循一定的规范,以确保停止可以或许正确处置惩罚。以下是一个简单的停止处置惩罚步调示例:
  1. // 外部中断 0 处理程序
  2. void IRQ0_Handler(void) {
  3.     // 处理中断
  4.     // 例如:读取某个 GPIO 引脚的状态
  5.     uint32_t gpio_status = LPC_GPIO0->FIOPIN;
  6.    
  7.     // 根据 GPIO 状态进行相应处理
  8.     if (gpio_status & (1 << 0)) {
  9.         // 引脚 0 高电平
  10.         // 执行相应操作
  11.     } else {
  12.         // 引脚 0 低电平
  13.         // 执行相应操作
  14.     }
  15.    
  16.     // 清除中断标志
  17.     LPC_GPIO0->FIOPIN = 0x00;
  18. }
  19. // 系统定时器中断处理程序
  20. void SysTick_Handler(void) {
  21.     static uint32_t counter = 0;
  22.    
  23.     // 增加计数器
  24.     counter++;
  25.    
  26.     // 每 10 次中断,执行一次任务
  27.     if (counter >= 10) {
  28.         // 执行任务
  29.         // 例如:更新某个外设的状态
  30.         counter = 0;
  31.     }
  32. }
复制代码
5.3 系统异常处置惩罚

系统异常处置惩罚步调用于处置惩罚系统的各种异常环境。以下是一个简单的硬故障处置惩罚步调示例:
  1. // 硬故障处理程序
  2. void Hard_Fault_Handler(void) {
  3.     // 保存当前状态
  4.     uint32_t stacked_r0;
  5.     uint32_t stacked_r1;
  6.     uint32_t stacked_r2;
  7.     uint32_t stacked_r3;
  8.     uint32_t stacked_r12;
  9.     uint32_t stacked_lr;
  10.     uint32_t stacked_pc;
  11.     uint32_t stacked_psr;
  12.    
  13.     __asm volatile (
  14.         "TST lr, #4\t\n"
  15.         "ITE EQ\t\n"
  16.         "MRSEQ r0, msp\t\n"
  17.         "MRSNE r0, psp\t\n"
  18.         "BIC r1, lr, #4\t\n"
  19.         "TST r1, #0xC\t\n"
  20.         "BNE lr_not_8_or_12\t\n"
  21.         "LDR r2, [r0, #24]\t\n"  // stacked PC
  22.         "B lr_is_8_or_12\t\n"
  23.         "lr_not_8_or_12:\t\n"
  24.         "MOVS r2, lr\t\n"
  25.         "LSLS r2, r2, #30\t\n"
  26.         "LSRS r2, r2, #30\t\n"
  27.         "TST r2, #2\t\n"
  28.         "BNE in_handler\t\n"
  29.         "LDR r2, [r0, #18]\t\n"  // stacked PC
  30.         "B lr_processed\t\n"
  31.         "in_handler:\t\n"
  32.         "LDR r2, [r0, #30]\t\n"  // handler mode SP
  33.         "SUBS r2, r2, #4\t\n"
  34.         "LDR r2, [r2]\t\n"      // stacked PC
  35.         "lr_processed:\t\n"
  36.         "LDR r3, [r2, #-4]!\t\n" // stacked PSR
  37.         "LDR r12, [r2, #-4]!\t\n" // stacked R12
  38.         "LDR r1, [r2, #-4]!\t\n" // stacked R1
  39.         "LDR r0, [r2, #-4]!\t\n" // stacked R0
  40.         "LDR r1, [r2, #-4]!\t\n" // stacked R1
  41.         "LDR r2, [r2, #-4]!\t\n" // stacked R2
  42.         "LDR r3, [r2, #-4]!\t\n" // stacked R3
  43.         "LDR lr, [r2, #-4]!\t\n" // stacked LR
  44.         "LDR pc, [r2, #-4]!\t\n" // stacked PC
  45.     );
  46.    
  47.     // 打印硬故障信息
  48.     printf("Hard Fault!\n");
  49.    
  50.     // 挂起系统
  51.     while (1) {
  52.         // 无限循环
  53.     }
  54. }
复制代码
5.4 停止优先级和嵌套

ARM Cortex-M3 支持多个停止源,并且每个停止源都有一个优先级。NVIC 可以配置停止优先级,以便在多个停止同时发生时确定处置惩罚次序。别的,ARM Cortex-M3 还支持嵌套停止,即在处置惩罚一个停止时可以被更高优先级的停止打断。
5.4.1 停止优先级配置

停止优先级可以通过 NVIC 的停止优先级寄存器(IPR)进行配置。以下是一个配置停止优先级的示例:
  1. // 配置中断 0 的优先级为 1
  2. NVIC_SetPriority(IRQ0_IRQn, 1);
  3. // 配置中断 1 的优先级为 2
  4. NVIC_SetPriority(IRQ1_IRQn, 2);
复制代码
5.4.2 嵌套停止示例

  1. // 假设中断 0 的优先级高于中断 1
  2. // 中断 0 处理程序
  3. void IRQ0_Handler(void) {
  4.     // 处理中断 0
  5.     // 例如:读取某个 GPIO 引脚的状态
  6.     uint32_t gpio_status = LPC_GPIO0->FIOPIN;
  7.    
  8.     // 根据 GPIO 状态进行相应处理
  9.     if (gpio_status & (1 << 0)) {
  10.         // 引脚 0 高电平
  11.         // 执行相应操作
  12.     } else {
  13.         // 引脚 0 低电平
  14.         // 执行相应操作
  15.     }
  16.    
  17.     // 清除中断标志
  18.     LPC_GPIO0->FIOPIN = 0x00;
  19. }
  20. // 中断 1 处理程序
  21. void IRQ1_Handler(void) {
  22.     // 处理中断 1
  23.     // 例如:读取某个 ADC 的值
  24.     uint32_t adc_value = LPC_ADC->ADGDR;
  25.    
  26.     // 根据 ADC 值进行相应处理
  27.     if (adc_value > 1000) {
  28.         // 执行相应操作
  29.     } else {
  30.         // 执行相应操作
  31.     }
  32.    
  33.     // 清除中断标志
  34.     LPC_ADC->ADGDR = 0x00;
  35. }
复制代码
在上述示例中,假如停止 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 接口进行调试的示例:
  1. #include <stdio.h>
  2. #include "LPC17xx.h"
  3. int main(void) {
  4.     // 初始化 GPIO
  5.     LPC_PINCON->PINSEL0 &= ~(0x3 << 0);  // 设置 P0.0 为 GPIO 功能
  6.     LPC_GPIO0->FIOSET = (1 << 0);        // 设置 P0.0 为高电平
  7.     LPC_GPIO0->FIODIR = (1 << 0);        // 设置 P0.0 为输出
  8.     while (1) {
  9.         // 翻转 P0.0 引脚的状态
  10.         LPC_GPIO0->FIOSET = (1 << 0);
  11.         for (volatile int i = 0; i < 1000000; i++) {
  12.             // 延时
  13.         }
  14.         LPC_GPIO0->FIOCLR = (1 << 0);
  15.         for (volatile int i = 0; i < 1000000; i++) {
  16.             // 延时
  17.         }
  18.         
  19.         // 设置断点
  20.         __asm volatile ("bkpt #0");
  21.     }
  22.    
  23.     return 0;
  24. }
复制代码
6.4 调试工具

常用的调试工具包括:

7. 总结

ARM Cortex-M3 架构具有高性能、低功耗和高可靠性的特点,恰当应用于各种嵌入式系统。本节详细介绍了 ARM Cortex-M3 的内部布局、流水线操作、寄存器配置、停止处置惩罚和调试支持,为后续的学习和开发提供了坚固的基础。
7.1 内部布局回首

ARM Cortex-M3 的内部布局包括:

7.2 流水线操作回首

流水线操作分为三个阶段:

7.3 寄存器配置回首

寄存器配置包括:

7.4 存储器访问回首

存储器访问包括:

7.5 停止处置惩罚回首

停止处置惩罚包括:

7.6 调试支持回首

调试支持包括:

通过以上内容,我们对 ARM Cortex-M3 架构有了全面的相识。渴望这些信息可以或许帮助你在嵌入式系统开发中更好地使用 ARM Cortex-M3 的上风。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4