本人最近课程设计学习STM32F4系列,在此进行学习记录!完整代码在最后!
一、Keil5的安装配置
Keil5的安装配置在此不在赘述,并且需要添加F4系列的包(PACK)。
二、基本知识
1、GPIO
本次实验是通过外部中断对led灯进行操作,首先我们需要找到对应的led灯(点亮第一个led灯程序),如下图我们可以找到对应的IO口。
找到对应的IO口后,即应该对其进行初始化操作。
我们即需要在代码中对GPIO口进行初始化,发现该初始化函数需要两个参数,分别是GPIO口与其的结构体,所以我们还需要对该结构体进行初始化。
另外的需要配置时钟线给予对用的GPIO口时钟,见下图找到是AHB1。
见代码led_config(void)函数。
2、EXTI
3、NVIC
三、代码
最终实现了简单的程序,通过按键按下,亮的led灯熄灭。
#include <stdio.h>
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_syscfg.h"
#include "misc.h"
/*//延时函数
static void Delay_ARMJISHU(__IO uint32_t nCount)
{
for (; nCount != 0; nCount--)
{
}
}
*/
//led灯GPIO初始化配置
void led_config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;//定义GPIO初始化结构体
//对GPIO口的结构体参数进行配置
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;//引脚
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
//查找核心板找到对应时钟线,并给予时钟信号
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
//最终编写GPIO口的初始化函数
GPIO_Init(GPIOF,&GPIO_InitStruct);
}
//蜂鸣器初始化,其实蜂鸣器的初始化配置也是同led灯一样,都是找到对应的GPIO口
void bee_config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz ;
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
GPIO_Init(GPIOF,&GPIO_InitStruct);
}
//按键初始化配置
//在该函数中对三者进行了初始化配置——EXTI,GPIO,NVIC
void key_init()
{
GPIO_InitTypeDef GPIO_InitStruct;
//外部中断结构体初始化
EXTI_InitTypeDef EXTI_InitStruct;
//中断向量管理模块NVIC初始化
NVIC_InitTypeDef NVIC_InitStruct;
//给予时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //同样是查找对应的时钟信号线
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//对于外部中断,在GPIO口还需要对其进行映射,即需要添加该函数
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0);
//外部中断初始化结构体赋值
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
//NVIC初始化结构体赋值
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0xf;//对主副优先级进行设定,其中与NVIC的分组结果有关,即main函数中的NVIC配置有关
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0xf;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
NVIC_Init(&NVIC_InitStruct);
}
int main()
{
bee_config();
led_config();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);//NVIC分组
key_init();
while(1)
{
//Delay_ARMJISHU(0xFFFFFF);
//GPIO_ResetBits(GPIOF,GPIO_Pin_10);
//Delay_ARMJISHU(0xFFFFFF);
//GPIO_SetBits(GPIOF,GPIO_Pin_10);
}
}
//中断响应函数
void EXTI0_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line0) != RESET )//中断发生标志
{
GPIO_SetBits(GPIOF,GPIO_Pin_10);//对GPIO口进行置位
EXTI_ClearITPendingBit(EXTI_Line0); //中断标志清零
}
}