精华内容
下载资源
问答
  • 关于C51的IE(中断使能寄存器)的初级认识
    千次阅读
    2016-07-28 22:21:52

    这里写图片描述


    对于C51中的IE的初级认识

    更多相关内容
  • 2. CPRS 寄存器中的中断控制位 (1) CPRS 寄存器位 3. (1) CPRS 寄存器位 一. 中断控制 ( 基于 S3C6410 开发板 ) 本节 基于 S3C 6410 开发板, 不同的开发板 以及 不同 的芯片 中断控制机制是.....


    本博客的参考文章及相关资料下载 :




    一. 中断控制 ( 基于 S3C6410 开发板 )


    本节 基于 S3C 6410 开发板, 不同的开发板 以及 不同 的芯片 中断控制机制是不同的 ;


    1. 关闭中断的两个步骤


    (1) 关闭中断步骤


    关闭中断步骤 :

    • 1.步骤 1 ( 程序状态字寄存器设置 ) : 设置 程序状态字寄存器 ( CPSR ) 中对应的与 中断 相关的位;
    • 2.步骤 2 ( 中断屏蔽寄存器设置 ) : 设置 中断屏蔽寄存器, 该寄存器的 使用方法在开发板芯片资料中有详细介绍;


    2. CPRS 寄存器中的中断控制位


    (1) CPRS 寄存器简介


    程序状态字寄存器 :

    这里写图片描述

    • 1.寄存器内容 : 该寄存器 中 包含 ① 状态码标志位, ② 中断标志位, ③ 当前处理器工作模式 和 其它一些 ④ 状态⑤ 控制信息 ;
    • 2.CPSR 寄存器 : 全称 Current Program Status Register ( 当前程序状态字寄存器 ), 保存的是当前的程序状态 ;
    • 3.SPSR 寄存器 : 全称 Saved Program Status Register ( 程序状态保存寄存器 ), 每个异常都有对应的独立的 SPSR 寄存器, 当异常发生的时候, 先将 CPSR 寄存器中的值 保存到 SPSR 寄存器中, 以便 异常处理完毕后 再回到原来断点处 继续运行 ;
      这里写图片描述
    • 4.SPSR 寄存器分布 : 用户模式 和 系统模式 没有 对应的 SPSR 寄存器, 只有 5 种 异常模式才有对应的 SPSR 寄存器 ;
      • ( 1 ) SPSR 寄存器读写 : 在 用户模式 或 系统模式 读写 SPSR 指令 会出现不可预测的错误或行为 ;


    (2) CPRS 寄存器 中断控制 相关 位


    CPRS 寄存器中断控制相关位 :

    这里写图片描述

    • 1.普通中断控制位 : I 位, 第 [ 7 ] 位, 如果设置了该位 可以 关闭 普通中断 ;
    • 2.快速中断控制位 : F 位, 第 [ 6 ] 位, 如果设置了该位, 可以 关闭 快速中断 ;


    3. 中断使能寄存器


    参考手册 : S3C6410X.pdf ( 基于 6410 开发板 )


    (1) 中断使能寄存器简介


    中断使能寄存器 ( VICINTENABLE ) :

    • 1.分为两个寄存器 : 中断使能寄存器 分 两个寄存器 控制所有的中断打开功能;
      • ( 1 ) 寄存器1 VIC0INTENABLE : 其地址是 0x71200010 ;
      • ( 2 ) 寄存器2 VIC1INTENABLE : 其地址是 0x71300010 ;
        这里写图片描述
    • 2.寄存器位 : 这两个寄存器中, 每一位都对应着一种中断源;
    • 3.中断关闭情况 :重启的时候, 所有的中断都要被禁用 ;
    • 4.寄存器功能 : 激活中断的请求线路, 允许中断信号能到达 处理器 ; 查看对应位的设置, 可以获取某种类型的中断是否可以到达 处理器 ;
      • ( 1 ) 读取到 0 值 : 如果读取到的值 为 0, 那么 中断不可用;
      • ( 1 ) 读取到 1 值 : 如果读取到的值 为 1, 那么 中断可用;
    • 5.设置寄存器值 : 这两个寄存器 只能设置中断可以使用, 无法设置 屏蔽 中断, 如果设置 1 那么激活中断, 设置 0 没有任何效果, 如果要屏蔽中断, 那么需要使用 中断屏蔽寄存器 VICINTENCLEAR;
      • ( 1 ) 设置 0 值 : 设置 0 值 没有任何效果;
      • ( 2 ) 设置 1 值 : 设置 1 值 激活中断功能;

    这里写图片描述



    (2) 中断屏蔽寄存器简介


    中断屏蔽寄存器 ( VICINTENCLEAR ) 简介 :

    • 1.分为两个寄存器 : 中断 屏蔽 寄存器 分 两个寄存器 控制所有的中断 屏蔽 的功能;
      • ( 1 ) 寄存器1 VIC0INTENABLE : 其地址是 0x71200010 ;
      • ( 2 ) 寄存器2 VIC1INTENABLE : 其地址是 0x71300010 ;

    这里写图片描述

    • 2.寄存器位 : 这两个寄存器中, 每一位都对应着一种中断源;
    • 3.功能概述 : 清除 中断屏蔽寄存器 ( VICINTENABLE ) 中 对应的位就可以屏蔽对应的中断 ;
      • ( 1 ) 设置 0 值 : 没有任何效果 ;
      • ( 2 ) 设置 1 值 : 屏蔽对应的中断源 ;






    二. 关闭中断 代码示例


    参考手册 : S3C6410X.pdf ( 基于 6410 开发板 )


    1. 汇编代码编写


    (1) 设置 CPRS 程序状态字寄存器


    CPRS 设置 值 分析 : 该寄存器需要考虑两个方面, ① 设置处理器的 SVC 工作模式, ② 关闭中断 ;

    • 1.SVC 模式设置 : SVC 模式需要将 CPRS 的 M [ 4 : 0 ] 位 设置为 指定的 0b10011 值;
    • 2.普通中断设置 : 关闭 普通中断, 需要将 CPRS 的 I [ 7 ] 位 设置为 1;
    • 3.快速中断设置 : 关闭 快速中断, 需要将 CPRS 的 F [ 6 ] 位 设置为 1;
    • 4.最后向 CPRS 寄存器设置的值 : 最终值为 0b11010011, 其中 0 ~ 5 位 的 0b10011 设置的是 SVC 工作模式, 0b11000000 设置 I 和 F 位 为 1, 这样同时设置了 处理器的 SVC 工作模式 和 关闭了 普通中断 和 快速中断 ;


    (2) 设置 CPRS 程序状态字寄存器 代码逻辑分析


    代码 逻辑 分析 : 之前 设置 处理器工作模式时 有涉及到 CPRS 寄存器设置, 在这里将关闭中断的操作也一并设置了;

    • 1.设置 CPRS 寄存器 时机 : 进行 处理器工作模式 设置 是在 开发板上电后, 对应的 reset 异常向量处;
    • 2.设置 指令标号 : 设置一个指令标号, 在标号下定义一组汇编指令, 当需要执行这一组指令的时候, 在跳转到该标号即可;
      • ( 1 ) 定义标号 : set_svc :, 在标号下定义一组汇编指令;
    • 3.导出 CPSR 寄存器值 : 使用 MRS 指令, 即 mrs r0 cpsr 将 CPSR 寄存器中的值导出到 R0 寄存器中;
    • 4.将 R0 中的 M 位 清 0 : 在 R0 中将从 CPSR 中导出的寄存器值 对应的 0 ~ 4 位 清0, 使用 bic r0, r0, #0x1f, 将 R0 寄存器的值 与 #0x1f 进行 与操作, 即 后5 位都设置成0, 然后将 与 操作的结果保存到 R0 寄存器中 ;
    • 5.将 R0 中的 M 位 设置 模式代码 : 在下图中, svc 的模式代码时 0b10011 ( 二进制 ), 即 0x13 ( 十六进制 ), 同时关闭 普通中断 和 快速中断, 最终设置值为 0b11010011, 即 0xd3, 使用 orr r0, r0, #0xd3 语句设置, 将 R0 寄存器中的值 与 0x13 进行 或操作, 将 或操作的结果 存放到 R0 寄存器中;
      这里写图片描述
    • 6.将值写回 CPSR 寄存器 : 使用 MSR 指令 msr cpsr, r0 , 将处理完的 CPSR 寄存器值 设置给 CPSR 寄存器;


    (3) 设置 中断屏蔽寄存器 代码逻辑分析



    设置 中断屏蔽 寄存器 汇编代码分析 :

    • 1.设置 中断屏蔽 寄存器 时机 : 进行 关闭中断 设置 是在 开发板上电后, 对应的 reset 异常向量处, 因此 在 reset 处 执行相关的 关闭 中断 的代码 ;
    • 2.设置 指令标号 : 设置一个指令标号, 在标号下定义一组汇编指令, 当需要执行这一组指令的时候, 在跳转到该标号即可, 代码 disable_interrupt :, 然后 在 reset 处, 跳转到 该标号处执行 , bl disable_interrupt ;
    • 3.准备 所有位都是 1 数据 : mvn r1, #0x0, 将 0 按位取反 设置到 r1 通用寄存器中;
      • ( 1 ) 取反指令 : MVN 指令, 语法 MVN{条件}{S} <dest>, <op 1> , 将 操作数 1 的值先按位取反, 在将值设置到 dest 寄存器中 ;
      • ( 2 ) 指令说明 : dest 必须是寄存器, 操作数 1 ( op 1 ) 可以是 寄存器, 被移位的寄存器 或 立即数 ;
    • 4.设置第一个 中断屏蔽 寄存器 : ① 先将 寄存器 地址装载到 通用寄存器中, 代码 ldr r0, =0x71200014, ② 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中, 代码 str r1,[r0] ;
      • ( 1 ) ldr 指令语法 : LDR{条件} Rd, <地址>, 将内存中的数据装载到 寄存器 中, Rd 必须是通用寄存器,
      • ( 2 ) str 指令语法 : STR{条件} Rd, <地址>, 将寄存器中的数据 装载 到内存中; 将 Rd 寄存器的内容 装载到地址中;
      • ( 3 ) ldr 指令注意点 : 区分 ldr r0, =0x71200014ldr r0, 0x71200014, 前者是将 0x71200014 数值装载到寄存器中, 后者是将 0x71200014 地址中的内容装载到 r0 寄存器中 ;
    • 5.设置第二个 中断屏蔽寄存器 : ① 先将 寄存器 地址装载到 通用寄存器中, 代码 ldr r0, =0x71300014, ② 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中, 代码 str r1,[r0] ;
      • ( 1 ) ldr 指令语法 : LDR{条件} Rd, <地址>, 将内存中的数据装载到 寄存器 中, Rd 必须是通用寄存器,
      • ( 2 ) str 指令语法 : STR{条件} Rd, <地址>, 将寄存器中的数据 装载 到内存中; 将 Rd 寄存器的内容 装载到地址中;
      • ( 3 ) ldr 指令注意点 : 区分 ldr r0, =0x71200014ldr r0, 0x71200014, 前者是将 0x71300014 数值装载到寄存器中, 后者是将 0x71300014 地址中的内容装载到 r0 寄存器中 ;




    (4) 完整汇编代码示例



    汇编代码示例 : Bootloader 流程 : ① 初始化异常向量表 , ② 设置 svc 模式 , ③ 关闭看门狗, ④ 关闭中断 ;

    @****************************  
    @File:start.S  
    @  
    @BootLoader 初始化代码 
    @****************************  
    
    .text                                   @ 宏 指明代码段  
    .global _start                          @ 伪指令声明全局开始符号  
    _start:                                 @ 程序入口标志  
            b   reset                       @ reset 复位异常  
            ldr pc, _undefined_instruction  @ 未定义异常, 将 _undefined_instruction 值装载到 pc 指针中  
            ldr pc, _software_interrupt     @ 软中断异常  
            ldr pc, _prefetch_abort         @ 预取指令异常  
            ldr pc, _data_abort             @ 数据读取异常  
            ldr pc, _not_used               @ 占用 0x00000014 地址                            
            ldr pc, _irq                    @ 普通中断异常  
            ldr pc, _fiq                    @ 软中断异常  
    
    _undefined_instruction: .word undefined_instruction @ _undefined_instruction 标号存放了一个值, 该值是 32 位地址 undefined_instruction, undefined_instruction 是一个地址  
    _software_interrupt:    .word software_interrupt    @ 软中断异常  
    _prefetch_abort:    .word prefetch_abort            @ 预取指令异常 处理  
    _data_abort:        .word data_abort                @ 数据读取异常  
    _not_used:      .word not_used                      @ 空位处理  
    _irq:           .word irq                           @ 普通中断处理  
    _fiq:           .word fiq                           @ 快速中断处理  
    
    undefined_instruction:                              @ undefined_instruction 地址存放要执行的内容  
            nop  
    
    software_interrupt:                                 @ software_interrupt 地址存放要执行的内容  
            nop  
    
    prefetch_abort:                                     @ prefetch_abort 地址存放要执行的内容  
            nop  
    
    data_abort:                                         @ data_abort 地址存放要执行的内容  
            nop  
    
    not_used:                                           @ not_used 地址存放要执行的内容  
            nop  
    
    irq:                                                @ irq 地址存放要执行的内容  
            nop  
    
    fiq:                                                @ fiq 地址存放要执行的内容  
            nop  
    
    reset:                                              @ reset 地址存放要执行的内容  
            bl set_svc                                  @ 跳转到 set_svc 标号处执行
            bl disable_watchdog                         @ 跳转到 disable_watchdog 标号执行, 关闭看门狗
            bl disable_interrupt                        @ 跳转到 disable_interrupt 标号执行, 关闭中断
    
    set_svc:
            mrs r0, cpsr                                @ 将 CPSR 寄存器中的值 导出到 R0 寄存器中
            bic r0, r0, #0x1f                           @ 将 R0 寄存器中的值 与 #0x1f 立即数 进行与操作, 并将结果保存到 R0 寄存器中, 实际是将寄存器的 0 ~ 4 位 置 0
            orr r0, r0, #0xd3                           @ 将 R0 寄存器中的值 与 #0xd3 立即数 进行或操作, 并将结果保存到 R0 寄存器中, 实际是设置 0 ~ 4 位 寄存器值 的处理器工作模式代码
            msr cpsr, r0                                @ 将 R0 寄存器中的值 保存到 CPSR 寄存器中
    
    #define pWTCON 0x7e004000                           @ 定义看门狗控制寄存器 地址 ( 6410开发板 )
    disable_watchdog:                                 
            ldr r0, =pWTCON                             @ 先将控制寄存器地址保存到通用寄存器中
            mov r1, #0x0                                @ 准备一个 0 值, 看门狗控制寄存器都设置为0 , 即看门狗也关闭了
            str r1, [r0]                                @ 将 0 值 设置到 看门狗控制寄存器中 
    
    disable_interrupt:
        mvn r1,#0x0                                     @ 将 0x0 按位取反, 获取 全 1 的数据, 设置到 R1 寄存器中
        ldr r0,=0x71200014                              @ 设置第一个中断屏蔽寄存器, 先将 寄存器 地址装载到 通用寄存器 R0 中 
        str r1,[r0]                                     @ 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中
    
        ldr r0,=0x71300014                              @ 设置第二个中断屏蔽寄存器, 先将 寄存器 地址装载到 通用寄存器 R0 中 
        str r1,[r0]                                     @ 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中




    2. 链接器脚本


    gboot.lds 链接器脚本 代码解析 :

    • 1.指明输出格式 ( 处理器架构 ) : 使用 OUTPUT_ARCH(架构名称) 指明输出格式, 即处理器的架构, 这里是 arm 架构的, OUTPUT_ARCH(arm) ;
    • 2.指明输出程序的入口 : 设置编译输出的程序入口位置, 语法为 ENTRY(入口位置), 在上面的 Start.S 中设置的程序入口是 _start, 代码为 ENTRY(_start) ;
    • 3.设置代码段 : 使用 .text : 设置代码段;
    • 4.设置数据段 : 使用 .data : 设置数据段;
    • 5.设置 BSS 段 : 使用 .bss : 设置 BSS 段;
      • ( 1 ) 记录 BSS 段的起始地址 : bss_start = .; ;
      • ( 2 ) 记录 BSS 段的结束地址 : bss_end = .; ;
    • 6.对齐 : 每个段都需要设置内存的对齐格式, 使用 . = ALIGN(4); 设置四字节对齐即可;
    • 7.代码示例 :
    OUTPUT_ARCH(arm)        /*指明处理器结构*/  
    ENTRY(_start)           /*指明程序入口 在 _start 标号处*/  
    SECTIONS {                
        . = 0x50008000;     /*整个程序链接的起始位置, 根据开发板确定, 不同开发板地址不一致*/  
    
        . = ALIGN(4);       /*对齐处理, 每段开始之前进行 4 字节对齐*/  
        .text :             /*代码段*/  
        {  
        start.o (.text)     /*start.S 转化来的代码段*/  
        *(.text)            /*其它代码段*/  
        }  
    
        . = ALIGN(4);       /*对齐处理, 每段开始之前进行 4 字节对齐*/  
        .data :             /*数据段*/  
        {  
        *(.data)  
        }  
    
        . = ALIGN(4);       /*对齐处理, 每段开始之前进行 4 字节对齐*/  
        bss_start = .;      /*记录 bss 段起始位置*/  
        .bss :              /*bss 段*/  
        {  
        *(.bss)   
        }  
        bss_end = .;        /*记录 bss 段结束位置*/  
    } 




    3. Makefile 编译脚本


    makefile 文件编写 :

    • 1.通用规则 ( 汇编文件编译规则 ) : 汇编文件 编译 成同名的 .o 文件, 文件名称相同, 后缀不同, %.o : %.S, 产生过程是 arm-linux-gcc -g -c $^ , 其中 ^ 标识是所有的依赖文件, 在该规则下 start.S 会被变异成 start.o ;
    • 2.通用规则 ( C 文件编译规则 ) : C 代码编译成同名的 .o 文件, %.o : %.c , 产生过程是 arm-linux-gcc -g -c $^ ;
    • 3.设置最终目标 : 使用 all: 设置最终编译目标;
      • ( 1 ) 依赖文件 : 产生最终目标需要依赖 start.o 文件, 使用 all: start.o 表示最终目标需要依赖该文件;
      • ( 2 ) 链接过程 : arm-linux-ld -Tgboot.lds -o gboot.elf $^, 需要使用链接器脚本进行连接, ①链接工具是 arm-linux-ld 工具, ②使用 -Tgboot.lds 设置链接器脚本 是刚写的 gboot.lds 链接器脚本, ③输出文件是 gboot.elf 这是个中间文件, ④ 依赖文件是 $^ 代表所有的依赖;
      • ( 3 ) 转换成可执行二进制文件 : arm-linux-objcopy -O binary gboot.elf gboot.bin, 使用 -O binary 设置输出二进制文件, 依赖文件是 gboot.elf, 输出的可执行二进制文件 即 结果是 gboot.bin ;
    • 4.makefile 文件内容 :
    all: start.o #依赖于 start.o  
        arm-linux-ld -Tgboot.lds -o gboot.elf $^    #使用链接器脚本, 将 start.o 转为 gboot.elf  
        arm-linux-objcopy -O binary gboot.elf gboot.bin #将 gboot.elf 转化为可以直接在板子上执行的 gboot.bin 文件  
    
    %.o : %.S   #通用规则, 如 start.o 是由 start.S 编译来的, -c 是只编译不链接  
        arm-linux-gcc -g -c $^  
    
    %.o : %.c   #通用规则, 如 start.o 是由 start.c 编译来的, -c 是只编译不链接  
        arm-linux-gcc -g -c $^  
    
    .PHONY: clean     
    clean:              #清除编译信息  
        rm *.o *.elf *.bin  




    4. 编译输出可执行文件


    编译过程 :

    • 1.文件准备 : 将 汇编代码 ( start.S ) 链接器脚本 ( gboot.lds ) makefile 文件 拷贝到编译目录 ;
    • 2.执行编译命令 : make ;
    • 3.编译结果 : 可以看到 生成了 编译目标文件 start.o, 链接文件 gboot.elf, 可执行的二进制文件 gboot.bin ;
      这里写图片描述


    本博客的参考文章及相关资料下载 :

    展开全文
  • 寄存器 中断

    2020-08-25 11:05:08
    ISER[8]: ISER 全称是: Interrupt Set-Enable Registers,这是一个中断使能寄存器组。 有用的就是三个(ISER[0~2]]),总共可以表示 96 个中断。而 STM32F4 只用了其中的前 82 个。 ISER[0]的 bit0~31 分别对应...

    STM32F40xx/STM32F41xx 的 92 个中断里面, 包括 10 个内核中断和 82 个可屏蔽中断,具
    有 16 级可编程的中断优先级, 而我们常用的就是这 82 个可屏蔽中断

    ISER[8]: ISER 全称是: Interrupt Set-Enable Registers,这是一个中断使能寄存器组。
    有用的就是三个(ISER[0~2]]),总共可以表示 96 个中断。而 STM32F4 只用了其中的前 82 个。 ISER[0]的 bit0~31 分别对应中断
    0~31; ISER[1]的 bit0~32 对应中断 32~63; ISER[2]的 bit0~17 对应中断 64~81;
    ICER[8]:全称是: Interrupt Clear-Enable Registers,是一个中断除能寄存器组。该寄存器组
    与 ISER 的作用恰好相反,是用来清除某个中断的使能的。其对应位的功能,也和 ICER 一样。
    这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄
    存器都是写 1 有效的,写 0 是无效的。
    ISPR[8]:全称是: Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位
    对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别
    的中断。写 0 是无效的。
    ICPR[8]:全称是: Interrupt Clear-Pending Registers,是一个中断解挂控制寄存器组。其作
    用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断接挂。写 0 无效。
    IABR[8]:全称是: Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。对应位
    所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄
    存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。
    IP[240]:全称是: Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄
    存器组相当重要! STM32F4 的中断分组与这个寄存器组密切相关。 IP 寄存器组由 240 个 8bit
    的寄存器组成,每个可屏蔽中断占用 8bit,这样总共可以表示 240 个可屏蔽中断。 而 STM32F4
    只用到了其中的 82 个。 IP[81]~IP[0]分别对应中断 81~0。 而每个可屏蔽中断占用的 8bit 并没有
    全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子
    优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组设置来决定。

    优先级分组及设置

    STM32F4 将中断分为 5 个组,组 0~4。该分组
    的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系如表 5.2.6.1 所示:
    组 AIRCR [10: 8] [ 7: 4]分配情况 分配结果
    0 111 0: 4 0 位抢占优先级, 4 位响应优先级
    1 110 1: 3 1 位抢占优先级, 3 位响应优先级
    2 101 2: 2 2 位抢占优先级, 2 位响应优先级
    3 100 3: 1 3 位抢占优先级, 1 位响应优先级
    4 011 4: 0 4 位抢占优先级, 0 位响应优先级

    例如组设置为 3,那么此时所有的 82 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级,低 1 位是响应优先级

    每个中断, 你可以设置抢占优先级为 0~7,响应优先级为 1 或 0。

    数值越小所代表的优先级就越高

    只有抢占不同才可以打断。

    假定设置中断优先级组为 2,然后设置中断 3(RTC_WKUP 中断)的抢占优先级为 2,响应优先级为 1。中断 6(外部中断 0)的抢占优先级为 3,响应优先级为 0。中断 7(外部中断 1)的抢占优先级为 2,响应优先级为 0。那么这 3 个中断的优先级顺序为:中断 7>中断 3>中断 6。
    上面 中断 3 和中断 7 都可以打断中断 6 的中断。而中断 7 和中断 3 却不可以相互打断!

    MY_NVIC_Init函数

    //设置 NVIC 分组
    //NVIC_Group: NVIC 分组 0~4 总共 5 组
    void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
    //设置 NVIC
    //NVIC_PreemptionPriority: 抢占优先级
    //NVIC_SubPriority : 响应优先级
    //NVIC_Channel : 中断编号
    //NVIC_Group : 中断分组 0~4
    //注意优先级不能超过设定的组的范围!否则会有意想不到的错误
    //组划分:
    //组 0: 0 位抢占优先级, 4 位响应优先级
    //组 1: 1 位抢占优先级, 3 位响应优先级
    //组 2: 2 位抢占优先级, 2 位响应优先级
    //组 3: 3 位抢占优先级, 1 位响应优先级
    //组 4: 4 位抢占优先级, 0 位响应优先级
    //NVIC_SubPriority 和 NVIC_PreemptionPriority 的原则是, 数值越小, 越优先
    void MY_NVIC_Init(u8 NVIC_PreemptionPriority, u8 NVIC_SubPriority, u8 NVIC_Channel,u8 NVIC_Group)

    外部中断的设置,配置相关寄存器

    STM32F4 的 23 个外部中断为:
    线 0~15:对应外部 IO 口的输入中断。
    线 16:连接到 PVD 输出。
    线 17:连接到 RTC 闹钟事件。
    线 18:连接到 USB OTG FS 唤醒事件。
    线 19:连接到以太网唤醒事件。
    线 20:连接到 USB OTG HS 唤醒事件。
    线 21:连接到 RTC 入侵和时间戳事件。
    线 22:连接到 RTC 唤醒事件。

    IMR:中断屏蔽寄存器。这是一个 32 寄存器。但是只有前 23 位有效。当位 x 设置为 1 时,
    则开启这个线上的中断,否则关闭该线上的中断。
    EMR:事件屏蔽寄存器,同 IMR,只是该寄存器是针对事件的屏蔽和开启。
    RTSR:上升沿触发选择寄存器。该寄存器同 IMR,也是一个 32 为的寄存器,只有前 23
    位有效。位 x 对应线 x 上的上升沿触发,如果设置为 1,则是允许上升沿触发中断/事件。否则,
    不允许。
    FTSR:下降沿触发选择寄存器。同 RTSR,不过这个寄存器是设置下降沿的。下降沿和上
    升沿可以被同时设置,这样就变成了任意电平触发了。
    SWIER:软件中断事件寄存器。通过向该寄存器的位 x 写入 1,在未设置 IMR 和 EMR 的
    时候,将设置 PR 中相应位挂起。如果设置了 IMR 和 EMR 时将产生一次中断。被设置的 SWIER
    位,将会在 PR 中的对应位清除后清除。
    PR:挂起寄存器。当外部中断线上发生了选择的边沿事件,该寄存器的对应位会被置为 1。
    0,表示对应线上没有发生触发请求。通过向该寄存器的对应位写入 1 可以清除该位。在中断服
    务函数里面经常会要向该寄存器的对应位写 1 来清除中断请求。

    GPIOA~GPIOI的[15: 0]分别对应中断线 15~0。这样每个中断线对应了最多 9 个 IO 口

    EXTICR[0]~ EXTICR[3]对应EXTICR1~ EXTICR 4EXTICR[0]的分配

    Ex_NVIC_Config//外部中断配置函数

    //只针对 GPIOA~I;不包括 PVD,RTC,USB_OTG,USB_HS,以太网唤醒等
    //参数:
    //GPIOx:0~8,代表 GPIOA~I
    //BITx:需要使能的位;
    //TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
    //该函数一次只能配置 1 个 IO 口,多个 IO 口,需多次调用
    //该函数会自动开启对应中断,以及屏蔽线
    /*首先得开启 SYSCFG 的时钟,然后根据 GPIOx 的位得到中断寄存器组的编号,即 EXTICR 的编号,在 EXTICR 里面配置中断线应该配置到 GPIOx 的哪个位。然后使能该位的中断,最后配置触发方式。这样就完成了外部中断的配置了。
    */
    void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)

    展开全文
  • CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。 但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。 STM32 有 84 个中断,包括 16 个...

    CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。

    但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。

    STM32 有 84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。

    而我们常用的就是这 68 个可屏蔽中断,但是 STM32 的 68 个可屏蔽中断,在 STM32F103 系列 上面,又只有 60 个(在 107 系列才有 68 个)。                                                                                                                                                                      ——stm32F103开发指南

     也就是说stm32f103除了16个内核中断外还有60个可屏蔽中断,这些都是开发板内部的中断,下面对相关的寄存器进行讲解。

    结构体总览

    typedef struct
    {
     __IO uint32_t ISER[8]; /*!< Interrupt Set Enable Register */
     uint32_t RESERVED0[24];
     __IO uint32_t ICER[8]; /*!< Interrupt Clear Enable Register */
     uint32_t RSERVED1[24];
     __IO uint32_t ISPR[8]; /*!< Interrupt Set Pending Register */
     uint32_t RESERVED2[24];
     __IO uint32_t ICPR[8]; /*!< Interrupt Clear Pending Register */
     uint32_t RESERVED3[24];
     __IO uint32_t IABR[8]; /*!< Interrupt Active bit Register */
     uint32_t RESERVED4[56];
     __IO uint8_t IP[240]; /*!< Interrupt Priority Register, 8Bit wide */
     uint32_t RESERVED5[644];
     __O uint32_t STIR; /*!< Software Trigger Interrupt Register */
    } NVIC_Type;
    

     ISER:中断使能寄存器,共8个32位一共256位,每位控制一个中断,但由于stm32f103只支持60个可屏蔽中断,故仅ISER[0]的32位和ISER[1]的28位有用,哪一位对应哪一个中断在stm32f10x.h中有声明。

    ICER:中断除能寄存器,顾名思义,可以让清除某个中断的使能。寄存器位和中断的对应关系与ISER相一致。

    以上两个寄存器,仅在写入1的时候有作用,当写入0时不会发生任何变化,这样做的好处是不需要担心写入0会影响其他中断的状态,只需要对想要修改的中断位写入1。


    ISPR:中断挂起寄存器,通过置1,可以令正在运行的对应中断挂起,转而执行优先级更高的中断,写入0无效。

    ICPR:中断解挂寄存器,通过置1,可以解除挂起,写0无效。


    IABR:中断激活标志位,这是一个只读寄存器,用于标志中断是否在被执行。

    IP:由240个8位寄存器组成的寄存器组,CM3内核支持240个外部中断,stm32f103的60个可屏蔽中断由前60个IP寄存器控制。IP寄存器仅高4位有用,低4位保留,用于写入寄存器的抢占优先级和响应优先级。

    相关链接:stm32学习笔记——中断组别和优先级配置_最弱勇者哀嚎地-CSDN博客中断组别配置,NVIC中断函数在misc.c文件中NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);NVIC_PriorityGroup有5个有效参数,对应0~4五个中断组#define IS_NVIC_PRIORITY_GROUP(GROUP) (((GROUP) == NVIC_PriorityGroup_0) || \ ((GROUP) == NV..https://blog.csdn.net/Zn_Hua/article/details/120687412

    展开全文
  • stm32中断设置(寄存器讲解)

    千次阅读 2020-03-16 16:44:09
    51的内部中断是定时器中断,串口中断,外部中断是外部中断0和1. 而stm32的中断就比51多太多了,引脚多,内部资源多,所以拥有19个外部中断(包含16个GPIO中断和3个外部特定中断) 和40余个内部中断(包括定时器中断...
  • zynq中断寄存器操作

    2020-08-12 23:20:18
    zynq中断寄存器操作 概述: 1. Zynq的中断类型有: 软件中断(Software Generated Interrupt, SGI,中断号0-15)(16–26 reserved) 私有外设中断(Private Peripheral Interrupt, PPI,中断号27-31), 共享外设...
  • 要正确应用ARM处理器必须首先对它的系统寄存器进行正确配置,下面简要介绍一下ARM寄存器,包括一些中断寄存器设置如中断状态(0x8000.0240,0x8000.1240,0x8000.2240)和中断屏蔽寄存器(0x8000.0280,0x8000....
  • S3C2440中断寄存器

    2020-07-17 10:45:36
    1.中断分两大类。2.外部中断。3.内部中断。4.中断过程。 5.中断的开启。
  • ARM Cortex-M3与Cortex-M4中断相关寄存器

    千次阅读 2020-10-27 15:26:30
    中断使能寄存器 设置中断挂起和清除中断挂起 中断活跃状态寄存器 中断优先级寄存器 软件触发中断寄存器 中断控制器类型寄存器 SCB寄存器 中断控制和状态寄存器(ICSR)、向量表偏移...
  • 单片机中断的相关寄存器

    千次阅读 2021-06-09 18:24:20
    1、定时器控制寄存器(TCON) TCON(88H) 地址8FH8EH 8DH8CH8BH 8AH89H88H ...TF1:定时器/计时器T1的...当计数器T1最高位产生溢出时,由硬件使TF1置1,并向CPU发出中断请求。CPU响应中断时,硬件将自动对TF
  • 中断机制 28335中断分3个层级:CPU级——PIE级——外设级 CPU级 包括 NMI(不可屏蔽中断) 16个可屏蔽中断:INT1–INT14;...IER (中断使能,置1了才去处理该通道中的中断) INTM (中断总阀,置1开启才...
  • 中断向量控制器和中断处理的主要寄存器 --参考朱有鹏ARM裸机 1、异常处理的2个阶段 可以将异常处理分为2个阶段来理解,第一阶段是异常向量表跳转 第二阶段就是进入了真正的异常处理程序irq_handler之后的部分。 ...
  • 串口空闲中断 STM32F407 寄存器操作
  • CC2530中断寄存器和用法的一些简单说明 PICTL——端口输入信号 P0IFG ——P0端口状态标志寄存器 P1IFG ——P1端口状态标志寄存器 P2IFG ——P2端口状态标志寄存器 P0IEN——P0端口中断使能 P1IEN——P1端口中断使能 ...
  • Windows RTX下PCI设备的读写寄存器中断
  • 外部中断使用指南(寄存器设置)

    千次阅读 2021-05-23 08:28:58
    实验板子:tiny210(芯片:s5pv210)实验目的:通过外部中断操作两个按键实现对LED灯的亮灭控制步骤:①初始化GPIO端口,使GPIO为外部中断状态;(寄存器:GPxxCON)例:②配置外部中断触发模式,上升沿触发,下降沿触发...
  • 51单片机与中断相关的寄存器

    千次阅读 2020-05-22 15:52:51
    51单片机与中断相关的寄存器简介中断控制寄存器IE中断优先级控制...当EA = 1,使能中断;当EA = 0,禁止所有中断 6~5 —— —— 4 ES 当ES = 1,使能串行中断;当ES = 1,禁止串行中断; 3 ET1 当ET1 = 1,使能
  • 本文主要讲了单片机中断系统的控制寄存器IE和IP,希望对你的学习有所帮助。
  • STM32的EXTI外部中断(直接操作寄存器),亲测可用,内有详细代码注释和说明讲解,很好的学习资料。
  • STM32的USART_Irq串口中断方式(直接操作寄存器)。内有详细的注释和文档。很好的学习资料。
  • DSP中断实现方式以及寄存器访问,在C语言如何访问寄存器,如何实现三级中断
  • 硬件中断错误寄存器介绍
  • DSP28335:中断系统

    2020-12-12 22:45:46
    一、CPU中断 1.CPU中断概述 中断申请信号是通常由软件或者硬件所产生的的信号,它可以使CPU暂停正在执行的主程序...每一个中断都是32位的中断向量,也就是两个16位寄存器,里面存储的是相应的中断服务子程序的入口地址
  •  1 S3C2440的中断寄存器  中断分两大类:外部中断和内部中断。  1.1 外部中断寄存器  24个外部中断占用GPF0-GPF7(EINT0-EINT7),GPG0-GPG15(EINT8-EINT23)。用这些脚做中断输入,则必须配置引脚为中断,...
  • 中断允许寄存器IE、IE2和INT_CLKO ...EA的作用是使中断允许形成多级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。 ELVD:低压检测中断允许位,ELVD=1,允许低压检测中断
  • atmega16 与外中断有关的寄存器和标志位 一一列出,并有简介,可作为初学avr的atmega16写程序时的参考。
  • 中断寄存器记录

    2020-08-27 20:23:06
    中断请求寄存器IRR 8259A有8条外部中断请求输入信号线IR0-IR7,每一条请求线上有一个相应的触发器来保存请求信号,它们形成了中断请求寄存器IRR(Interrupt Request Register)。 ⑵中断屏蔽寄存器IMR I.MR...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 191,186
精华内容 76,474
关键字:

中断使能寄存器

友情链接: 策略为王2015.zip