#include "stm32f10x.h" // Device header
void CountSensor(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
EXTI_InitTypeDef EXTI_InitStructure ;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = ENABLE ;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt ;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling ;
EXTI_Init(&EXTI_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//在配置中断之前,先指定一下配置中断的分组
//配置优先级分组,先占优先级(抢占)和从占(响应)优先级。
//中断不多所以不太会导致中断冲突,所以分组比较随意,这里选择第二组,比较均衡
//分组方式整个芯片只能用一种,所以这个分组的代码整个工程只需要执行以此就可以了。
//如果放在模块里分组,那么需要保证每个分组选的组都是同一个。
//也可以将此处的分组函数直接放到主函数里,这样模块不需要再次进行分组。
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn ;//指定中断通道开启或者关闭,
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE ;//EXTI10-15都是合并到了这个通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1 ; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1 ; //相应优先级
//不同的分组参数有不同的取值范围,并且取值在中断产生拥挤的时候起作用。
//这里中断少,比较随意
NVIC_Init(&NVIC_InitStructure);
}
主要是有关于中断函数的。函数初始化分为五部分,如PPT
这是江科大PPT资料。
首先需要打开外设的时钟,表现在函数里是由两行的第一部分,打开了属于APB2的GPIOB和AFIO的时钟。EXTI和NVIC的外设一直属于打开的状态。其中EXTI的外设一直开启原因未知。NVIC由于属于内核,所以不需要单独开启时钟。
第二步,初始化GPIO口,GPIO_Init()有两个参数,其中第一个是选择需要打开的口,这里是GPIOB,然后再取结构体名称的地址。
然后定义结构体变量,总共有三个。第一个是模式,此处为IPU上拉输入;第二个是Pin口,这里是14:第三个是速度,一般为50MHz;
第三步,配置中断引脚。这里的函数时GPIO_EXTILineConfig()虽然写着是GPIO的函数,但实际上是控制AFIO的。总共两个参数(两个source)一个是port(也就是输入端口为GPIOB)另一个是pin(固定为14号)
第四步,初始化EXTI。函数为EXTI_Init(),同样也是结构体参数。不过只有一个,因为输入已经固定。
结构体参数有四个。
- 第一个选择为第14号线
- 第二个状态控制选择打开
- 第三个模式选择中断模式(另一个是事件中断)
- 第四个意为触发方式(Trigger)选择下降沿触发
第五步。NVIC的初始化。
初始化之前需要进行分组。整个工程只需要运行一次。可以放在主函数,也可以放在模块中运行,但是需要保证分组的一致。如都是2组或者都是3组。
同样一个参数,需要结构体命名。
结构体总共有四个参数
- 在这个工程中主要的就是第一个参数。指定开启关闭的通道。在这里信道10-15都在EXTI15_10_IRQn中。然
- 第二个参数选择开启。
- 第三个为抢占优先级
- 第四个为相应优先级
这两个参数的范围随分组改变。在中断拥挤的时候起作用。此工程中断少,参数随意。所只需要保证在范围之内就可以。