移植野火代码到正点上(没有报错,但是实验未成功,求解)
一、EXIT简介(外部中断/事件控制器)
二、EXTI初始化结构体
EXTI_InitTypeDef
1-EXTI_Line:用于产生中断/事件 线
2-EXTI_Mode:EXTI模式(中断/事件)
3-EXTI_Trigger:触发(上/下/上下)
4-EXTI_LineCmd:使能或者失能(IMR/EMR)
三、实验 (编程要点)
1.初始化要连接到EXTI的GPIO
2.初始化EXTI用于产生中断/事件
3.初始化NVIC,用于处理中断
4.编写中断服务函数
5.main函数
新建bsp_exti.c
#include "bsp_exti.h"
void EXTI_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel=EXTI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI_Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
//配置中断优先级
EXTI_NVIC_Config();
//初始化GPIO
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //使能PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
//初始化EXTI
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //GPIO作用EXTI中断必须开AFIO时钟(AFIO包含一些控制寄存器,其中有外部中断EXTI)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
bsp_exti.h
#ifndef _BSP_EXTI_H
#define _BSP_EXTI_H
#include "stm32f10x.h"
#define LED1 PEout(5)// PB5
void EXTI_NVIC_Config(void);
void EXTI_Key_Config(void);
#endif
led.h
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define LED0 PBout(5)// PB5
#define LED1 PEout(5)// PE5
#define LED_G_TOGGLE {GPIOE->ODR^=GPIO_Pin_5;}
void LED_Init(void);//初始化
#endif
led.c
#include "led.h"
//初始化PB5和PE5为输出口.并使能这两个口的时钟
//LED IO初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED1-->PE.5 端口配置, 推挽输出
GPIO_Init(GPIOE, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
}
stm32f10x_it.c
加上函数
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line4)!=RESET)
{
LED_G_TOGGLE;
}
EXTI_ClearITPendingBit(EXTI_Line4);
}
记得在stm32f10x_it.h定义
void EXTI0_IRQHandler(void);
main.c
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "bsp_exti.h"
int main(void)
{
vu8 key=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
EXTI_Key_Config();
LED1=0; //先点亮红灯
while(1)
{
}
}
编译时出现报错
解决办法:
将stm32f10x_exti.c路径加入。
编译不报错,但是实验版并没有实现按键中断使灯点灭情况。