学前班
最后登录1970-1-1
在线时间 小时
注册时间2014-9-15
|
用的是野火的mini板,下面是我自己写的程序,PA0和PC13是按键,当按键按下时,进入中断,两个中断执行的任务都是使PC3亮500毫秒再灭。现在的问题时按下按键后没有亮,请各位大神帮我看看
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "delay.h"
/* A0和C13按下,灯C3亮*/
/*************************************************
函数: void RCC_Configuration(void)
功能: 复位和时钟控制 配置
参数: 无
返回: 无
**************************************************/
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量
RCC_DeInit(); //复位RCC外部设备寄存器到默认值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好
if(HSEStartUpStatus == SUCCESS) //外部高速时钟已经准别好
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //开启FLASH预读缓冲功能,加速FLASH的读取。所有程序中必须的用法.位置:RCC初始化子函数里面,时钟起振之后
FLASH_SetLatency(FLASH_Latency_2); //flash操作的延时
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟等于==SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)钟==AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)钟==AHB1/2时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //配置PLL时钟 == 外部高速晶体时钟 * 9 = 72MHz
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_GPIOA | RCC_APB2Periph_GPIOC , ENABLE); //A、C的时钟使能
}
void Delay(__IO uint32_t nCount) //简单的延时函数
{
for(; nCount != 0; nCount--);
}
/*******************************************************************************
* Function Name : GPIO_Configuration
* Description : Configures the different GPIO ports.
* Input : None
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //设置A0为上拉输入模式,A0为按键
GPIO_Init(GPIOA, &GPIO_InitStructure); /*初始化PA0 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ; //设置PC13为上拉输入模式,PC13为按键
GPIO_Init(GPIOC, &GPIO_InitStructure); /*初始化PC13 */
GPIO_SetBits(GPIOC, GPIO_Pin_3); //刚开始输出高电平
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //设置PC3为推挽输出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //PC3为小灯
GPIO_Init(GPIOC, &GPIO_InitStructure);
//将各按键置高位
GPIO_SetBits(GPIOA, GPIO_Pin_0);
GPIO_SetBits(GPIOC, GPIO_Pin_13);
}
void EXTI_Configuration(void) //中断配置函数
{
EXTI_InitTypeDef EXTI_InitStructure; //给中断定义一个结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //功能复用IO时钟
//清空中断标志
EXTI_ClearITPendingBit(EXTI_Line0);
EXTI_ClearITPendingBit(EXTI_Line13);
//选择中断管脚PA0 PC13
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line13; //选择中断线路0 13
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设置为中断请求,非事件请求
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设置中断触发方式为下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //外部中断使能
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Configuration(void) //分组并配置抢占式优先级和响应式优先级
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //分组2
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //选择中断通道2,指定中断源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //选择中断通道3
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占式中断优先级设置为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应式中断优先级设置为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
}
void EXTI2_IRQHandler(void)
{
//添加中断处理程序
GPIO_ResetBits(GPIOC , GPIO_Pin_3);
delay_ms(500);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
EXTI_ClearFlag(EXTI_Line0); //清除中断标志
EXTI_ClearITPendingBit(EXTI_Line0);
}
void EXTI3_IRQHandler(void)
{
//添加中断处理程序
GPIO_ResetBits(GPIOC , GPIO_Pin_3);
delay_ms(500);
GPIO_SetBits(GPIOC, GPIO_Pin_3);
EXTI_ClearFlag(EXTI_Line13); //清除中断标志
EXTI_ClearITPendingBit(EXTI_Line13);
}
/*************************************************
函数: int main(void)
功能: main主函数
参数: 无
返回: 无
**************************************************/
int main(void)
{
delay_init(72);
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
EXTI_Configuration();
while (1);
}
|
|