文档库 最新最全的文档下载
当前位置:文档库 › STM32函数库之外部中断

STM32函数库之外部中断

STM32函数库之外部中断
STM32函数库之外部中断

新手入门使用 STM32 函数库之外部中断
作者:佚名 来源:本站原创 点击数: 756 更新时间:2013 年 06 月 12 日 【字体:大 中 小】
啥也不说,先看看我的外星人开发板上的按键原理图。
板子偷懒,或者叫充分利用 IO 口得上拉功能,这边没有加常见的上拉电阻。到时 候编程的时候使能 IO 的上拉就行了~看下面的接口知道了 KEY0 接到了 STM32 的 PA13 上!
曾经 CZZ 在梦里和我说过,STM32 的任何一个 IO 都能作为外部中断输入,哇塞, 超级强大! 参考一般的程序步骤如下: 1、系统初始化,如系统时钟初始化,使之进入 72MHZ 主频; 2、GPIO 配置,务必注意打开 GPIO 时钟时,一定打开 AFIO 时钟。 3、EXTI 配置,在这里配置需要选择哪个引脚作为中断引脚。 4、NVIC 配置,这也是比单片机多出来的部分,我们必须把 NVIC 中对应的通道使 能,并且设置优先级别。 5、使用 while(1)进行死循环,并在中断程序中写入中断发生时应如何处理。 按照上面的方法一步步就能实现功能了~ 首选,定义相关结构体,

GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
第二步,配置IO及其功能, GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 得代码,便于观察! GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_SET); 灭LED //上电立马熄 //此处是配置LED灯
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; 13上拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure);
//配置PA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABL E); //务必打开GPIOA和AFIO时钟!!! 第三步,配置外部中断,相当于单片机的中断设置。 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource1 3); //配置A口得13脚为中断 EXTI_ClearITPendingBit(EXTI_Line13); 不加也没得问题,但是保险一下! //清除中断,貌似
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; /外部中断 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Fallin g; //下降沿触发 EXTI_InitStructure.EXTI_Line = EXTI_Line13;


EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); 第四步,配置NVIC,这个也是STM32的特色吧~ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQ n; //通道13属于15-10之间,它们几个是共用的! NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //占先优先级0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级0 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); while(1); //死等中断发生
第五步,中断处理函数ISR编写,在内个 stm32f10x_it.c 中~加入下面的代码。 void EXTI15_10_IRQHandler(void) { if ( EXTI_GetITStatus(EXTI_Line13) == SET) 否是13脚的中断 { EXTI_ClearITPendingBit(EXTI_Line13); 中断标志位! GPIO_WriteBit(GPIOA,GPIO_Pin_8,Bit_RESET); 亮LED } } 好了,程序完成~测试一下ok! //点 //清除 //判断是

相关文档