1.实验说明
无需连外部杜邦线,下载程序,全速运行,按右边按键看到LED D1(PB4引脚驱动)亮暗能变化一次
2.主要代码
先上main.c
#include "delay.h"
#include "sys.h"
//外部中断0配置,PA0脚产生外部中断是外部中断0
void EXTI0_Config(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable AFIO clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
/* Connect EXTI0 Line to PA.00 pin */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
/* Configure EXTI0 line */
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿产生一次中断
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
/* Enable and set EXTI0 Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//LED 初始化PB4,KEY初始化PA0
void GPIO_Config_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB端口时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PB4 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB4
GPIO_ResetBits(GPIOB,GPIO_Pin_4); //PB4 输出低
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE ); //配置复用时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST, ENABLE); //全功能SW+JTAG,禁用JTRST,PB4可用
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //下拉输入,按键是悬空的,按键按下是高电平,所以需要一个下拉稳定I/O读取
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA0
}
//主函数,采用外部8M晶振,72M系统主频,可以在void SetSysClock(void)函数中选择主频率设置
int main(void)
{
delay_init(); //延时函数初始化,通过Systick中断实现1ms延时功能
GPIO_Config_Init(); //LED 初始化PB4,KEY初始化PA0
EXTI0_Config();//外部中断0配置,按键按下产生一次上升沿中断,中断处理在stm32f10x_it.c 文件的EXTI0_IRQHandler函数
while(1)
{
}
}
这段代码是用于配置和初始化STM32微控制器的C语言程序,主要功能如下:
1.外部中断配置(`EXTI0_Config` 函数):
启用AFIO(高级外设接口)时钟。
将外部中断0(EXTI0)与PA0引脚相连。
配置EXTI0为中断模式,触发方式为上升沿触发,并启用该中断线。
配置NVIC(嵌套向量中断控制器),设置EXTI0中断的优先级,并启用该中断。
2.GPIO(通用输入/输出)配置(`GPIO_Config_Init` 函数):
启用PB端口时钟,配置PB4引脚为推挽输出模式,速度为50MHz,并初始化为低电平。
启用AFIO时钟,配置引脚复用,以确保PB4可以被使用。
启用PA端口时钟,配置PA0引脚为下拉输入模式,速度为50MHz,适用于按键输入。
3. 主函数(`main` 函数):
初始化延时函数,通过SysTick中断实现1ms的定时功能。
调用`GPIO_Config_Init`函数初始化LED(PB4)和按键(PA0)。
调用`EXTI0_Config`函数配置外部中断0,以便按键按下时产生中断。
主循环中没有具体的操作,程序将等待外部中断的发生。
此外,在代码中还提到了使用外部8MHz晶振和72MHz系统主频,但具体的时钟设置函数`SetSysClock`没有在代码中给出。中断处理函数`EXTI0_IRQHandler`在`stm32f10x_it.c`文件中定义,用于处理由按键按下产生的中断。
所以从整体上看,这段代码只是STM32微控制器的一个基础配置示例,主要实现了按键触发中断和LED控制的功能,希望大家实验顺利!!!也欢迎大家指正批评。
标签:例程,NVIC,中断,InitStructure,GPIO,EXTI0,STM32F1,EXTI From: https://blog.csdn.net/m0_63679833/article/details/139611690