本帖最后由 lmon 于 2017-9-20 22:31 编辑
mark一下:程序总共需要配置三个地方,一个void NVIC_PZ( )配置中断优先级啥的,一个void GPIO_PZ( )配置IO口,一个void EXTI_PZ( )配置外部中断。最后再写一个外部中断0中断函数void EXTI0_IRQHandler(void)
#include "STM32f10x.h"
void delay(unsigned int u)
{
unsigned int i=0,j=0;
for(i=0;i<u;i++)
for(j=0;j<12000;j++);
}
void NVIC_PZ(void)
{
NVIC_InitTypeDef n;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置2位为抢占式优先级,2位为响应式优先级
n.NVIC_IRQChannel = EXTI0_IRQn;//外部中断0中断
n.NVIC_IRQChannelPreemptionPriority=2;// 抢占优先级为2
n.NVIC_IRQChannelSubPriority = 2;// 子优先级位2
n.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能,开总中断开关
NVIC_Init(&n); //根据上面指定的参数初始化NVIC寄存器
NVIC_EnableIRQ(EXTI0_IRQn);//开EXTI0中断
}
void GPIO_PZ( )
{ //PC13配置为推挽输出
GPIO_InitTypeDef g;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
g.GPIO_Pin=GPIO_Pin_13;
g.GPIO_Speed=GPIO_Speed_50MHz;
g.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&g);
//PA0配置为上拉输入
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
g.GPIO_Pin=GPIO_Pin_0;
g.GPIO_Speed=GPIO_Speed_50MHz;
g.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOA,&g);
}
void EXTI_PZ( )
{
EXTI_InitTypeDef e;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
e.EXTI_Line=EXTI_Line0;
e.EXTI_Mode=EXTI_Mode_Interrupt;
e.EXTI_Trigger=EXTI_Trigger_Rising_Falling;
e.EXTI_LineCmd=ENABLE;
EXTI_Init(&e);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//PA0映射到EXTI0
}
int main()
{
SystemInit( );//时钟初始化到72mhz
NVIC_PZ();
GPIO_PZ();
EXTI_PZ();
while(1)
{
//
}
}
void EXTI0_IRQHandler(void)
{
delay(10);//消抖
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0) //PA0按键
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
else GPIO_SetBits(GPIOC,GPIO_Pin_13);
EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
}
一周热门 更多>