NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级为3 下面讲讲中断的相关寄存器: ISER(Interrupt Set-Enable Registers):中断使能寄存器组 用8个32位寄存器控制256个中断,而STM32F103只有60个可屏蔽中断,因此只用ISER[0](0~31)和ISER[1](32~59),通过设置相应的ISER位为1,进行使能。 ICER(Interr...
这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。 ISPR ISPR[8]:全称是:Interrupt Set-Pending Registers,是一个中断挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更...
2)NVIC寄存器地址不连续 NVIC的寄存器之间地址并不连续,留有保留空间,其实也是为了未来扩展CM3架构的考虑。比如NVIC_ISERx的地址(只计算偏移地址)是:0x000 ~ 0x1F(4字节*8个 = 32),而之后的NVIC_ICERx的起始地址是0x080,它们之间有0x060(96个字节)的未使用地带。 这个问题的解决方法还是采用数组,在ISER[8]...
其实我们看NVIC_Init()函数内部使能中断,也是通过ISER寄存器配置的。这与我么之前的内容并不矛盾。函数内部使用NVIC->ISER,而NVIC是一个宏定义, 代码语言:javascript 代码运行次数:0 运行 AI代码解释 #defineNVIC((NVIC_Type*)NVIC_BASE)/*!< NVIC configuration struct */ 也就是直接操作结构体来实现操作ISER寄...
(2)NVIC_IRQChannelPreemptionPriority:抢占优先级,具体的值要根据优先级分组来确定。 (3)NVIC_IRQChannelSubPriority:子优先级,具体的值要根据优先级分组来确定。 (4)NVIC_IRQChannelCmd:中断使能(ENABLE)或者失能(DISABLE)。操作的是NVIC_ISER和NVIC_ICER这两个寄存器。
NVIC一共有7个寄存器,其中STIR寄存器不理解就被我跳过了;nvic初始化函数主要配置IPR、ISER寄存器; 如果外设使能了中断函数,但是该外设对应的nvic_ISER_bit未使能,那么cm3不会跳转执行中断函数; 内核外设不需要配置nvic_ISER,通过SCB配置优先级以及使能中断函数,就可以跳转执行中断函数了...
NVIC_IRQChannelPreemptionPriority<<tmppre;tmppriority|=NVIC_IRQChannelSubPriority&tmpsub;tmppriority=tmppriority<<0x4;//左移4位是因为寄存器的低四位保留,只有高4位用于设置优先级NVIC->IP[NVIC_IRQChannel]=tmppriority;//给IP相应的通道设置优先级,通道相应的值去stm32f10x.h找NVIC->ISER[NVIC_IRQChannel>...
在MDK内,与NVIC相关的寄存器,MDK为其定义了如下的结构体: typedef struct { vu32 ISER[2]; //2个32位中断使能寄存器分别对应到60个可屏蔽中断 u32 RESERVED0[30]; vu32 ICER[2]; //2个32位中断除能寄存器分别对应到60个可屏蔽中断 u32 RSERVED1[30]; ...
NVIC初始化 misc.c misc.h 中断使能寄存器ISER寄存器 ISER[8]用于使能中断,共有8个32位寄存器 32位的寄存器,每个位控制一个中断的使能 STM32F10x只有60个可屏蔽中断,因此只能收了第1个和第2个寄存器,即ISER[0]和ISER[1] ISER[0]的bit 0~31分别对应中断0~31 ...
NVIC->IPR[IPRADDR]|=temp<<IPROFFSET; //设置响应优先级和抢占优先级 } 语句解读: u8 IPRA =NVIC_Channel/4; //ISER[2]组可以设置60个中断优先级,每组15个寄存器,每个寄存器32位 每个可中断8位,每个寄存器可以设置4个中断, 组地址=channel/4; //选择中断号组(0--3)(4--7),,,(56---59) ...