首页 > 其他分享 >【STM32F1例程2】GPIO外部中断输入

【STM32F1例程2】GPIO外部中断输入

时间:2024-06-12 10:30:12浏览次数:11  
标签:例程 NVIC 中断 InitStructure GPIO EXTI0 STM32F1 EXTI

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

相关文章

  • 【STM32F1例程3】ADC实验
    1.实验说明 PA4口作为ADC采集口,PA4口接地或者接3.3V。下载运行程序,PA4口接地,会发现VolDta值为0,然后把PA4口接3.3V,会发现VolDta值为33002.主要程序直接上main.c#include"delay.h"#include"sys.h"//ADC配置,ADC1通道4voidADC_Config_Init(void){ ADC_InitTypeDef......
  • 《DX12龙书》-第一个例程出现的报错:error: 应用程序请求的操作依赖于已缺失或不匹配的
    《DX12龙书》|《Introductionto3DGameProgrammingwithDirectX12》|《DirectX123D游戏开发实践》个人电脑环境Window11;VisualStudio2022出现问题主要原因:书中代码的环境是:Windows10;VS2015,在不同环境上运行难免会出现一些错误。问题一:C2102&要求左值错......
  • MSPM0——GPIO的使用
    在dl_gpio.h库函数文件中,有三个函数可以控制引脚状态。__STATIC_INLINEvoidDL_GPIO_setPins(GPIO_Regs*gpio,uint32_tpins)该函数为控制引脚输出高电平,按照本例程中LED的引脚,则可以写为DL_GPIO_setPins(LED1_PORT,LED1_PIN_14_PIN);__STATIC_INLINEvoidDL_GPIO_c......
  • 3.7v可充电锂电池,能否直接给STM32F1芯片用?
    原文链接:https://www.amobbs.com/thread-5678061-1-1.html 问:就是18650锂电池,单节,或者那种聚合物锂电池,都是两三千毫安时的。第一个为题:能否直接给STM32F103供电?第二个问题:板子上自带1117-3.3,我直接锂电池接过去,也能输出3.3V,压差可以这么小么?第三个问题:其他的电压转换芯片......
  • 【linux-IMX6ULL-pinctrl和gpio子系统】
    目录1.pinctrl子系统1.1pinctrl子系统简介1.2pinctrl子系统使用1.2.1追加pin节点1.2.2配置引脚信息节点2.GPIO子系统2.1GPIO子系统简介2.1gpio子系统API函数3.检查PIN是否被其他外设使用1.pinctrl子系统1.1pinctrl子系统简介  pinctrl和gpio子系......
  • 基于STM32F103C8T6微控制器的物流信息检测系统
    摘要本论文设计并实现了一种基于STM32F103C8T6微控制器的物流信息检测系统。该系统旨在通过综合各种传感器模块实现对运输车环境及状态的实时监控,并通过4G网络将信息发送到手机端,以便用户进行远程管理和控制。首先,系统通过GPS模块获取运输车的位置信息,实现车辆定位和轨迹跟踪......
  • STM32使用定时器在普通gpio上模拟pwm-红牛开发板LED1的亮度调节
    stm32F103zet只有固定的几个针脚可以输出tim定时器信号,在不支持tim输出的口上就没法输出pwm,在红牛开发版上的表现就是控制lcd屏幕亮度的a1针脚,可以输出pwm,屏幕亮度可以无极调节,但是4个led灯就只能控制开关。使用arduino的analogWrite函数,只能调节开关。可以用定时器的中断来控制......
  • 【STM32基础学习】--GPIO原理
    一.GPIO入门知识全称: generalpurposeintputoutpot(通用输入输出端口)。可以做输入也可以做输出。STM32芯片的GPIO引脚与外部设备连接起来,从而实现与外部通讯,控制以及数据采集的功能。二.GPIO的八种工作模式1.4种输入模式(可以读取端口的高低电平或者电压,用于读取按键......
  • Python-使用OpenCV(二)_第一个示例程序
    1、创建项目2、创建代码importcv2#加载图片image=cv2.imread("C:\\Users\\Administrator\\Pictures\\Screenshots\\20240311220733.png")#显示图片cv2.imshow("Image",image)#等待任意键被敲击cv2.waitKey(0)#关闭所有窗口cv2.destroyAllWindows()3、结......
  • Proteus8.0仿真应用设计(九十三)基于STM32CubeMX、STM32F103C8T6 、FREERTOS、MCP4151(SP
    一、简介:        MCP4151是一款SPI接口的7位数字电位器。二、主要特性:电阻值(欧姆)5kΩ、10kΩ、50kΩ、100kΩ抽头数257接口类型SPI通道数1供电电压1.8V~5.5V精度±20%温度系数(典型值)150ppm/℃工作温度-40℃~+125℃三、引脚定义:四、内部逻辑框图:五、时序图......