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

stm32单片机外部中断出现程序的问题

时间:10-02 整理:3721RD 点击:
#include <stm32f10x_lib.h>
u32 LED;
void RCC_Configuration()    //配置STM32的时钟 & 打开IO口时钟
{
   ErrorStatus HSEStartUpStatus;//定义外部高速晶体启动状态枚举变量
   RCC_DeInit();//复位RCC外部设备寄存器到默认值
   RCC_HSEConfig(RCC_HSE_ON);//打开外部高速晶振
   HSEStartUpStatus=RCC_WaitForHSEStartUp();//等待外部高速时钟准备好
   if(HSEStartUpStatus==SUCCESS)//外部高速时钟已经准备好
   {
      FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  //选择FLASH预取指缓存的模,预取指缓存使能
   FLASH_SetLatency(FLASH_Latency_2);      //设置FLASH存储器延时时钟周期数  FLASH_Latency_2  2延时周期
   RCC_HCLKConfig(RCC_SYSCLK_Div1);//配置AHB(HCLK)时钟=SYSCLK
   RCC_PCLK2Config(RCC_HCLK_Div1);//配置APB2(PCLK2)时钟=AHB时钟
   RCC_PCLK1Config(RCC_HCLK_Div2);//配置APB1(PCLK1)时钟=AHB 1/2时钟
   RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);//配置PLL时钟=外部高速晶体时钟*9
   RCC_PLLCmd(ENABLE);//使能PLL时钟
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)//等待PLL时钟就绪
   {}
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//配置系统时钟=PLL时钟
   while(RCC_GetSYSCLKSource()!=0x08)//检查PLL时钟是否作为系统时钟
   {}
   }
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOE,ENABLE); //允许GPIOC、GPIOE时钟 这里根据要输出的IO口设置         
}
void GPIO_Configuration(void)     //配置STM32的GPIO口功能
{
GPIO_InitTypeDef GPIO_InitStructure;   //定义GPIO初始化结构
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;    //指定IOC口的引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //指定IOC口的模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //指定速度
GPIO_Init(GPIOC,&GPIO_InitStructure);    //设置使之有效(真正的初始化IO端口和端口设置)
/* GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;    //指定IOE口的引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //指定IOE口的模式
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//指定速度    */
GPIO_Init(GPIOE,&GPIO_InitStructure);       //设置使之有效(真正的初始化IO端口和端口设置)
}
void delay_ms(u16 T)
{
    u16 i,j;
for(i=0;i<T;i++)
for(j=0;j<6000;j++);
}
void EXTIX_Init()
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void)
{
    u32 KEY0;
KEY0=GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3);
delay_ms(10);
if(KEY0==1)
{
  LED=!LED;
}
EXTI_ClearITPendingBit(EXTI_Line2);
}
int main()
{
RCC_Configuration();
    GPIO_Configuration();                  //对IO口进行初始化
EXTIX_Init();
LED=0;
while(1);
}
最后编译的过程中却出现了这样的问题:
...\list\GPIO_0.axf: Error: L6200E: Symbol EXTI0_IRQHandler multiply defined (by main.o and stm32f10x_it.o).
Target not created

有些文件没包含进去,我之前也碰到过这个问题。 你再加载些头文件

中断函数重复定义了。

我将 stm32f10x_it.c中的关于EXTI0_IRQHandler的定义注释掉了,编译成功了。

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

网站地图

Top