|
试验目的:本次试验用按键来控制两个LED,使用外部中断的方式来触发
试验平台:基于STM32F103C8T6的彩屏开发板
接口:KEY1——PA9
KEY2——PA10
LED1——PA11
LED2——PA12
试验基本步骤:1)初始化IO 口为输入。
2)开启IO 口复用时钟,设置IO 口与中断线的映射关系。
3)开启与该IO 口相对的线上中断/事件,设置触发条件。
4)配置中断分组(NVIC),并使能中断。
5)编写中断服务函数。
程序代码:led.c led.h key.h key.c 和之前的按键以致
新加的exit.h
#ifndef EXIT_H
#define EXIT_H
void EXTIX_Init(void);
#endif
仅仅是申明了一个中断初始化函数
exit.c
#include<stm32f10x_lib.h>
#include"common.h"
#include"exit.h"
#include"key.h"
#include"led.h"
void EXTI15_10_IRQHandler(void) //中断服务函数
{
delay_ms(10); //消抖
if(KEY1==0) //按键0
{
LED1=!LED1;
}else if(KEY2==0)//按键1
{
LED2=!LED2;
}
EXTI->PR=1<<11; //清除LINE13上的中断标志位
EXTI->PR=1<<12; //清除LINE15上的中断标志位
}
void EXTIX_Init(void)
{
RCC->APB2ENR|=1<<2;
GPIOA->CRH&=0xfff00fff; //配置为推挽输出
GPIOA->CRH|=0x00088000;
GPIOA->ODR|=1<<11; //拉高
GPIOA->ODR|=1<<12;
Ex_NVIC_Config(GPIO_A,11,FTIR); //下降沿触发
Ex_NVIC_Config(GPIO_A,12,FTIR);
MY_NVIC_Init(2,1,EXTI15_10_IRQChannel,2); //抢占2,子优先级1,组2
}
exit.c 文件总共包含2个函数。一个是外部中断初始化函数voidEXTIX_Init(void),另外一个是中断服务函数。voidEXTI15_10_IRQHandler(void)是外部中断10~15 的中断服务函数,这里
我们是用了中断11 和12,这两个中断共用一个中断服务函数。下面我们分别介绍这几个函数。
首先是外部中断初始化函数 void EXTIX_Init(void),该函数严格按照我们之前的步骤来初
始化外部中断,这里面调用了两个函数 Ex_NVIC_Config和MY_NVIC_Init,其作用是设置中断的触发方式和中断的优先级。KEY1 和KEY2 是低电平有效的,KEY1
和KEY2 设置成上拉输入。当中断触发的时候,而KEY1 和
KEY2 会产生下降沿。这里我们把分配到第二组。
接 下 来 我 们 介 绍 中 断 服 务 函 数 。 中
断服务函数void EXTI15_10_IRQHandler(void),从
函数名就可以看出是给中断线10~15 服务的,也就是多个中断线上的中断共用一个中断服务函
数。在该函数里面我们先对进入中断的信号进行区分(通过中断输入IO 口上的电平判断),再
分别进行处理。最后也是通过向EXTI->PR 的对应位写1 清除中断线上的中断请求。
主函数main.c
//外部中断的实验,有两个按键来触发控制LED
#include<stm32f10x_lib.h>
#include"common.h"
#include"led.h"
#include"exit.h"
int main(void)
{
Stm32_Clock_Init(9);//系统时钟初始化
delay_init(72);//延时函数的初始化
LED_Init();//LED灯的初始化
EXTIX_Init();//外部中断的初始化
while(1)
{ }//等待中断
}
|
|