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
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的定义注释掉了,编译成功了。