#include "stm32f10x.h"
void RCC_Configuration()//设置系统各部分时钟函数
{
ErrorStatus HSEStartUPStatus; //定义枚举型变量HSEStartUPStatus
RCC_DeInit(); //系统时钟复位
RCC_HSEConfig(RCC_HSE_ON); //开启HSE
HSEStartUPStatus=RCC_WaitForHSEStartUp(); //等待HSE起振稳定
if(HSEStartUPStatus==SUCCESS) //判断HSE是否起振 //SUCCESS在stm32f10x.h里面为枚举的一个值
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //选择HCLK(AHB)时钟源为SYSCLK 1分频
RCC_PCLK2Config(RCC_HCLK_Div1); //选择PCLK2时钟源为CLK(AHB) 1分频
RCC_PCLK1Config(RCC_HCLK_Div2); //选择PCLK1时钟源为CLK(AHB) 2分频
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH延时周期数为2
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //使能FLASH预取缓存
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); //选择PLL时钟源为HSE 1分频,倍频数为9,则PLL=8MHZ*9=72MHZ
RCC_PLLCmd(ENABLE); //使能PLL
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET); //等待PLL输出稳定
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //选择SYSCLK时钟源为PLL
while(RCC_GetSYSCLKSource()!=0x08); //等待PLL成为SYSCLK时钟源
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA ,ENABLE); //打开APB2总线上的GPIOC和GPIOA的时钟
}
void GPIO_Configuration() //GPIO设置函数
{
GPIO_InitTypeDef GPIO_InitStructure; //在stm32f10x_gpio.h里面的结构体,GPIO_InitStructure是结构体标识
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3; //设置使用GPIOC.2和GPIOC.3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置GPIOC.2和GPIOC.3的翻转频率为50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置GPIOC.2和GPIOC.3的输出方式为推挽
GPIO_Init(GPIOC, &GPIO_InitStructure); //GPIOC初始化,&是取地址
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //GPIOA初始化,&是取地址 //以上三行是设置GPIOA.0口,作为按键检测输入口,对3.3V接按键
}
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitTStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* 第一步:配置中断优先级的分组 */
/* 第二步:配置NVIC的初始化结构体 */
NVIC_InitTStruct.NVIC_IRQChannel = EXTI0_IRQn; //使能按键外部中断通道
NVIC_InitTStruct.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitTStruct.NVIC_IRQChannelSubPriority = 0; //子优先级0
NVIC_InitTStruct.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitTStruct); /* 第三步:调用NVIC初始化函数把配置好的结构体成员写到寄存器里面 */
}
void EXTI_KEY_Config(void)
{
EXTI_InitTypeDef EXTI_InitTStruct;
NVIC_Config();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//打开引脚复用AFIO时钟
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //中断线配置
EXTI_InitTStruct.EXTI_Line = EXTI_Line0; //中断线0
EXTI_InitTStruct.EXTI_Mode = EXTI_Mode_Interrupt; //中断模式
EXTI_InitTStruct.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿触发
EXTI_InitTStruct.EXTI_LineCmd = ENABLE; //使能
EXTI_Init(&EXTI_InitTStruct); // 初始化,调用中断初始化函数把配置好的结构体成员写到寄存器里面
}
void delay(u32 z)
{
u32 x,y;
for(x=z;x>0;x--)
for(y=300;y>0;y--);
}
int main(void)
{
u8 i;
RCC_Configuration(); //设置系统各部分时钟函数
GPIO_Configuration(); //GPIO设置函数
EXTI_KEY_Config();
for(i=0;i<5;i++)
{
GPIO_SetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_3);//GPIOC.2和GPIOC.3输出高电平,灯灭
delay(10000);
GPIO_ResetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_3);//GPIOC.2和GPIOC.3输出低电平,灯亮
delay(10000);
}
GPIO_SetBits(GPIOC,GPIO_Pin_2|GPIO_Pin_3);//GPIOC.2和GPIOC.3输出高电平,灯灭
while(1);
}
void XTI0_IRQHandler()
{
if( EXTI_GetITStatus(EXTI_Line0) != RESET )
{
GPIO_ResetBits(GPIOC,GPIO_Pin_2);//GPIOC.2输出低电平,灯亮
delay(500);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
delay(500);
}
EXTI_ClearITPendingBit(EXTI_Line0);
} |