微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32学习笔记——外部中断EXTI

STM32学习笔记——外部中断EXTI

时间:11-28 来源:互联网 点击:

学习笔记

forSTM32F103C8

redesignedbyzhangbin

2012-10-30

versions:V-0.1

AllRightsReserved

main.c如下,注释的比较详细,把下面的例子即说明都看明白基本上就可以用了:

//抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。

//EXTI:外部中断/事件控制器

//EXTI控制器可以产生高达19个软件事件/中断请求

//将19根线配置为中断源,将19根线配置为事件源,将19根线配置为软件中断/事件线,详见《STM32F103xxx使用手册》

//P135

//在这个文件中主要是进行各种初始化配置,包括GPIO配置、EXTI配置、系统时钟配置等

//中断服务程序则在stm32f10x_it.c文件中,该文件提供所有异常处理程序和外围中断服务程序的模板,详见该文件

#include"stm32f10x_lib.h"

EXTI_InitTypeDefEXTI_InitStructure;//定义外部中断初始化结构体变量内部含有4个成员详见EXTI_InitTypeDef的定义

ErrorStatusHSEStartUpStatus;//定义错误状态变量,是枚举类型

voidRCC_Configuration(void);

voidGPIO_Configuration(void);

voidNVIC_Configuration(void);

intmain(void)

{

#ifdefDEBUG

debug();

#endif

RCC_Configuration();//系统时钟配置

NVIC_Configuration();//NVIC配置

GPIO_Configuration();//配置GPIO

//STM32的外部中断不是固定的,是可以映射的。如EXTI6既可以映射到PB6也可以映射到PA6,详见外部中断/事件与GPIO的映射关系

//将IO端口注册至中断线(将IO口映射到中断线N)

//

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);//选择GPIO管脚用作外部中断线路

//第一个参数选择用作外部中断线源的GPIO端口第二个参数是待设置的外部中断线路,可以是GPIO_PinSourcex(x可以0~15)

//配置按钮中断线触发方式设置中断配置结构体成员

EXTI_InitStructure.EXTI_Line=EXTI_Line6;//选择外部中断线EXTI_Line0~EXTI_Line18共19根线

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置为中断请求,可以为EXTI_Mode_Interrupt中断请求或者

//EXTI_Mode_Event事件请求

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//触发方式下降沿触发还可以为EXTI_Trigger_Rising上升沿触发或者

//EXTI_Trigger_Rising_Falling上升沿下降沿触发

EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中断线使能ENABLE使能,DISABLE失能

EXTI_Init(&EXTI_InitStructure);//根据参数结构体初始化EXTI中断

EXTI_GenerateSWInterrupt(EXTI_Line6);//产生一个软件中断EXTI_Line6中断允许

//到此中断配置完成,可以写中断处理函数。

while(1)

{

}

}

voidRCC_Configuration(void)

{

//复位RCC外部设备寄存器到默认值

RCC_DeInit();

//打开外部高速晶振

RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速时钟准备好

HSEStartUpStatus=RCC_WaitForHSEStartUp();

//外部高速时钟已经准别好

if(HSEStartUpStatus==SUCCESS)

{

FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

FLASH_SetLatency(FLASH_Latency_2);

//配置AHB(HCLK)时钟=SYSCLK

RCC_HCLKConfig(RCC_SYSCLK_Div1);

//配置APB2(PCLK2)钟=AHB时钟

RCC_PCLK2Config(RCC_HCLK_Div1);

//配置APB1(PCLK1)钟=AHB1/2时钟

RCC_PCLK1Config(RCC_HCLK_Div2);

//配置ADC时钟=PCLK21/4

RCC_ADCCLKConfig(RCC_PCLK2_Div4);

//配置PLL时钟==外部高速晶体时钟*98MHz*9MHz=72MHz

RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);

//配置ADC时钟=PCLK2/4

RCC_ADCCLKConfig(RCC_PCLK2_Div4);

//使能PLL时钟

RCC_PLLCmd(ENABLE);

//等待PLL时钟就绪

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)

{

}

//配置系统时钟=PLL时钟

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//检查PLL时钟是否作为系统时钟

while(RCC_GetSYSCLKSource()!=0x08)

{

}

}

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB

|RCC_APB2Periph_AFIO,ENABLE);

//使能GPIOA,GPIOB和AFIO的APB2

}

voidGPIO_Configuration(void)

{

GPIO_InitTypeDefGPIO_InitStructure;//定义配置GPIO的结构体

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//选中第8个脚

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出

GPIO_Init(GPIOB,&GPIO_InitStructure);//用配置好的结构体初始化GPIOBPB8用于驱动led

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//选中6脚

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置浮空输入

GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOBPB6脚连接外部中断线6的中断源

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top