STM32F101xx/STM32F103xx固件库函数NVIC详解

需积分: 49 9 下载量 127 浏览量 更新于2024-08-07 收藏 2.8MB PDF 举报
"STM32固件库中的NVIC库函数" STM32固件库包含了一组用于管理NVIC(Nested Vector Interrupt Controller)的库函数,这些函数主要用于中断管理和优先级配置,适用于基于ARM Cortex-M3内核的STM32F101xx和STM32F103xx系列微控制器。NVIC是Cortex-M处理器内核的一个关键组件,负责处理和调度中断请求。 1. NVIC初始化和重置: - `NVIC_DeInit` 函数用于重置NVIC寄存器,将其恢复到默认状态。 - `NVIC_SCBDeInit` 函数则用于重置SCB(System Control Block)寄存器,SCB包含了NVIC的部分功能。 2. 优先级分组配置: - `NVIC_PriorityGroupConfig` 允许用户设置中断优先级分组,以确定先占优先级和从优先级的分配方式。 3. NVIC寄存器初始化: - `NVIC_Init` 根据提供的结构体`NVIC_InitStruct`中的参数初始化NVIC寄存器,允许用户配置中断的优先级和状态。 - `NVIC_StructInit` 则用于将结构体的各个参数初始化为默认值。 4. 优先级控制: - `NVIC_SETPRIMASK` 用来启用PRIMASK优先级,将执行优先级提升至0,防止所有中断。 - `NVIC_RESETPRIMASK` 关闭PRIMASK优先级,恢复中断处理。 - `NVIC_SETFAULTMASK` 启用FAULTMASK,提升执行优先级至-1,进一步阻止异常处理。 - `NVIC_RESETFAULTMASK` 失能FAULTMASK,解除阻止异常处理。 5. 中断通道管理: - `NVIC_BasePriConfig` 用于改变执行优先级,提升从N(最低可设置优先级)到1。 - `NVIC_GetBasePRI` 返回当前的BASEPRI屏蔽值。 - `NVIC_GetCurrentPendingIRQChannel` 获取当前待处理的中断通道号。 - `NVIC_GetIRQChannelPendingBitStatus` 检查指定中断通道的待处理位状态。 - `NVIC_SetIRQChannelPendingBit` 设置指定中断通道的待处理位。 - `NVIC_ClearIRQChannelPendingBit` 清除指定中断通道的待处理位。 6. 活动中断和系统处理: - `NVIC_GetCurrentActiveHandler` 返回当前活动的中断处理程序(包括IRQ通道和系统处理程序)的标识符。 - `NVIC_GetIRQChannelActiveBitStatus` 检查指定中断通道的活动位状态。 7. CPU和系统信息: - `NVIC_GetCPUID` 返回CPUID,包含Cortex-M3内核的版本号和实现细节。 - `NVIC_SetVectorTable` 设置向量表的位置和偏移。 8. 复位操作: - `NVIC_GenerateSystemReset` 引发系统复位。 - `NVIC_GenerateCoreReset` 引发内核(内核+NVIC)复位。 9. 低功耗模式配置: - `NVIC_SystemLPConfig` 用于配置系统进入低功耗模式的条件。 10. 系统处理程序管理: - `NVIC_SystemHandlerConfig` 用于启用或禁用特定的系统处理程序。 - `NVIC_SystemHandlerPriorityConfig` 设置系统处理程序的优先级。 - `NVIC_GetSystemHandlerPendingBitStatus` 检查系统处理程序的待处理位状态。 - `NVIC_SetSystemHandlerPendingBit` 设置系统处理程序的待处理位。 - `NVIC_ClearSystemHandlerPendingBit` 清除系统处理程序的待处理位。 - `NVIC_GetSystemHandlerActiveBitStatus` 检查系统处理程序的活动位状态。 11. 故障处理: - `NVIC_GetFaultHandlerSources` 返回表示出错的系统处理程序源。 - `NVIC_GetFaultAddress` 返回导致错误的系统处理程序所在位置的地址。 该固件库提供了一个标准的API(Application Programming Interface),使得开发者能够方便地与NVIC交互,同时提供了错误检测机制,增强了软件的健壮性。虽然库代码是通用的,可能不是最优的代码大小和执行速度,但对于大多数应用来说,直接使用库函数即可满足需求。对于有特殊要求的应用,开发者可以参考库函数进行定制优化。