📄 stm32f10x_nvic.c
字号:
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* 文件名称: stm32f10x_nvic.c
* 程序作者: MCD Application Team
* 程序版本: V2.0.2
* 编制日期: 07/11/2008
* 功能描述: 这个文件提供了所有NVIC的固件函数.
* 本文汉化: 孙可 2008.08.15
********************************************************************************
* 目前的固件的目的是为客户提供关于他们的产品的编码信息以便于节省他们时间。
* 结果, 意法半导体将不会为此承担任何直接,间接或相应的损害赔偿方面的任何索赔要求,
* 例如固件或使用所作的客户编码中他涉嫌包含与他们的相关产品的信息。
*******************************************************************************/
/* 包涵的文件 ------------------------------------------------------------------*/
#include "stm32f10x_nvic.h"
/* 自用类型 -----------------------------------------------------------*/
/* 自用定义 ------------------------------------------------------------*/
#define AIRCR_VECTKEY_MASK ((u32)0x05FA0000)
/* 自用宏 -------------------------------------------------------------*/
/* 自用变量 ---------------------------------------------------------*/
/* 自用函数原型 -----------------------------------------------*/
/* 自用函数 ---------------------------------------------------------*/
/*******************************************************************************
* 函数名称: NVIC_DeInit
* 功能描述: 复位NVIC外围设备寄存器为默认的复位值.
* 输入参数: 无
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_DeInit(void)
{
u32 index = 0;
NVIC->ICER[0] = 0xFFFFFFFF;
NVIC->ICER[1] = 0x0FFFFFFF;
NVIC->ICPR[0] = 0xFFFFFFFF;
NVIC->ICPR[1] = 0x0FFFFFFF;
for(index = 0; index < 0x0F; index++)
{
NVIC->IPR[index] = 0x00000000;
}
}
/*******************************************************************************
* 函数名称: NVIC_SCBDeInit
* 功能描述: 复位SCB外围设备寄存器为默认的复位值.
* 输入参数: 无
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_SCBDeInit(void)
{
u32 index = 0x00;
SCB->ICSR = 0x0A000000;
SCB->VTOR = 0x00000000;
SCB->AIRCR = AIRCR_VECTKEY_MASK;
SCB->SCR = 0x00000000;
SCB->CCR = 0x00000000;
for(index = 0; index < 0x03; index++)
{
SCB->SHPR[index] = 0;
}
SCB->SHCSR = 0x00000000;
SCB->CFSR = 0xFFFFFFFF;
SCB->HFSR = 0xFFFFFFFF;
SCB->DFSR = 0xFFFFFFFF;
}
/*******************************************************************************
* 函数名称: NVIC_PriorityGroupConfig
* 功能描述: 配置优先级组:优先级和子优先级.
* 输入参数: NVIC_PriorityGroup:优先级组位的长度。
* 这个参数允许的值:
* - NVIC_PriorityGroup_0:0位优先级;4位子优先级
* - NVIC_PriorityGroup_1:1位优先级;3位子优先级
* - NVIC_PriorityGroup_2:2位优先级;2位子优先级
* - NVIC_PriorityGroup_3:3位优先级;1位子优先级
* - NVIC_PriorityGroup_4:4位优先级;0位子优先级
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)
{
/* Check the parameters [检查参数]*/
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
/* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value
[依照NVIC_PriorityGroup的值设置PRIGROUP[10:8]的位]*/
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
/*******************************************************************************
* 函数名称: NVIC_Init
* 功能描述: 通过NVIC_InitStruct中的指定参数来初始化外围设备.
* 输入参数: NVIC_InitStruct:一个指向包含指定NVIC外围设备配置信息的NVIC_InitTypeDef结构的指针。
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)
{
u32 tmppriority = 0x00, tmpreg = 0x00, tmpmask = 0x00;
u32 tmppre = 0, tmpsub = 0x0F;
/* Check the parameters [检查参数]*/
assert_param(IS_FUNCTIONAL_STATE(NVIC_InitStruct->NVIC_IRQChannelCmd));
assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_InitStruct->NVIC_IRQChannel));
assert_param(IS_NVIC_PREEMPTION_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority));
assert_param(IS_NVIC_SUB_PRIORITY(NVIC_InitStruct->NVIC_IRQChannelSubPriority));
if (NVIC_InitStruct->NVIC_IRQChannelCmd != DISABLE)
{
/* Compute the Corresponding IRQ Priority [计算相应的中断优先级]*/
tmppriority = (0x700 - (SCB->AIRCR & (u32)0x700))>> 0x08;
tmppre = (0x4 - tmppriority);
tmpsub = tmpsub >> tmppriority;
tmppriority = (u32)NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority << tmppre;
tmppriority |= NVIC_InitStruct->NVIC_IRQChannelSubPriority & tmpsub;
tmppriority = tmppriority << 0x04;
tmppriority = ((u32)tmppriority) << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
tmpreg = NVIC->IPR[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)];
tmpmask = (u32)0xFF << ((NVIC_InitStruct->NVIC_IRQChannel & (u8)0x03) * 0x08);
tmpreg &= ~tmpmask;
tmppriority &= tmpmask;
tmpreg |= tmppriority;
NVIC->IPR[(NVIC_InitStruct->NVIC_IRQChannel >> 0x02)] = tmpreg;
/* Enable the Selected IRQ Channels [允许选择的中断通道]*/
NVIC->ISER[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
(u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
}
else
{
/* Disable the Selected IRQ Channels [禁止选择的中断通道]*/
NVIC->ICER[(NVIC_InitStruct->NVIC_IRQChannel >> 0x05)] =
(u32)0x01 << (NVIC_InitStruct->NVIC_IRQChannel & (u8)0x1F);
}
}
/*******************************************************************************
* 函数名称: NVIC_StructInit
* 功能描述: 给每一个NVIC_InitStruct成员填上默认值.
* 输入参数: NVIC_InitStruct:指向将被初始化的NVIC_InitTypeDef结构的指针.
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_StructInit(NVIC_InitTypeDef* NVIC_InitStruct)
{
/* NVIC_InitStruct members default value [NVIC_InitStruct成员默认值]*/
NVIC_InitStruct->NVIC_IRQChannel = 0x00;
NVIC_InitStruct->NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStruct->NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStruct->NVIC_IRQChannelCmd = DISABLE;
}
/*******************************************************************************
* 函数名称: NVIC_SETPRIMASK
* 功能描述: 使能PRIMASK优先级:把执行的优先级提升为0.
* 输入参数: 无
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_SETPRIMASK(void)
{
__SETPRIMASK();
}
/*******************************************************************************
* 函数名称: NVIC_RESETPRIMASK
* 功能描述: 使PRIMASK优先级无效.
* 输入参数: 无
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_RESETPRIMASK(void)
{
__RESETPRIMASK();
}
/*******************************************************************************
* 函数名称: NVIC_SETFAULTMASK
* 功能描述: 使能FAULTMASK优先级:把执行的优先级提升为-1.
* 输入参数: 无
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_SETFAULTMASK(void)
{
__SETFAULTMASK();
}
/*******************************************************************************
* 函数名称: NVIC_RESETFAULTMASK
* 功能描述: 使FAULTMASK优先级无效。
* 输入参数: 无
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_RESETFAULTMASK(void)
{
__RESETFAULTMASK();
}
/*******************************************************************************
* 函数名称: NVIC_BASEPRICONFIG
* 功能描述: 执行优先级能够从15(可配置的最低优先级)改变为1.写入0将禁止优先级.
* 输入参数: 无
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_BASEPRICONFIG(u32 NewPriority)
{
/* Check the parameters [检查参数]*/
assert_param(IS_NVIC_BASE_PRI(NewPriority));
__BASEPRICONFIG(NewPriority << 0x04);
}
/*******************************************************************************
* 函数名称: NVIC_GetBASEPRI
* 功能描述: 返回BASEPRI掩码值.
* 输入参数: 无
* 输出参数: 无
* 返回参数: 返回BASEPRI寄存器值
*******************************************************************************/
u32 NVIC_GetBASEPRI(void)
{
return (__GetBASEPRI());
}
/*******************************************************************************
* 函数名称: NVIC_GetCurrentPendingIRQChannel
* 功能描述: 返回当前挂起的IRQ通道(channel)标识符.
* 输入参数: 无
* 输出参数: 无
* 返回参数: 挂起IRQ通道的标识符.
*******************************************************************************/
u16 NVIC_GetCurrentPendingIRQChannel(void)
{
return ((u16)((SCB->ICSR & (u32)0x003FF000) >> 0x0C));
}
/*******************************************************************************
* 函数名称: NVIC_GetIRQChannelPendingBitStatus
* 功能描述: 检查指定IRQ通道挂起位是否置位。
* 输入参数: NVIC_IRQChannel:要检查的的中断挂起位.
* 输出参数: 无
* 返回参数: IRQ通道挂起位的新状态(SET or RESET).
*******************************************************************************/
ITStatus NVIC_GetIRQChannelPendingBitStatus(u8 NVIC_IRQChannel)
{
ITStatus pendingirqstatus = RESET;
u32 tmp = 0x00;
/* Check the parameters [检查参数]*/
assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
tmp = ((u32)0x01 << (NVIC_IRQChannel & (u32)0x1F));
if (((NVIC->ISPR[(NVIC_IRQChannel >> 0x05)]) & tmp) == tmp)
{
pendingirqstatus = SET;
}
else
{
pendingirqstatus = RESET;
}
return pendingirqstatus;
}
/*******************************************************************************
* 函数名称: NVIC_SetIRQChannelPendingBit
* 功能描述: 设置NVIC中断挂起位。
* 输入参数: NVIC_IRQChannel:指定了要置位的中断挂起位。
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_SetIRQChannelPendingBit(u8 NVIC_IRQChannel)
{
/* Check the parameters [检查参数]*/
assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
*(vu32*) 0xE000EF00 = (u32)NVIC_IRQChannel;
}
/*******************************************************************************
* 函数名称: NVIC_ClearIRQChannelPendingBit
* 功能描述: 清除NVIC中断挂起位。
* 输入参数: NVIC_IRQChannel:指定了要清除的中断挂起位。
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void NVIC_ClearIRQChannelPendingBit(u8 NVIC_IRQChannel)
{
/* Check the parameters [检查参数]*/
assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
NVIC->ICPR[(NVIC_IRQChannel >> 0x05)] = (u32)0x01 << (NVIC_IRQChannel & (u32)0x1F);
}
/*******************************************************************************
* 函数名称: NVIC_GetCurrentActiveHandler
* 功能描述: 返回当前活动处理程序(IRQ通道和系统处理程序)的标识符
* 输入参数: 无
* 输出参数: 无
* 返回参数: 活动处理程序标识符
*******************************************************************************/
u16 NVIC_GetCurrentActiveHandler(void)
{
return ((u16)(SCB->ICSR & (u32)0x3FF));
}
/*******************************************************************************
* 函数名称: NVIC_GetIRQChannelActiveBitStatus
* 功能描述: 检查指定IRQ通道活动位设置与否。
* 输入参数: NVIC_IRQChannel:指定了要检查的中断活动位.
* 输出参数: 无
* 返回参数: IRQ通道活动位的新状态(SET or RESET)
*******************************************************************************/
ITStatus NVIC_GetIRQChannelActiveBitStatus(u8 NVIC_IRQChannel)
{
ITStatus activeirqstatus = RESET;
u32 tmp = 0x00;
/* Check the parameters [检查参数]*/
assert_param(IS_NVIC_IRQ_CHANNEL(NVIC_IRQChannel));
tmp = ((u32)0x01 << (NVIC_IRQChannel & (u32)0x1F));
if (((NVIC->IABR[(NVIC_IRQChannel >> 0x05)]) & tmp) == tmp )
{
activeirqstatus = SET;
}
else
{
activeirqstatus = RESET;
}
return activeirqstatus;
}
/*******************************************************************************
* 函数名称: NVIC_GetCPUID
* 功能描述: 返回Cortex-M3核的ID号,版本号和实现细节。
* 输入参数: 无
* 输出参数: 无
* 返回参数: CPU ID.
*******************************************************************************/
u32 NVIC_GetCPUID(void)
{
return (SCB->CPUID);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -