STM32 中的嵌套向量中断控制器(NVIC)详解
《STM32 中的嵌套向量中断控制器(NVIC)详解》这篇在博客园热度很高,讲的正是大家天天碰到的事。下面帮你把要点捋出来,结尾有能直接抄的结论。
首先明确: 抢占优先级决定“能不能打断”;响应优先级决定“同时等待时谁先执行”。 1. NVIC 是什么 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)负责: 开启、关闭中断 保存中断的挂起状态 判断多个中断的执行顺序 实现中断嵌套 根据中断号找到对应的中断服务函数 所谓“嵌套”,就是 CPU 正在执行一个中断服务函数时,可以被更高抢占优先级的中断打断。 2. STM32 的优先级数字越小,等级越高 优先级数值 0 > 优先级数值 1 > 优先级数值 2 ... 这里的 > 表示“实际优先级更高”。 例如: [代码示例略] A 的优先级高于 B。B 执行过程中,A 可以打断 B。 3. NVIC的 4 位优先级 很多 STM32 芯片实际实现了 4 个优先级位,因此一共有:[2^4=16] 个编码值,也就是 0~15 。
首先明确: 抢占优先级决定“能不能打断”;响应优先级决定“同时等待时谁先执行”。 1. NVIC 是什么 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)负责: 开启、关闭中断 保存中断的挂起状态 判断多个中断的执行顺序 实现中断嵌套 根据中断号找到对应的中断服务函数 所谓“嵌套”,就是 CPU 正在执行一个中断服务函数时,可以被更高抢占优先级的中断打断。 2. STM32 的优先级数字越小,等级越高 优先级数值 0 > 优先级数值 1 > 优先级数值 2 ... 这里的 > 表示“实际优先级更高”。 例如: [代码示例略] A 的优先级高于 B。B 执行过程中,A 可以打断 B。 3. NVIC的 4 位优先级 很多 STM32 芯片实际实现了 4 个优先级位,因此一共有:[2^4=16] 个编码值,也就是 0~15 。 这 4 位可以切分成两部分: [代码示例略] 分成五种模式: 分组 抢占优先级位数 抢占值范围 响应优先级位数 响应值范围 分组0 0位 只能为0 4位 0~15 分组1 1位 0~1 3位 0~7 分组2 2位 0~3 2位 0~3 分组3 3位 0~7 1位 0~1 分组4 4位 0~15 0位 只能为0 这里的 4 位不是说每个中断都有两个独立的 4 位字段,而是说: 总共只有 4 位,需要在抢占优先级和响应优先级之间分配。
首先明确: 抢占优先级决定“能不能打断”;响应优先级决定“同时等待时谁先执行”。 1. NVIC 是什么 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)负责: 开启、关闭中断 保存中断的挂起状态 判断多个中断的执行顺序 实现中断嵌套 根据中断号找到对应的中断服务函数 所谓“嵌套”,就是 CPU 正在执行一个中断服务函数时,可以被更高抢占优先级的中断打断。 2. STM32 的优先级数字越小,等级越高 优先级数值 0 > 优先级数值 1 > 优先级数值 2 ... 这里的 > 表示“实际优先级更高”。 例如: [代码示例略] A 的优先级高于 B。B 执行过程中,A 可以打断 B。 3. NVIC的 4 位优先级 很多 STM32 芯片实际实现了 4 个优先级位,因此一共有:[2^4=16] 个编码值,也就是 0~15 。 这 4 位可以切分成两部分: [代码示例略] 分成五种模式: 分组 抢占优先级位数 抢占值范围 响应优先级位数 响应值范围 分组0 0位 只能为0 4位 0~15 分组1 1位 0~1 3位 0~7 分组2 2位 0~3 2位 0~3 分组3 3位 0~7 1位 0~1 分组4 4位 0~15 0位 只能为0 这里的 4 位不是说每个中断都有两个独立的 4 位字段,而是说: 总共只有 4 位,需要在抢占优先级和响应优先级之间分配。 4. 抢占优先级:决定能否发生中断嵌套 假设: [代码示例略] 由于数值越小优先级越高,因此 A 的抢占优先级高于 B。
首先明确: 抢占优先级决定“能不能打断”;响应优先级决定“同时等待时谁先执行”。 1. NVIC 是什么 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)负责: 开启、关闭中断 保存中断的挂起状态 判断多个中断的执行顺序 实现中断嵌套 根据中断号找到对应的中断服务函数 所谓“嵌套”,就是 CPU 正在执行一个中断服务函数时,可以被更高抢占优先级的中断打断。 2. STM32 的优先级数字越小,等级越高 优先级数值 0 > 优先级数值 1 > 优先级数值 2 ... 这里的 > 表示“实际优先级更高”。 例如: [代码示例略] A 的优先级高于 B。B 执行过程中,A 可以打断 B。 3. NVIC的 4 位优先级 很多 STM32 芯片实际实现了 4 个优先级位,因此一共有:[2^4=16] 个编码值,也就是 0~15 。 这 4 位可以切分成两部分: [代码示例略] 分成五种模式: 分组 抢占优先级位数 抢占值范围 响应优先级位数 响应值范围 分组0 0位 只能为0 4位 0~15 分组1 1位 0~1 3位 0~7 分组2 2位 0~3 2位 0~3 分组3 3位 0~7 1位 0~1 分组4 4位 0~15 0位 只能为0 这里的 4 位不是说每个中断都有两个独立的 4 位字段,而是说: 总共只有 4 位,需要在抢占优先级和响应优先级之间分配。 4. 抢占优先级:决定能否发生中断嵌套 假设: [代码示例略] 由于数值越小优先级越高,因此 A 的抢占优先级高于 B。 如果 CPU 正在执行 B,此时 A 到来: [代码示例略] 这就是中断嵌套。
首先明确: 抢占优先级决定“能不能打断”;响应优先级决定“同时等待时谁先执行”。 1. NVIC 是什么 NVIC(Nested Vectored Interrupt Controller,嵌套向量中断控制器)负责: 开启、关闭中断 保存中断的挂起状态 判断多个中断的执行顺序 实现中断嵌套 根据中断号找到对应的中断服务函数 所谓“嵌套”,就是 CPU 正在执行一个中断服务函数时,可以被更高抢占优先级的中断打断。 2. STM32 的优先级数字越小,等级越高 优先级数值 0 > 优先级数值 1 > 优先级数值 2 ... 这里的 > 表示“实际优先级更高”。 例如: [代码示例略] A 的优先级高于 B。B 执行过程中,A 可以打断 B。 3. NVIC的 4 位优先级 很多 STM32 芯片实际实现了 4 个优先级位,因此一共有:[2^4=16] 个编码值,也就是 0~15 。 这 4 位可以切分成两部分: [代码示例略] 分成五种模式: 分组 抢占优先级位数 抢占值范围 响应优先级位数 响应值范围 分组0 0位 只能为0 4位 0~15 分组1 1位 0~1 3位 0~7 分组2 2位 0~3 2位 0~3 分组3 3位 0~7 1位 0~1 分组4 4位 0~15 0位 只能为0 这里的 4 位不是说每个中断都有两个独立的 4 位字段,而是说: 总共只有 4 位,需要在抢占优先级和响应优先级之间分配。 4. 抢占优先级:决定能否发生中断嵌套 假设: [代码示例略] 由于数值越小优先级越高,因此 A 的抢占优先级高于 B。 如果 CPU 正在执行 B,此时 A 到来: [代码示例略] 这就是中断嵌套。 反过来,如果正在执行 A,B 到来,B 不能打断 A,只能进入挂起状态,等 A 执行完再处理。
建议先收藏再实操:挑其中一个点今天就试试,跑通了再看下一个。知识只有过手才是你的,你准备先试哪一点? 来源|博客园《STM32 中的嵌套向量中断控制器(NVIC)详解》,https://www.cnblogs.com/wangzhengyi/p/22948947.html
评论(0)
暂无评论,来抢第一条。