中断
(即在主程序运行过程中,转去断点运行,结束再返回主程序)

1.使用NVIC统一管理中断,有16个优先级。
GPIO端口的设置引脚位(GPIO端口有A、B、、、,引脚分别有16个),随即输出到AFIO进行中断引脚选择,然后连接EXTI中断线路,最后利用NVIC对中断优先级进行定义。
2.此时GPIO中断条件为输入,所以GPIO初始化采用上拉输入。至于为什么上拉输入,这里默认高电平,接入按钮或者对射式红外等外设并操作时变为低电平,才会工作。
3.AFIO映射中断,有16条引脚,与GPIO 引脚一一对应。
4.EXTI 为外部中断控制器,通过配置 EXTI 控制器监听中断引脚信号并产生中断请求。
5.NVIC 进行中断优先级设置。分为抢占优先级和响应优先级,抢占优先级越小,优先级越高;
6.最后利用中断服务函数例如void EXTI15_10_IRQHandler(void) 实现中断响应。

/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启AFIO的时钟,外部中断必须开启AFIO的时钟
/*GPIO初始化*/
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); //将PB14引脚初始化为上拉输入
/*AFIO选择中断引脚*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);//将外部中断的14号线映射到GPIOB,即选择PB14为外部中断引脚
/*EXTI初始化*/
EXTI_InitTypeDef EXTI_InitStructure; //定义结构体变量
EXTI_InitStructure.EXTI_Line = EXTI_Line14; //选择配置外部中断的14号线
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //指定外部中断线使能
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //指定外部中断线为中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //指定外部中断线为下降沿触发
EXTI_Init(&EXTI_InitStructure); //将结构体变量交给EXTI_Init,配置EXTI外设
/*NVIC中断分组*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //配置NVIC为分组2
//即抢占优先级范围:0~3,响应优先级范围:0~3
//此分组配置在整个工程中仅需调用一次
//若有多个中断,可以把此代码放在main函数内,while循环之前
//若调用多次配置分组的代码,则后执行的配置会覆盖先执行的配置
/*NVIC配置*/
NVIC_InitTypeDef NVIC_InitStructure; //定义结构体变量
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //选择配置NVIC的EXTI15_10线
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //指定NVIC线路使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //指定NVIC线路的抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //指定NVIC线路的响应优先级为1
NVIC_Init(&NVIC_InitStructure); //将结构体变量交给NVIC_Init,配置NVIC外设
定时中断
(对输入时钟进行计数,并在计数值达到设定值时触发中断)
- 高级、通用、基本计时器。(1,8–APB2; 2~5–APB1; 6,7–APB1 ) STM32F103C8T6有TIM1~4
。。。。。。有点难,明天再看
2625

被折叠的 条评论
为什么被折叠?



