therefore句首:stm32简单按键中断
来源:百度文库 编辑:中财网 时间:2024/05/13 16:34:07
2011-01-31 09:58:54| 分类: STM32 | 标签:优先级 stm32 中断 led |字号大中小 订阅
2个按键中断,控制2个LED
Main文件
#include "stm32f10x.h"
void RCC_Configuration(void);
void GPIO_Configuration(void);
void EXTI_Configuration(void);//外部中断设置
void NVIC_Configuration(void);//中断优先级别设置
unsigned char led_bit1=0;
unsigned char led_bit2=0;
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
EXTI_Configuration();
NVIC_Configuration();
GPIO_SetBits(GPIOA, GPIO_Pin_0);
GPIO_SetBits(GPIOA, GPIO_Pin_1);
while(1);
}
void RCC_Configuration(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_8 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure);
}
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource3);
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource8);
EXTI_InitStructure.EXTI_Line = EXTI_Line8;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Configuration(void)
{
/*
查看固件库手册,关于中断部分NVIC_IRQChannel
PA3、PA8分别设置
EXTI3_IRQChannel 外部中断线 3 中断
EXTI9_5_IRQChannel 外部中断线 9-5 中断
关于 中断线 ,查看STM32 Reference Manual 的 9.2.5 外部中断/事件线路映像
stm32使用了4个位来保存优先级别
查固件库
Table 273. 先占优先级和从优先级值
占先优先级->主
副优先级 ->次
号码越小,等级越高
判断主的级别->一个高一个低->ok
判断主的级别->两个都相同 ->判断次的级别->一个高一个低->ok
判断主的级别->两个都相同 ->判断次的级别->两个都相同 ->按照列表顺序运行
*/
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //占先优先级、副优先级的资源分配
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //指定中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //占先优先级设定
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //副优先级设定
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStructure);
}
stm32f10x_it.c中加入
extern unsigned char led_bit1,led_bit2;
void EXTI9_5_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line8) != RESET)
{
//添加中断处理程序
if(led_bit1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
led_bit1=0;
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
led_bit1=1;
}
EXTI_ClearFlag(EXTI_Line8);
}
}
void EXTI3_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line3) != RESET)
{
if(led_bit2)
{
GPIO_SetBits(GPIOA, GPIO_Pin_0);
led_bit2=0;
}
else
{
GPIO_ResetBits(GPIOA, GPIO_Pin_0);
led_bit2=1;
}
EXTI_ClearFlag(EXTI_Line3);
}
}
Bkey推荐阅读:- 大量学习资料,强烈推荐2009-06-08 17:38:51