MSP430 CPUX指令集与ICC中断控制器实战解析

发布时间:2026/6/30 9:05:29

MSP430 CPUX指令集与ICC中断控制器实战解析 1. 项目概述从指令到中断深入MSP430的CPUX与ICC如果你正在或打算深入玩转德州仪器TI的MSP430系列微控制器特别是那些带有CPUX内核和中断比较控制器ICC的型号那么你迟早会碰到这两个核心话题CPUX的20位地址指令集以及ICC带来的硬件嵌套中断能力。官方数据手册和用户指南提供了最权威的说明但动辄数百页的文档以及其中高度浓缩的技术描述常常让开发者尤其是刚接触这一架构的朋友感到无从下手。指令集那一串串的助记符、操作码和状态位变化中断控制器里那些优先级比较、虚拟堆栈的概念乍一看确实有些抽象。我自己在多个低功耗传感和电池供电项目中重度使用MSP430从早期的MSP430F5xx系列到后来支持CPUX和ICC的MSP430FRxx系列踩过不少坑也积累了一些让代码跑得更稳、更高效的心得。这篇文章我就想抛开那些照本宣科的翻译结合我实际的调试和编程经验和你一起把CPUX指令集和ICC中断控制器给“盘”明白。我们会从“为什么要用20位地址”这样的设计初衷聊起到每条关键指令在真实编程场景下的“活学活用”再到如何配置ICC来实现一个既可靠又高效的中断响应系统。目标很明确让你看完之后不仅能看懂手册更能写出更优、更健壮的嵌入式代码。2. CPUX指令集深度解析与实战应用MSP430的CPUX内核是对经典MSP430 CPU的增强其最显著的特征就是扩展了地址总线至20位从而能够直接寻址高达1MB的地址空间。这不仅仅是地址线多了几根那么简单它带来了一整套新的地址指令后缀带.A的指令以及与之配套的寻址模式。理解这些是发挥CPUX性能优势的基础。2.1 20位地址架构的设计逻辑与寻址模式为什么是20位而不是更常见的32位这背后是MSP430一贯坚持的超低功耗与成本平衡哲学。对于绝大多数嵌入式应用尤其是MSP430主打的传感、监控、便携设备领域1MB的寻址空间已经绰绰有余。扩展到32位意味着所有地址指针、相关指令的操作数都要翻倍这会直接增加代码尺寸占用更多的Flash和指令执行周期存取更多数据进而影响功耗。20位是一个精妙的折中在显著扩大寻址能力从64KB到1MB的同时对芯片面积和功耗的影响控制在可接受范围内。CPUX为此引入了一套完整的20位地址操作指令例如MOVA、ADDA、CMPA等。它们操作的是20位的地址寄存器如PC、SP或通用寄存器当用作地址指针时。与之对应传统的16位数据操作指令如MOV、ADD、CMP依然保留用于处理常规数据。这种区分让编译器和我们编程者能更精细地控制代码生成。寻址模式是CPUX指令集灵活性的核心。它支持7种源寻址模式和4种目的寻址模式我挑几个在嵌入式编程中最常用、也最容易出错的详细说说寄存器模式MOVA R5, R6。这是最快的方式直接在寄存器间移动20位数据。常用于函数调用前保存寄存器、或快速交换指针值。立即数模式MOVA #0x12345, R5。将20位常数直接加载到寄存器。这里要注意虽然指令操作数是20位但#imm20这个立即数在指令编码中可能被拆分存放执行时需要CPU内部进行组合。在时间要求极其苛刻的循环中如果可能考虑将常量预先加载到寄存器中而不是每次循环都使用立即数模式。符号模式相对PC寻址MOVA EDE, R5。这里的EDE是一个标号。CPU会计算当前程序计数器PC到标号EDE所在地址的偏移量16位有符号范围±32KB然后用PC 偏移量得到源数据的地址再从中取出20位数据。这是访问全局变量或常量的高效方式但要注意范围限制。绝对模式MOVA EDE, R5。使用20位的绝对地址EDE直接寻址。它可以访问1MB空间内的任何地址没有范围限制但指令编码更长。适合访问固定地址的硬件寄存器如外设控制寄存器。间接寄存器模式MOVA R5, R6。将R5寄存器中的值作为一个20位地址从这个地址指向的内存中取出数据。这是处理指针和数据结构如链表的基础。间接自增模式MOVA R5, R6。在完成数据传送后R5中的地址自动增加对于.A指令增加4因为取的是20位数据占2个字。这在遍历数组或缓冲区时极其高效省去了显式的指针递增操作。变址模式MOVA 100(R5), R6。有效地址 R5 100。这里的偏移量100是16位有符号数。这是访问结构体成员或局部数组元素的典型方式。如果偏移量超过16位范围需要使用扩展的变址指令如MOVX.A。实操心得在编写对性能敏感的中断服务程序或实时控制循环时优先选择寄存器模式和间接自增模式。绝对模式和符号模式在访问外设寄存器或全局变量时很方便但要注意其生成的代码大小。一个常见的优化是在循环开始前用MOVA将数组基地址或外设寄存器地址加载到一个寄存器中在循环内使用寄存器间接或变址模式进行访问可以显著提升速度。2.2 关键指令详解与状态位影响官方手册列出了所有指令我们聚焦在最能体现CPUX特性以及编程中至关重要的几条上。2.2.1 数据传送指令MOVAMOVA是20位地址空间的“搬运工”。它的灵活之处在于支持所有7种源寻址模式和多种目的寻址模式。MOVA #0x1A000, SP ; 初始化堆栈指针到20位地址 MOVA ADC12MEM0, R5 ; 从ADC结果寄存器绝对地址读取数据到R5 MOVA R4, R5 ; 从R4指向的地址读取20位数据到R5然后R4自增4用于从缓冲区连续读取 MOVA R5, 0(R6) ; 将R5的值存储到以R6为基址、偏移为0的内存处状态位影响MOVA指令不影响任何状态位N, Z, C, V。这是一个非常重要的特性意味着你可以在不破坏当前比较或算术运算结果的情况下安全地移动指针或地址数据。2.2.2 算术运算指令ADDA 与 SUBAADDA和SUBA用于20位地址或数据的加减。一个典型应用是计算地址偏移。; 假设R5指向一个结构体基址需要访问其内部偏移0x100的成员 ADDA #0x100, R5 ; R5 R5 0x100 ; ... 使用R5访问成员 SUBA #0x100, R5 ; 恢复R5到原基址以便后续使用状态位影响这两条指令会更新N, Z, C, V状态位。C进位和V溢出位对于20位无符号数和有符号数的边界检查非常有用。例如在实现一个20位的循环缓冲区时可以用ADDA后检查C位来判断是否发生了地址回绕。2.2.3 比较与测试指令CMPA 与 TSTACMPA用于比较两个20位操作数它执行Rdst - Rsrc操作但只更新状态位不改变操作数本身。TSTA则是CMPA #0, Rdst的简化版专门用于测试一个寄存器是否为0或负数。CMPA #0x20000, R5 ; 比较R5是否等于0x20000 JHS above_or_equal ; 如果无符号数 R5 0x20000则跳转利用C位 JL less_than ; 如果有符号数 R5 0x20000则跳转利用N和V位 TSTA R6 ; 测试R6 JZ r6_is_zero ; 如果R6为0跳转 JN r6_is_negative ; 如果R6为负最高位为1跳转状态位影响CMPA根据减法结果设置所有状态位。TSTA专门用于测试其C位总是被置位V位总是被清除N和Z位则真实反映目标寄存器的值。2.2.4 程序流控制指令BRA, CALLA, RETA这是控制程序“跳转”和“调用”的核心。BRA无条件跳转。它直接将目标地址加载到PC。由于PC是20位所以可以跳转到1MB空间内的任何地方。它模拟了MOVA dst, PC。CALLA调用子程序。它比BRA复杂因为需要保存返回地址。具体操作是先将目标地址暂存然后将当前PC返回地址压入堆栈先压入高4位再压入低16位最后将暂存的目标地址送入PC。这里的关键是它使用20位地址所以返回地址也是20位需要占用堆栈的2个字4个字节。RETA从子程序返回。它从堆栈中弹出返回地址先弹出低16位到PC.15:0再弹出高4位到PC.19:16然后恢复PC。它与CALLA严格配对。MainLoop: ... CALLA #Delay_ms ; 调用一个延时子程序位于1MB空间内的某个地址 ... BRA MainLoop ; 无限循环 Delay_ms: PUSHM.A #1, R10 ; 保存R1020位注意入栈顺序 ... ; 延时逻辑 POPM.A #1, R10 ; 恢复R10 RETA ; 返回到CALLA之后的下一条指令注意事项混合使用16位调用CALL和20位调用CALLA是危险的。CALL只压入16位返回地址占用1个字而RETA期望弹出20位地址2个字这会导致堆栈错乱程序必然跑飞。同样用RET返回CALLA也不行。在纯CPUX环境下建议统一使用CALLA/RETA对。编译器如TI的CCS或IAR在生成代码时会自动处理这些。2.3 状态寄存器SR与模式位状态寄存器SR中的标志位N, Z, C, V是条件跳转指令如JEQ,JNE,JC,JNC等的决策依据。CPUX指令集中算术和逻辑运算指令会更新它们而数据移动指令通常不会。除了状态位SR中还有几个至关重要的模式位SCG1, SCG0系统时钟发生器控制位用于控制某些时钟模块的开关与低功耗模式相关。OSCOFF关闭晶振。当置位时进入最低功耗模式LPM4。CPUOFF关闭CPU核心。这是进入低功耗模式如LPM0, LPM1, LPM2的关键位。GIE全局中断使能。这是中断系统的总开关。在讨论ICC时这个位的行为至关重要。在CALLA和RETA执行时这些模式位包括GIE不会被自动保存或恢复。这意味着如果你在子程序中修改了GIE位返回后主程序的GIE状态就改变了。这是与某些其他架构如ARM Cortex-M自动保存恢复PSR不同的一点需要程序员特别注意。通常在中断服务程序ISR中硬件会在进入时自动清除GIE在RETI执行时恢复。但对于普通的CALLA/RETA则需要软件自己管理。3. 中断比较控制器ICC原理与配置实战如果说CPUX指令集是“肌肉”决定了能做什么动作那么中断比较控制器ICC就是“神经系统”决定了如何快速、有序地响应外部事件。对于实时嵌入式系统一个高效、可预测的中断管理系统是灵魂。3.1 嵌套中断 vs. 非嵌套中断为什么需要ICC在没有ICC或ICC被禁用的传统MSP430上中断处理是“非嵌套”或“软件管理嵌套”的。当CPU响应一个中断ISR1时GIE位被硬件自动清零以防止其他中断打断当前ISR。如果此时一个更紧急的中断ISR2发生它只能等待直到ISR1执行完毕、RETI指令恢复GIE后才能被响应。即使ISR2的优先级在向量表中更高也无济于事。这就导致了高优先级中断的响应延迟在最坏情况下等于当前低优先级ISR的执行时间。为了允许高优先级中断抢占低优先级中断即“嵌套”程序员必须在低优先级ISR的开头手动用EINT或BIS #GIE, SR指令重新打开GIE。但这带来了风险如果此时有同级或更低优先级的中断发生也会被响应导致中断嵌套混乱甚至堆栈溢出。管理这种软件嵌套非常复杂且容易出错。ICC的引入就是为了用硬件解决这个问题。它提供了基于优先级的、自动的硬件嵌套中断支持。3.2 ICC核心工作机制优先级、比较与虚拟堆栈ICC的工作原理可以概括为三个核心步骤优先级设置、优先级比较、虚拟堆栈管理。3.2.1 中断优先级设置ILSRx寄存器ICC为每个可屏蔽中断源最多64个分配了一个2位的软件优先级通过一系列ICCILSRx寄存器Interrupt Level Setting Register来配置。优先级从0最高到3最低。上电复位后所有中断默认优先级为3。例如你的系统中有定时器A0中断向量号高默认硬件优先级高用于数据采样要求实时性极高。串口UART接收中断向量号较低用于接收命令实时性要求一般。看门狗定时器中断向量号最低用于系统复位优先级最高。你可以通过配置ILSR寄存器将定时器A0中断的软件优先级设为0最高将看门狗中断也设为0但硬件向量表优先级可能决定谁更优先将UART中断设为2。这样即使CPU正在处理UART中断优先级2定时器A0中断优先级0也能立即抢占它。3.2.2 中断优先级比较ICMC与比较逻辑ICC内部维护着一个当前中断比较掩码ICMC它存储在ICCSC寄存器中。ICMC代表了当前正在服务的中断或主程序其优先级视为3的优先级水平。当一个中断请求发生时ICC会执行以下比较取出该中断源在ILSRx中配置的软件优先级假设为P_new。将P_new与当前的ICMC值P_current进行比较。核心规则只有当P_newP_current即新中断的优先级数值更小因为0最高3最低时该中断请求才会被提交给CPU。如果P_newP_current则该中断保持挂起状态。这个比较逻辑是硬件实时完成的确保了高优先级中断能立即抢占低优先级中断而低优先级或同优先级中断则无法打断当前服务。3.2.3 虚拟堆栈Virtual Stack管理“虚拟堆栈”是ICC实现嵌套的关键数据结构。但它不是传统意义上在RAM里的数据堆栈而是一个硬件管理的、深度为4级对应4个优先级的“优先级记录栈”。其工作流程如下压栈Push当一个中断请求被ICC批准提交给CPU时该中断的优先级值来自ILSRx会被自动压入这个虚拟堆栈。同时堆栈指针MVSSP加1并且ICMC被更新为这个新压入的优先级值即新的当前优先级。弹栈Pop当该中断服务程序执行完毕CPU执行RETI指令时虚拟堆栈会自动弹出一级。堆栈指针MVSSP减1ICMC被恢复为之前保存的优先级值。这个机制完美地记录了中断嵌套的层次。例如主程序ICMC3中发生优先级1的中断则压入1ICMC1。在处理该中断时发生优先级0的中断则压入0ICMC0。优先级0的ISR执行RETI后弹出0ICMC恢复为1。优先级1的ISR执行RETI后弹出1ICMC恢复为3主程序。ICCSC寄存器中的VSFFLG堆栈满和VSEFLG堆栈空标志位用于指示虚拟堆栈的状态。当嵌套深度超过4层时VSFFLG会置位此时新的更高优先级中断也无法被响应直到有ISR返回腾出空间。这防止了无限嵌套导致的系统锁死。3.3 ICC配置与使用指南理解了原理配置和使用ICC就清晰了。以下是基于官方推荐流程的详细步骤和代码示例。3.3.1 初始化与启用ICC启用ICC必须在完全掌控中断环境的情况下进行通常在主程序初始化阶段、使能任何外设中断之前完成。// ICC 初始化函数 void ICC_Init(void) { // 第一步禁用全局中断防止在配置过程中被意外打断 __bic_SR_register(GIE); // 第二步根据应用需求配置各个中断源的软件优先级。 // 假设Timer0_A0中断向量表优先级高我们设为最高软件优先级0 // UART0 RX中断设为优先级1 // ADC12中断设为优先级2 // 其他默认优先级3最低 // 需要查阅具体器件的数据手册找到每个中断源对应ILSR寄存器中的位域。 // 例如假设Timer0_A0中断由ICCILSR0的[1:0]位控制 ICCILSR0 (ICCILSR0 ~0x0003) | 0x0000; // 设置为优先级 0b00 // 假设UART0 RX中断由ICCILSR1的[5:4]位控制 ICCILSR1 (ICCILSR1 ~0x0030) | 0x0010; // 设置为优先级 0b01 // 假设ADC12中断由ICCILSR2的[9:8]位控制 ICCILSR2 (ICCILSR2 ~0x0300) | 0x0200; // 设置为优先级 0b10 // 注意未配置的位保持默认值0b11优先级3。 // 第三步使能ICC模块 ICCSC | ICCEN; // 设置ICCEN位 // 第四步重新使能全局中断系统开始响应中断 __bis_SR_register(GIE); }注意事项配置ILSRx寄存器时务必使用“读-修改-写”操作如上例中的 ~和|避免覆盖其他无关中断的优先级设置。一定要查阅你所用具体型号的数据手册以确定每个中断源对应哪个ILSR寄存器的哪几位。不同型号的MSP430外设中断映射可能不同。3.3.2 编写支持ICC的中断服务程序ISR启用ICC后ISR的写法有一个关键变化必须在ISR开头重新使能全局中断GIE。;---------------------------------------------------------------------------- ; Timer0_A0 CCR0 中断服务程序 (高优先级) ;---------------------------------------------------------------------------- TIMER0_A0_ISR: BIC.W #CCIFG, TA0CCTL0 ; 清除定时器中断标志 BIS #GIE, SR ; *** 关键步骤重新使能全局中断允许更高优先级中断嵌套 *** ... ; 中断处理代码可能被更高优先级中断抢占 RETI ; 中断返回硬件会自动恢复GIE和弹出虚拟堆栈为什么需要手动打开GIE因为CPU在进入任何可屏蔽中断时硬件会自动清除GIE位以防止中断重入。在ICC启用的情况下我们需要依靠ICC的硬件优先级比较逻辑来管理嵌套而不是简单地屏蔽所有中断。因此在清除了本中断的标志位后应立即用BIS #GIE, SR重新打开GIE。这样如果有一个优先级更高的中断发生ICC会比较优先级并允许其抢占当前ISR。3.3.3 禁用ICC在某些特殊情况下你可能需要临时禁用ICC例如进行某些需要绝对原子性的关键操作。操作流程与启用类似。void ICC_Disable(void) { __bic_SR_register(GIE); // 先关全局中断 ICCSC ~ICCEN; // 禁用ICC模块 __bis_SR_register(GIE); // 重新打开全局中断此时为传统非嵌套模式 }重要提醒官方强烈建议启用或禁用ICC的操作只能在主循环或由主循环调用的函数中进行绝对不要在中断服务程序内部进行ICCEN位的切换。因为这会改变整个中断系统的运行机制可能导致不可预测的行为比如虚拟堆栈状态与实际中断嵌套不匹配。3.4 ICC应用场景与性能考量适用场景实时控制系统例如电机控制、数字电源。其中过流保护中断最高优先级必须能立即抢占速度环计算中断中优先级而速度环中断又能抢占通信中断低优先级。多任务传感系统一个传感器需要高频采样定时器中断高优先级另一个传感器数据可以稍后处理ADC中断中优先级同时系统还需要响应用户输入GPIO中断低优先级。ICC确保了采样周期的严格定时不被其他任务破坏。低功耗且需快速响应的应用设备大部分时间处于低功耗模式LPM3。当高优先级中断如唤醒信号到来时ICC确保它能被立即响应快速处理事件后返回低功耗模式最大化节能效果。性能与功耗影响额外延迟当ICC启用时从低功耗模式LPM3/LPM4唤醒到开始执行中断服务的第一条指令会有额外的5-6个时钟周期延迟。这是因为硬件需要恢复ICC的内部状态。在32kHz的低速时钟下这几个周期微乎其微但在16MHz的高速时钟下也需要约0.3-0.4微秒在极端时间约束的应用中需要考虑。LPMx.5模式ICC在超低功耗的LPMx.5模式如FRAM器件的关断模式下不工作。因为该模式下几乎所有数字模块都已掉电。从LPMx.5唤醒相当于一次软复位ICC状态会被初始化。资源消耗ICC是硬件模块其优先级比较和虚拟堆栈管理不消耗CPU周期也不占用额外的RAM空间作为堆栈这是相比软件实现嵌套中断的巨大优势。4. 常见问题、调试技巧与实战避坑指南理论最终要服务于实践。下面是我在项目中使用CPUX和ICC时遇到的一些典型问题及解决方法。4.1 指令集使用常见问题问题1程序在调用子程序或中断返回后跑飞。可能原因最可能的原因是调用与返回指令不匹配。在CPUX环境下20位地址必须使用CALLA调用RETA返回。如果错误地使用了16位的CALL和RET或者混合使用会导致堆栈指针错乱返回地址错误。排查方法检查编译器设置。确保项目配置是针对支持CPUX的器件如MSP430FR5994。在汇编代码中坚持使用.A后缀的指令进行地址操作。在C代码中编译器通常会处理好这一切但如果你写了汇编ISR务必使用RETA。问题2使用MOVA Rn, Rd指令后指针递增的值不符合预期。可能原因.A指令操作的是20位数据在内存中占用4个字节即2个字。因此间接自增模式Rn会使Rn增加4而不是2。如果你把它当作16位数据指针来用就会出错。解决方案对于20位地址或数据缓冲区使用Rn并理解其增4。对于16位数据缓冲区应使用非.A指令如MOV Rn, Rd它会增2。问题3条件跳转判断逻辑出错。可能原因错误理解了状态位或使用了不正确的跳转指令。例如CMPA之后对于无符号数比较应使用JLO低于、JHS高于或等于对于有符号数比较应使用JL小于、JGE大于或等于。TSTA指令后C位总是1V位总是0不要用JC/JNC做判断。调试技巧在仿真器中单步执行仔细观察SR寄存器的值在关键指令执行后的变化并与预期进行对比。4.2 ICC配置与中断相关故障问题1高优先级中断无法抢占低优先级中断。检查清单ICC是否已使能确认ICCSC寄存器的ICCEN位为1。GIE在低优先级ISR中是否重新打开检查低优先级ISR开头在清除自身中断标志后是否有BIS #GIE, SR或EINT语句。优先级设置是否正确确认高优先级中断的ILSRx值数值是否小于低优先级中断的ILSRx值0最高3最低。用调试器读取ICCILSRx寄存器验证。中断标志是否及时清除确保高优先级中断的中断标志在其ISR中被清除否则会不断重复触发。问题2系统偶尔死锁或行为异常尤其是在频繁中断嵌套时。可能原因虚拟堆栈溢出。ICC的虚拟堆栈只有4级深度。如果中断嵌套超过了4层例如优先级0中断中又发生了优先级0中断这通常源于中断标志未清除导致的重复进入VSFFLG会置位新的中断无法被响应可能造成系统看起来“死锁”。排查方法在调试器中监控ICCSC寄存器。如果VSFFLG位为1说明堆栈已满。需要检查中断服务程序 * 是否每个ISR都正确清除了其外设的中断标志 * 是否存在中断优先级循环依赖或配置错误 * 中断服务时间是否过长导致同一中断频繁发生预防措施合理设计中断优先级避免不必要的深层嵌套。对于最频繁发生的中断可以适当降低其优先级或者优化其ISR代码使其执行时间尽可能短。问题3从低功耗模式唤醒后中断响应变慢或优先级错乱。可能原因如手册所述当ICC启用时从LPM3/LPM4退出会有额外时钟延迟。此外如果进入LPMx.5模式ICC状态会丢失唤醒后需要重新初始化。解决方案在时间要求极其苛刻的应用中将这额外的几个时钟周期计入你的唤醒响应时间预算。如果使用了LPMx.5模式在唤醒后的初始化代码中必须重新配置ICCILSRx寄存器和使能ICCEN。问题4在C语言环境中如何配置ICC解决方案TI的编译器工具链如CCS with TI Clang Compiler或IAR Embedded Workbench通常提供了对MSP430硬件的良好支持。你可以通过以下方式操作ICC寄存器#include msp430.h // 包含器件特定头文件 void initICC(void) { __disable_interrupt(); // 相当于 __bic_SR_register(GIE) // 直接操作寄存器这些宏定义在头文件中 ICCILSR0 ...; // 设置优先级 ICCSC | ICCEN; // 使能ICC __enable_interrupt(); // 相当于 __bis_SR_register(GIE) }在C语言ISR中编译器生成的代码框架通常会处理好现场保存。你只需要确保在ISR函数中编译器没有优化掉对GIE的重新使能操作。对于用#pragma vector或__interrupt关键字声明的ISR编译器可能会生成包含EINT的入口代码具体需查看编译器文档。为了保险起见可以在ISR开始处显式调用__enable_interrupt()。4.3 综合调试建议善用仿真器像TI的MSP-FET或MSP-FR5994 LaunchPad自带的仿真器配合CCS或IAR的调试环境可以设置硬件断点、单步执行、实时查看和修改所有寄存器包括CPU寄存器和外设寄存器以及ICC的ICCSC、ICCMVS、ICCILSRx这是理解指令执行和中断流程最直观的方式。从简单开始先在一个简单的工程中测试ICC。例如配置两个定时器中断赋予不同的优先级在各自的ISR中翻转不同的GPIO引脚用示波器观察波形直观地验证高优先级中断是否能抢占低优先级中断。关注堆栈虽然ICC使用虚拟堆栈管理优先级但中断发生时PC、SR以及你可能在ISR中使用的寄存器仍然会被压入硬件堆栈在RAM中。确保你的系统有足够的栈空间通过修改链接器脚本中的栈大小定义来应对最深的中断嵌套情况防止栈溢出破坏数据。阅读数据手册这永远是第一准则。本文和官方用户指南SLAU445I是重要的参考资料但具体到某一个芯片型号其外设中断向量号、ILSR寄存器的位域映射必须查阅该型号的数据手册Datasheet。

相关新闻