关于STM32的外部中断
时间:10-02
整理:3721RD
点击:
大家帮我看看为什么PB.2那个中断没有反应?非常谢谢!
#include "stm32f10x.h"
#include <stdio.h>
#include "delay.h"
//RCC????
void RCC_Configuration(void)
{
//-----------ê1ó?ía2?RC?§??-----------------
RCC_DeInit(); //3?ê??ˉ?aè±ê??μ×′ì?
RCC_HSEConfig(RCC_HSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08);
}
//GPIOéè??
void GPIO_Config (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ê1?üPA???úê±?ó
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11); // ???ú????GPIOA3£?4£?5£?6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //í?íìê?3?
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO?ú?ù?è?a50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //?ù?Yéè?¨2?êy3?ê??ˉGPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO, ENABLE); //ê1?üPB???úê±?ó
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_2|GPIO_Pin_4);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //é?à-ê?è?
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //?ù?Yéè?¨2?êy3?ê??ˉ GPIOB
}
//PWMê?3?
void TIM3_PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //¢ùê1?ü?¨ê±?÷ 2 ê±?ó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //¢ùê1?ü GPIOA£?B???ú
//éè????òy???a?′ó?ê?3?1|?ü,ê?3? TIM2 μ? PWM ??3?2¨D?
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_6|GPIO_Pin_7); //TIM_CH1,2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //?′ó?í?íìê?3?
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //¢ù3?ê??ˉ GPIOA
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1); //TIM_CH3,4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //?′ó?í?íìê?3?
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //¢ù3?ê??ˉ GPIOB
//3?ê??ˉ TIM3
TIM_TimeBaseStructure.TIM_Period = 1000; //éè???ú×??ˉ??×°???ü?ú?μ
TIM_TimeBaseStructure.TIM_Prescaler =0; //éè???¤·??μ?μ
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//éè??ê±?ó·???:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM ?òé???êy?£ê?
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¢?3?ê??ˉ TIM3
//3?ê??ˉ TIM3 Channel2 PWM ?£ê?
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //???? PWM ?£ê? 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è??ê?3?ê1?ü
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ê?3???D???
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //¢ü3?ê??ˉíaéè TIM3 OC1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1?ü?¤×°????′??÷
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //¢ü3?ê??ˉíaéè TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1?ü?¤×°????′??÷
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //¢ü3?ê??ˉíaéè TIM3 OC3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1?ü?¤×°????′??÷
TIM_OC4Init(TIM3, &TIM_OCInitStructure); //¢ü3?ê??ˉíaéè TIM3 OC4
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1?ü?¤×°????′??÷
TIM_ARRPreloadConfig(TIM3, ENABLE); //ê1?üTIM3??????′??÷AR
TIM_Cmd(TIM3, ENABLE); //¢Yê1?ü TIM3
}
//ía2??D?? 0 ·t??3ìDò
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// EXTI_ClearITPendingBit(EXTI_Line2);
// EXTI_ClearITPendingBit(EXTI_Line4);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//GPIOB.2?D????ò??°?D??3?ê??ˉ????
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource2);
EXTI_DeInit();
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling; //???μ??′¥·¢
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //3?ê??ˉ?D????2?êy
//GPIOB.4?D????ò??°?D??3?ê??ˉ????
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);
EXTI_DeInit();
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //???μ??′¥·¢
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //3?ê??ˉ?D????2?êy
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //ê1?üía2??D??í¨μà
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //?à??ó??è?? 0£?
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×óó??è?? 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ê1?üía2??D??í¨μà
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //ê1?üía2??D??í¨μà
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //?à??ó??è?? 0£?
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //×óó??è?? 1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ê1?üía2??D??í¨μà
NVIC_Init(&NVIC_InitStructure);
}
//ía2??D??0·t??3ìDò
void EXTI3_IRQHandler(void)
{
// EXTI_ClearITPendingBit(EXTI_Line4);
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_5| GPIO_Pin_8| GPIO_Pin_11);
GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4| GPIO_Pin_9| GPIO_Pin_10);
}
}
EXTI_ClearITPendingBit(EXTI_Line3); //??3yLINE0é?μ??D??±ê????
}
void EXTI4_IRQHandler(void)
{
// EXTI_ClearITPendingBit(EXTI_Line3);
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_3 | GPIO_Pin_9| GPIO_Pin_10);
GPIO_ResetBits(GPIOA,GPIO_Pin_2| GPIO_Pin_5| GPIO_Pin_4| GPIO_Pin_8| GPIO_Pin_11);
}
}
EXTI_ClearITPendingBit(EXTI_Line4); //??3yLINE1é?μ??D??±ê????
}
int main(void)
{
delay_init();
RCC_Configuration();
GPIO_Config();
EXTIX_Init();
TIM3_PWM_Init();
//GPIO_SetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_4| GPIO_Pin_8| GPIO_Pin_10);
//GPIO_ResetBits(GPIOA,GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_9| GPIO_Pin_11);
while(1)
{delay_ms(1);
GPIO_SetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_4| GPIO_Pin_8| GPIO_Pin_10);
GPIO_ResetBits(GPIOA,GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_9| GPIO_Pin_11);
}
}
#include "stm32f10x.h"
#include <stdio.h>
#include "delay.h"
//RCC????
void RCC_Configuration(void)
{
//-----------ê1ó?ía2?RC?§??-----------------
RCC_DeInit(); //3?ê??ˉ?aè±ê??μ×′ì?
RCC_HSEConfig(RCC_HSE_ON);
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
RCC_HCLKConfig(RCC_SYSCLK_Div1);
RCC_PCLK2Config(RCC_HCLK_Div1);
RCC_PCLK1Config(RCC_HCLK_Div2);
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
RCC_PLLCmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while(RCC_GetSYSCLKSource()!=0x08);
}
//GPIOéè??
void GPIO_Config (void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //ê1?üPA???úê±?ó
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11); // ???ú????GPIOA3£?4£?5£?6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //í?íìê?3?
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO?ú?ù?è?a50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //?ù?Yéè?¨2?êy3?ê??ˉGPIOA
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB |RCC_APB2Periph_AFIO, ENABLE); //ê1?üPB???úê±?ó
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_2|GPIO_Pin_4);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //é?à-ê?è?
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //?ù?Yéè?¨2?êy3?ê??ˉ GPIOB
}
//PWMê?3?
void TIM3_PWM_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //¢ùê1?ü?¨ê±?÷ 2 ê±?ó
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //¢ùê1?ü GPIOA£?B???ú
//éè????òy???a?′ó?ê?3?1|?ü,ê?3? TIM2 μ? PWM ??3?2¨D?
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_6|GPIO_Pin_7); //TIM_CH1,2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //?′ó?í?íìê?3?
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //¢ù3?ê??ˉ GPIOA
GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1); //TIM_CH3,4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //?′ó?í?íìê?3?
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //¢ù3?ê??ˉ GPIOB
//3?ê??ˉ TIM3
TIM_TimeBaseStructure.TIM_Period = 1000; //éè???ú×??ˉ??×°???ü?ú?μ
TIM_TimeBaseStructure.TIM_Prescaler =0; //éè???¤·??μ?μ
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//éè??ê±?ó·???:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM ?òé???êy?£ê?
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //¢?3?ê??ˉ TIM3
//3?ê??ˉ TIM3 Channel2 PWM ?£ê?
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //???? PWM ?£ê? 2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //±è??ê?3?ê1?ü
TIM_OCInitStructure.TIM_Pulse = 500;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //ê?3???D???
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //¢ü3?ê??ˉíaéè TIM3 OC1
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1?ü?¤×°????′??÷
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //¢ü3?ê??ˉíaéè TIM3 OC2
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1?ü?¤×°????′??÷
TIM_OC3Init(TIM3, &TIM_OCInitStructure); //¢ü3?ê??ˉíaéè TIM3 OC3
TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1?ü?¤×°????′??÷
TIM_OC4Init(TIM3, &TIM_OCInitStructure); //¢ü3?ê??ˉíaéè TIM3 OC4
TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable); //ê1?ü?¤×°????′??÷
TIM_ARRPreloadConfig(TIM3, ENABLE); //ê1?üTIM3??????′??÷AR
TIM_Cmd(TIM3, ENABLE); //¢Yê1?ü TIM3
}
//ía2??D?? 0 ·t??3ìDò
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// EXTI_ClearITPendingBit(EXTI_Line2);
// EXTI_ClearITPendingBit(EXTI_Line4);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//GPIOB.2?D????ò??°?D??3?ê??ˉ????
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource2);
EXTI_DeInit();
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line=EXTI_Line2;
EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Falling; //???μ??′¥·¢
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //3?ê??ˉ?D????2?êy
//GPIOB.4?D????ò??°?D??3?ê??ˉ????
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource4);
EXTI_DeInit();
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //???μ??′¥·¢
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //3?ê??ˉ?D????2?êy
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //ê1?üía2??D??í¨μà
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //?à??ó??è?? 0£?
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //×óó??è?? 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ê1?üía2??D??í¨μà
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //ê1?üía2??D??í¨μà
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //?à??ó??è?? 0£?
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //×óó??è?? 1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ê1?üía2??D??í¨μà
NVIC_Init(&NVIC_InitStructure);
}
//ía2??D??0·t??3ìDò
void EXTI3_IRQHandler(void)
{
// EXTI_ClearITPendingBit(EXTI_Line4);
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_3)==0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_5| GPIO_Pin_8| GPIO_Pin_11);
GPIO_ResetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4| GPIO_Pin_9| GPIO_Pin_10);
}
}
EXTI_ClearITPendingBit(EXTI_Line3); //??3yLINE0é?μ??D??±ê????
}
void EXTI4_IRQHandler(void)
{
// EXTI_ClearITPendingBit(EXTI_Line3);
{
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4)==0)
{
GPIO_SetBits(GPIOA, GPIO_Pin_3 | GPIO_Pin_9| GPIO_Pin_10);
GPIO_ResetBits(GPIOA,GPIO_Pin_2| GPIO_Pin_5| GPIO_Pin_4| GPIO_Pin_8| GPIO_Pin_11);
}
}
EXTI_ClearITPendingBit(EXTI_Line4); //??3yLINE1é?μ??D??±ê????
}
int main(void)
{
delay_init();
RCC_Configuration();
GPIO_Config();
EXTIX_Init();
TIM3_PWM_Init();
//GPIO_SetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_4| GPIO_Pin_8| GPIO_Pin_10);
//GPIO_ResetBits(GPIOA,GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_9| GPIO_Pin_11);
while(1)
{delay_ms(1);
GPIO_SetBits(GPIOA, GPIO_Pin_2 | GPIO_Pin_4| GPIO_Pin_8| GPIO_Pin_10);
GPIO_ResetBits(GPIOA,GPIO_Pin_3| GPIO_Pin_5| GPIO_Pin_9| GPIO_Pin_11);
}
}
库函数看的很累,,建议找个工作正常的例程参考,我一般都是用寄存器
然后自己写自己的库函数
百度一下,很多这方面例程