学习笔记
forSTM32F103C8
redesignedbyzhangbin
2012-10-30
versions:V-0.1
AllRightsReserved
main.c如下,注释的比较详细,把下面的例子即说明都看明白基本上就可以用了:
//抢占级别高的会打断其他中断优先执行,而响应级别高的会在其他中断执行完优先执行。
//EXTI:外部中断/事件控制器
//EXTI控制器可以产生高达19个软件事件/中断请求
//将19根线配置为中断源,将19根线配置为事件源,将19根线配置为软件中断/事件线,详见《STM32F103xxx使用手册》
//P135
//在这个文件中主要是进行各种初始化配置,包括GPIO配置、EXTI配置、系统时钟配置等
//中断服务程序则在stm32f10x_it.c文件中,该文件提供所有异常处理程序和外围中断服务程序的模板,详见该文件
#include"stm32f10x_lib.h"
EXTI_InitTypeDefEXTI_InitStructure;//定义外部中断初始化结构体变量内部含有4个成员详见EXTI_InitTypeDef的定义
ErrorStatusHSEStartUpStatus;//定义错误状态变量,是枚举类型
voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidNVIC_Configuration(void);
intmain(void)
{
#ifdefDEBUG
debug();
#endif
RCC_Configuration();//系统时钟配置
NVIC_Configuration();//NVIC配置
GPIO_Configuration();//配置GPIO
//STM32的外部中断不是固定的,是可以映射的。如EXTI6既可以映射到PB6也可以映射到PA6,详见外部中断/事件与GPIO的映射关系
//将IO端口注册至中断线(将IO口映射到中断线N)
//
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource6);//选择GPIO管脚用作外部中断线路
//第一个参数选择用作外部中断线源的GPIO端口第二个参数是待设置的外部中断线路,可以是GPIO_PinSourcex(x可以0~15)
//配置按钮中断线触发方式设置中断配置结构体成员
EXTI_InitStructure.EXTI_Line=EXTI_Line6;//选择外部中断线EXTI_Line0~EXTI_Line18共19根线
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置为中断请求,可以为EXTI_Mode_Interrupt中断请求或者
//EXTI_Mode_Event事件请求
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//触发方式下降沿触发还可以为EXTI_Trigger_Rising上升沿触发或者
//EXTI_Trigger_Rising_Falling上升沿下降沿触发
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中断线使能ENABLE使能,DISABLE失能
EXTI_Init(&EXTI_InitStructure);//根据参数结构体初始化EXTI中断
EXTI_GenerateSWInterrupt(EXTI_Line6);//产生一个软件中断EXTI_Line6中断允许
//到此中断配置完成,可以写中断处理函数。
while(1)
{
}
}
voidRCC_Configuration(void)
{
//复位RCC外部设备寄存器到默认值
RCC_DeInit();
//打开外部高速晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速时钟准备好
HSEStartUpStatus=RCC_WaitForHSEStartUp();
//外部高速时钟已经准别好
if(HSEStartUpStatus==SUCCESS)
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
FLASH_SetLatency(FLASH_Latency_2);
//配置AHB(HCLK)时钟=SYSCLK
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//配置APB2(PCLK2)钟=AHB时钟
RCC_PCLK2Config(RCC_HCLK_Div1);
//配置APB1(PCLK1)钟=AHB1/2时钟
RCC_PCLK1Config(RCC_HCLK_Div2);
//配置ADC时钟=PCLK21/4
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
//配置PLL时钟==外部高速晶体时钟*98MHz*9MHz=72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);
//配置ADC时钟=PCLK2/4
RCC_ADCCLKConfig(RCC_PCLK2_Div4);
//使能PLL时钟
RCC_PLLCmd(ENABLE);
//等待PLL时钟就绪
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
{
}
//配置系统时钟=PLL时钟
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//检查PLL时钟是否作为系统时钟
while(RCC_GetSYSCLKSource()!=0x08)
{
}
}
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
|RCC_APB2Periph_AFIO,ENABLE);
//使能GPIOA,GPIOB和AFIO的APB2
}
voidGPIO_Configuration(void)
{
GPIO_InitTypeDefGPIO_InitStructure;//定义配置GPIO的结构体
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;//选中第8个脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);//用配置好的结构体初始化GPIOBPB8用于驱动led
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//选中6脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//配置浮空输入
GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPIOBPB6脚连接外部中断线6的中断源