微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于STM32的外部中断

关于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);       
        }
}

库函数看的很累,,建议找个工作正常的例程参考,我一般都是用寄存器

然后自己写自己的库函数

百度一下,很多这方面例程

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

网站地图

Top