1、RCC相关:
APB2启动时钟项:
RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB,
RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE,
RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1,
RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1,
RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3,
RCC_APB2Periph_ALL
APB2启动函数:
RCC_APB2PeriphClockCmd(XX,ENABLE);
APB1启动时钟项:
RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4,
RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7,
RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3,
RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4,
RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2,
RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP,
RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_ALL
APB1启动函数:
RCC_APB2PeriphClockCmd(XX,ENABLE);
AHB启动时钟项:
RCC_AHBPeriph_DMA1
RCC_AHBPeriph_DMA2
RCC_AHBPeriph_SRAM
RCC_AHBPeriph_FLITF
RCC_AHBPeriph_CRC
RCC_AHBPeriph_FSMC
RCC_AHBPeriph_SDIO
AHB启动函数:
RCC_AHBPeriphClockCmd (XX,ENABLE);
2、GPIO相关:
GPIO模式:
GPIO_Mode_AIN:模拟输入 GPIO_Mode_IN_FLOATING:浮空输入
GPIO_Mode_IPD:下拉输入 GPIO_Mode_IPU:上拉输入
GPIO_Mode_Out_OD:开漏输出 GPIO_Mode_Out_PP:推挽输出
GPIO_Mode_AF_OD:复用开漏输出 GPIO_Mode_AF_PP:复用推挽输出
GPIO速度:
GPIO_Speed_2MHz
GPIO_Speed_10MHz
GPIO_Speed_50MHz
GPIO引脚声明:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x; x:1~15或者all
GPIO初始化函数:
GPIO_Init(GPIOx, &GPIO_InitStructure); x:A~G
注:需要定义GPIO结构体变量,GPIO_InitTypeDef GPIO_InitStructure;
3、PWM相关
#include "timer.h"
#include "led.h"
#include "usart.h"
//
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK战舰STM32开发板
//定时器 驱动代码
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//修改日期:2012/9/4
//版本:V1.1
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2009-2019
//All rights reserved
//********************************************************************************
//V1.1 20120904
//1,增加TIM3_PWM_Init函数。
//2,增加LED0_PWM_VAL宏定义,控制TIM3_CH2脉宽
//
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
LED1=!LED1;
}
}
//TIM4 PWM部分初始化
//PWM输出初始化 PB6 没有映射
//arr:自动重装值
//psc:时钟预分频数
void TIM4_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); //Timer2部分重映射 TIM4_CH1->PB6 没有映射
//设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形 GPIOB.6 没有映射 重映射的端口remap
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO PB.6
//GPIO_SetBits(GPIOB,GPIO_Pin_6); //PB.6 输出高
//初始化TIM4
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM2 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High 接高电平极性为高 接低电平输出极性为低TIM_OCPolarity_Low
TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 CH1 TIM_OC1PreloadConfig
// CH1的PWM脉冲波形
TIM_CtrlPWMOutputs(TIM4,ENABLE); //⑤MOE 主输出使能 非高级定时器可省略
TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR1上的预装载寄存器 TIM4 CH1
TIM_ARRPreloadConfig(TIM4, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器 非高级定时器可省略
TIM_Cmd(TIM4, ENABLE); //使能TIM4
}
//TIM3 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 PC7
//设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5 重映射的端口remap
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOC.7 重映射的端口remap
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO
//初始化TIM3
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM3 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIM3
}
//TIM2 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM2_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
//GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //Timer2部分重映射 TIM2_CH1->PA0 没有映射
//设置该引脚为复用输出功能,输出TIM2 CH1的PWM脉冲波形 GPIOA.0 重映射的端口remap 没有映射
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
//GPIO_SetBits(GPIOA,GPIO_Pin_0); //PB.5 输出高
//初始化TIM2
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//初始化TIM2 Channel2 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High 接高电平极性为高 接低电平输出极性为低TIM_OCPolarity_Low
TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM2 CH1 TIM_OC1PreloadConfig
// CH1的PWM脉冲波形
TIM_CtrlPWMOutputs(TIM2,ENABLE); //⑤MOE 主输出使能 非高级定时器可省略
TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器 TIM2 CH1
TIM_ARRPreloadConfig(TIM2, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器 非高级定时器可省略
TIM_Cmd(TIM2, ENABLE); //使能TIM2
}
//TIM1 PWM部分初始化
//高级定时器
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM1_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// ①使能 tim1 时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //①使能 GPIO 外设时钟使能
//设置该引脚为复用输出功能,输出 TIM1 CH1 的 PWM 脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为 TIMx 时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //②初始化 TIMx
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //脉宽调制模式 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //③初始化外设 TIMx
TIM_CtrlPWMOutputs(TIM1,ENABLE); //⑤MOE 主输出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1 预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器
TIM_Cmd(TIM1, ENABLE); //④使能 TIM1
}
4、ADC相关
最好需要重新初始化:ADC_DeInit(ADCx);
ADC工作模式选择:
ADC_Mode_Independent:独立工作
ADC_Mode_RegInjecSimult:混合同步+注入同步
ADC_Mode_RegSimult_AlterTrig:混合同步+交替触发
ADC_Mode_InjecSimult_FastInterl:混合同步+快速交替
ADC_Mode_InjecSimult_SlowInterl:混合同步+慢速交替
ADC_Mode_InjecSimult:注入同步
ADC_Mode_RegSimult:规则同步
ADC_Mode_FastInterl:快速交替
ADC_Mode_SlowInterl:慢速交替
ADC_Mode_AlterTrig:交替触发
通过ADC_InitStructure.ADC_Mode = XX进行赋值
ADC扫描使能:
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC连续 /单次模式选择:
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC转换控制方式:
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换
ADC数据对齐方式:ADC_DataAlign_Right:右对齐 / ADC_DataAlign_Right:左对齐
ADC_InitStructure.ADC_DataAlign =XX
ADC转换通道数:
ADC_InitStructure.ADC_NbrOfChannel = X // X=1~16
ADC初始化函数:
ADC_Init(ADCx, &ADC_InitStructure);
注:在开始要定义结构体变量 ADC_InitTypeDef ADC_InitStructure
是否使能ADCx DMA :
ADC_DMACmd(ADCx, ENABLE);
使能ADCx:
ADC_Cmd(ADCx, ENABLE);
初始化ADC1校准寄存器:
ADC_ResetCalibration(ADCx);
检测ADC1校准寄存器初始化是否完成:
while(ADC_GetResetCalibrationStatus(ADCx));
开始校准ADC1:
ADC_StartCalibration(ADCx);
检测是否完成校准:
while(ADC_GetCalibrationStatus(ADCx));
ADC1转换软件启动:
ADC_SoftwareStartConvCmd(ADCx, ENABLE);
5、DMA相关:
复位通道:
DMA_DeInit(DMAy_Channelx);//复位DMAy通道x,y=1时,x=1~7;y=2时,x=1~5
定义外设基地址,全局变量:
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//地址自己定义
如:#define ADC1_DR_Address ((u32)0x4001244C)
定义DMA存储器地址,全局变量u32
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //定义DMA通道存储器地址
如:volatile unsigned short int ADC_ConvertedValue[8];
DMA外设方向:
DMA_InitStructure.DMA_DIR = XX;
DMA_DIR_PeripheralSRC:外设为数据传输的来源,DMA_DIR_PeripheralDST:外设为数据传输的目的地
DMA传输数量寄存器值,即缓存大小,单位由MemoryDataSize或PeripheralDataSize决定:
DMA_InitStructure.DMA_BufferSize = x;
//定义DMA缓冲区大小x,如8通道ADC,则x就为8
DMA外设地址寄存器变不变:
DMA_InitStructure.DMA_PeripheralInc = x;
DMA_PeripheralInc_Disable:外设地址寄存器不变 DMA_PeripheralInc_Enable:外设地址寄存器递增
DMA内存地址寄存器变不变:
DMA_InitStructure.DMA_MemoryInc = X;
DMA_MemoryInc_Disable:内存地址寄存器不变 DMA_MemoryInc_Enable:内存地址寄存器递增
外设数据宽度:
DMA_InitStructure.DMA_PeripheralDataSize = X;
DMA_PeripheralDataSize_Byte 数据宽度为8位
DMA_PeripheralDataSize_HalfWord 数据宽度为16位
DMA_PeripheralDataSize_Word 数据宽度为32位
存储器数据宽度:
DMA_InitStructure.DMA_MemoryDataSize = X;
DMA_MemoryDataSize_Byte 数据宽度为8位
DMA_MemoryDataSize_HalfWord 数据宽度为16位
DMA_MemoryDataSize_Word 数据宽度为32位
模式选择:
DMA_InitStructure.DMA_Mode =x;
DMA_Mode_Circular: 循环模式
DMA_Mode_Normal:正常模式
通道软件优先级设置:
DMA_InitStructure.DMA_Priority =x;
DMA_Priority_VeryHigh 最高优先级
DMA_Priority_High 高优先级
DMA_Priority_Medium 中优先级
DMA_Priority_Low 低优先级
DMA内存到内存的传输使能:
DMA_InitStructure.DMA_M2M = x
DMA_M2M_Enable:使能
DMA_M2M_Disable:未使能
DMA初始化函数:
DMA_Init(DMAy_Channelx , &DMA_InitStructure);
DMA通道使能函数:
DMA_Cmd(DMAy_Channelx , ENABLE); //使能DMA通道1
注:在开始要定义结构体变量 DMA_InitTypeDef DMA_InitStructure
6、NVIC相关:
优先级组设定:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x);
NVIC_PriorityGroup_0: 0 bits for pre-emption priority
4 bits for subpriority
NVIC_PriorityGroup_1: 1 bits for pre-emption priority
3 bits for subpriority
NVIC_PriorityGroup_2: 2 bits for pre-emption priority
2 bits for subpriority
NVIC_PriorityGroup_3: 3 bits for pre-emption priority
1 bits for subpriority
NVIC_PriorityGroup_4: 4 bits for pre-emption priority
0 bits for subpriority
设置中断:
NVIC_InitStructure.NVIC_IRQChannel =x;
ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt*/
USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */
USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */
CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt*/
CAN1_SCE_IRQn = 22, /*!