STM32学习笔记

 

初始化GPIO接口

关于gpio接口的初始化(按钮)

//输入输出模式
//GPIO_Mode_AIN = 0x0,
//GPIO_Mode_IN_FLOATING = 0x04,
//GPIO_Mode_IPD = 0x28,
//GPIO_Mode_IPU = 0x48,
//GPIO_Mode_Out_OD = 0x14,
//GPIO_Mode_Out_PP = 0x10,
//GPIO_Mode_AF_OD = 0x1C,
//GPIO_Mode_AF_PP = 0x18
//这个是gpio初始化的默认函数,属于stm32f10x_gpio.h头文件内
GPIO_InitTypeDef GPIO_InitStructure;
//外设通过时钟控制,这里使能了GPIOA和GPIOE,外设初始化必须将gpio组先时钟初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
//指定针脚
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;
//这里设置为上拉输入(IPU)初始化的时候设置值为高电平 原理图中接的是GND,当按钮按下,高电平和接地导通,电压变低,触发按钮
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
//初始化GPIOE组
GPIO_Init(GPIOE, &GPIO_InitStructure)
//读取按键状态的宏定义
#define KEY0  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)
#define KEY1  GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)

关于gpio接口初始化(LED灯或者蜂鸣器)

GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);

//对单个led初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//初始化速度设置为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5);

//设置第二个led,因为输出模式和速度都不需要改变,所以仅仅修改gpio组和pin线就可以
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5); 	

使用外部中断

//使用的函数属于stm32f10x_exti.h中的
EXTI_InitTypeDef EXTI_InitStructure;//外部中断
NVIC_InitTypeDef NVIC_InitStructure;//中断控制器

//使用复用时钟功能,时钟就是处理器的频率,要使用功能就要分频给该功能用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

//=============================外部中断配置====================================
//配置中断线,这里设置gpio组e的3号pin
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
//设置中断线为3号中断线,要和gpio_pin为同一线
EXTI_InitStructure.EXTI_Line=EXTI_Line3;
//设置触发模式为下降沿触发(下降沿对应上拉输入的GPIO_Mode)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
//设置中断模式为外部中断
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
//将配好的结构体初始化
EXTI_Init(&EXTI_InitStructure);	
//======设置第二个外部中断,因为结构体中已经配置好了中断模式EXTI_Mode,所以不需要配置======
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
//配置为上升沿触发,上升触发是电平变高触发,下降模式是电平变低触发
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStructure);	  
//=============================中断控制器配置====================================
//控制器配置中断通道为外部中断3,要和gpio_pin为相同的
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
//抢占优先级设置为2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
//子优先级设置为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;	
//使能中断外部通道
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	
//将配置初始化外设NVIC寄存器
NVIC_Init(&NVIC_InitStructure);

//============================外部中断服务=======================================
//这个方法不需要作为参数传递到初始化的过程,只需要定义的名字是对的即可
//比如EXTI3_IRQHandler就是外部中断3的对应定义函数
void EXTI3_IRQHandler(void)
{
	delay_ms(10);//按键消抖
	if(KEY1==0)	 //检测按键状态
	{				 
		LED1=!LED1;
	}		 
	EXTI_ClearITPendingBit(EXTI_Line3);  //清除中断标志位
}

使用定时器中断

//外设库stm32f10x_tim
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//时钟使能
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
//定时器周期,这个意思为1.5秒为一个周期进定时
TIM_TimeBaseStructure.TIM_Period = 15000;
//分频器,根据芯片设置,这里设置这个意思为0.1毫秒
TIM_TimeBaseStructure.TIM_Prescaler =7199;
//时钟分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//时间向上计数,0->15000->30000
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//初始化计时器时间基数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

//使计时器指定中断,能够更新中断
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

//=====================中断控制器设置=====================
//中断通道为定时器3
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
//抢占优先级和子优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
//中断通道使能
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//初始化中断寄存器
NVIC_Init(&NVIC_InitStructure);

//中断服务
void TIM3_IRQHandler(void)   //TIM3ÖжÏ
{
	//检查更新中断的发生
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  
		{
		//清除中断位
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  ); 
		LED1=!LED1;
		}
}