我用的是ministm32的板子,我的LED0:PA8, LED1:PD2, KEY_UP A0。
程序:LED0与LED1运行的时候先点亮,然后按下KEY_UP以后全灭。
错误:坑爹的是按下KEY_UP以后板子没反应,反而按下KEY1的时候板子有反应,但也没有达到程序的效果,能不能帮我看下代码?
这是main.c里面的函数
/*Include---------------------------*/
#include"stm32f10x_lib.h" //包含所有的头文件
#include<stdio.h>
//----------------函数声明--------------------
void Delay_MS(u16 dly);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void Ls164_Send(u8 data);
void USART_Configuration(void);
void EXTI_Configuration(void);
void NVIC_Configuration(void);
/*******************************************************************************
* Function Name : fputc
* Description : 重定向(stdio)printf函数 文件流-》串口1 (USART1)
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int fputc(int ch,FILE *f)//printf在打印的时候会调用fputc函数,把打印的东西转到一个文件那里,我们可以把打印的东西打印到串口1(USART1)
{
//给USART1发送ch
USART_SendData(USART1, ch);
//等待发送完成
while(!USART_GetFlagStatus(USART1, USART_FLAG_TC));
return ch;
}
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
int main(void)
{
/*GPIO初始化*/
RCC_Configuration();//打开系统时钟
GPIO_Configuration();
NVIC_Configuration();
EXTI_Configuration();
/*GPIO通信*/
while(1);
return 0;
}
///*******************************************************************************
//* Function Name : Delay_Ms
//* Description : delay 1 ms.
//* Input : dly (ms)
//* Output : None
//* Return : None
//*******************************************************************************/
void Delay_MS(u16 dly)
{
u16 i,j;
for(i=0;i<dly;i++)
for(j=1000;j>0;j--);
}
//
///*******************************************************************************
//* Function Name : RCC_Configuration
//* Description : Configures the different system clocks.
//* Input : None
//* Output : None
//* Return : None
//*******************************************************************************/
void RCC_Configuration(void)
{
//----------使用外部RC晶振-----------
RCC_DeInit(); //初始化为缺省值
RCC_HSEConfig(RCC_HSE_ON); //使能外部的高速时钟
while(RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET); //等待外部高速时钟使能就绪
//FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
//FLASH_SetLatency(FLASH_Latency_2); //Flash 2 wait state
RCC_HCLKConfig(RCC_SYSCLK_Div1); //HCLK = SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //PCLK2 = HCLK
RCC_PCLK1Config(RCC_HCLK_Div2); //PCLK1 = HCLK/2
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //PLLCLK = 8MHZ * 9 =72MHZ
RCC_PLLCmd(ENABLE); //Enable PLLCLK
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLLCLK is ready
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock
while(RCC_GetSYSCLKSource()!=0x08); //Wait till PLL is used as system clock source
//---------打开相应外设时钟--------------------
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD,ENABLE);
}
//
///*******************************************************************************
//* Function Name : GPIO_Configuration
//* Description : 初始化GPIO外设
//* Input : None
//* Output : None
//* Return : None
//*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;//声明一个结构体就可以了
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//设置引脚8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度是10MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//PA8为推挽输出
GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIOA.8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//设置引脚8
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度是10MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;//PA8为推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.8
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//PA15作为EXTI15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//置引脚15
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度是10MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ;//PA15为下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.15
}
void USART_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;//声明一个初始化的结构体,用来填充一些设置
USART_InitStructure.USART_BaudRate = 19600;//波特率为9600
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8
USART_InitStructure.USART_StopBits = USART_StopBits_1;//设置停止位为一位
USART_InitStructure.USART_Parity = USART_Parity_No;//不要奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//发送使能
// USART_InitStructure.USART_Clock = USART_Clock_Disable;
// USART_InitStructure.USART_CPOL = USART_CPOL_High;
// USART_InitStructure.USART_CPHA = USART_CPHA_1Edge;
// USART_InitStructure.USART_LastBit = USART_LastBit_Enable;
USART_Init(USART1, &USART_InitStructure);
USART_Cmd(USART1, ENABLE);
}
void EXTI_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//置引脚15
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度是10MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD ;//PA15为下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.15
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD,ENABLE);
//EXTI_DeInit();//先把EXTI各项设置为初省值
/*填充EXTI结构体*/
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//PA15作为EXTI15
EXTI_InitStructure.EXTI_Line = EXTI_Line0;//里选择为线15,因为PA15
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//下降沿为触发方式
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/*清除中断标志位,这里是为了保险起见*/
EXTI_ClearITPendingBit(EXTI_Line0);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
//NVIC_DeInit();
#ifdef VECT_TAB_RAM
NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQChannel;//设置10~15chanel为中断chanel,因为PA15
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
这是stm32f10x_it.c里面的函数
void EXTI0_IRQHandler(void)
{
GPIO_SetBits(GPIOA, GPIO_Pin_8);
GPIO_SetBits(GPIOD, GPIO_Pin_2);
Delay_MS(2000);
EXTI_ClearITpendingBit(EXTI_Line0);
}
|