STM32以中断的方式点亮LED小灯(标准库)

这篇具有很好参考价值的文章主要介绍了STM32以中断的方式点亮LED小灯(标准库)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

STM32以中断的方式点亮LED小灯(标准库)



  • 主要任务:
    STM32F103核心板GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关(用杜邦线模拟代替)。采用中断模式编程,当开关接高电平时,LED亮灯;接电平时,LED灭灯

实验工具:
(1)软件

  • STM32CubeMX
  • KEIL5:安装教程
  • mcuisp(或者FlyMcu): mcuisp百度网盘链接提取码:h2xc

(2)硬件

  • STM32F103C8T6的最小核心板
  • 杜邦线(模拟开关)
  • USB转TTL模块

一.认识中断

中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行

1.中断优先级:

当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源

2.中断嵌套:

当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回

3.中断执行流程

stm32中断控制led,stm32,单片机,arm

4.中断与stm32

stm32中断控制led,stm32,单片机,arm
stm32中断控制led,stm32,单片机,arm

1.68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设
2. 使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级响应优先级

5.中断与NVIC(嵌套向量中断控制器)

stm32中断控制led,stm32,单片机,arm

  • NVIC:
    NVIC作为CPU的小助手,在NVIC里对接入的中断进行优先级排序,告诉CPU应该优先处理哪一个中断,然后CPU才会立刻暂停正在做的事务转而处理中断(判断分配优先级这样的事如果交给CPU来做的话没有必要,都是一些重复且简单的事项,所以专门设计了一个NVIC来处理对应的事项)

优先级分组:

  • NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
  • 抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队
    stm32中断控制led,stm32,单片机,arm

6.EXTI(Extern Interrupt)外部中断

①.EXTI简介

stm32中断控制led,stm32,单片机,arm

②.EXTI基本结构

stm32中断控制led,stm32,单片机,arm

7.AFIO复用IO口

正如上面的图中所说,AFIO作为一个数组选择器外设,用来给GPIO外设选择中断的引脚。

①.如果只有一个中断,则GPIO引脚可以随意选择,若选择GPIOA Pin15,则AFIO则选择数字15输出到EXTI 。
②.如果有多个中断,则GPIO引脚则要注意不能同时选择相同标号引脚,例如两个中断,一个设为GPIOA15触发,一个设为GPIOB15触发,因为AFIO是数字选择器,这样就只能识别到一个15。
stm32中断控制led,stm32,单片机,arm


二.创建MDK(keil5)项目

1.项目结构

stm32中断控制led,stm32,单片机,arm

LED.c用来存储驱动程序的主体代码
LED.h用来存放这个驱动程序可以对外提供的函数或变量声明
其他都是F103C8T6对应标准库所需的文件,直接添加就好

2.基本设置

stm32中断控制led,stm32,单片机,arm
stm32中断控制led,stm32,单片机,arm


三.具体实现

1.配置RCC,把涉及到的外设的时钟全部打开

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //打开GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   //打开AFIO时钟
	//EXTI 和 NVIC已经默认开启时钟,不需要再开启

2.配置GPIO,选择端口为输入模式(GPIOB14号引脚)

	GPIO_InitTypeDef GPIO_InitStruct;//定义配置初始化结构体
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;     //对于外部中断来说,要选择浮	空,上拉或者下拉输入其中一个模式,如果不清楚看ST参考手册GPIO外设配置表(113页EXTI输入线)
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;//我们
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOB, &GPIO_InitStruct);
  • 这里注意,GPIO的输入模式有所不同

1.如果想要接高电平亮,接低电平熄灭的话就需要浮空输入模式
2.如果想要接高电平或者低电平亮,不接就熄灭的话就选上拉或者下拉,最后再根据中断的

3.配置AFIO,选择我们用的GPIO连接到后面EXTI

GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//用AFIO配置需要的中断引脚选择

4.配置EXTI,选择触发方式(例如上升沿,下降沿或双边沿),触发响应方式(中断或者事件触发)

	EXTI_InitTypeDef EXTI_InitStruct;
	EXTI_InitStruct.EXTI_Line = EXTI_Line14;//选择PB14对应的14号线路;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;//开启中断
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//选择是中断还是事件触发
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//配置为下降沿触发
	EXTI_Init(&EXTI_InitStruct);

5.配置NVIC,给外设配置合适的优先级,最后通过NVIC中断信号进入CPU

	NVIC_InitTypeDef NVIC_InitStruct;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//先配置一下指定中断分组(这里选择抢占优先级和响应优先级)
	NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;//这里参数需要到整个文件搜索,不同类型的芯片终端通道列表不一样,选择MD的芯片找到10-15EXTI的通道
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	//指定优先级,因为只有一个中断源,优先级随意设置
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;  //指定抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //指定响应优先级
	NVIC_Init(&NVIC_InitStruct);

6.中断函数的写入

这里中断函数的函数名称需要在库里面去寻找,因为我们之前用的PB14对应的EXTI的14号口,所以这里找到库里的void EXTI15_10_IRQHandler(void)函数,因为有10-15EXTI都能进来所以一般还要在函数里要进行判断EXTI14的中断标志位是不是为1

  • 完整代码
//第六步写中断函数(在启动文件startup里面找,找对应之前开启的10-15通道)
void EXTI15_10_IRQHandler(void)//必须无参无返回值
{
	//因为有10-15EXTI都能进来所以一般首先要进行判断EXTI14的中断标志位是不是为1
	if(EXTI_GetITStatus(EXTI_Line14)== SET)
	{
			//这里是用PA5引脚点亮小灯泡
			GPIO_InitTypeDef GPIO_InitStructure;	
			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//打开GOIO时钟
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_Init(GPIOA,&GPIO_InitStructure);
		
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==Bit_RESET)//判断现在是低电平还是高电平,对应开关等
		{
			
			
			GPIO_SetBits(GPIOA,GPIO_Pin_5);
			//GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		}
	    else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==Bit_SET)
		{
		
			//GPIO_SetBits(GPIOA,GPIO_Pin_5);
			GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		}
		
		
		//每次执行中断后都应该清除中断标志位,不然会一直申请中断,程序就卡死在中断里面
	EXTI_ClearITPendingBit(EXTI_Line14);
	}
	
}





以上都是LED.c文件对应的代码,下面给出LED.c文件的完整代码

#include "stm32f10x.h"                  // Device header


uint16_t LED_Count;//计数器(中断触发次数)
void LED_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;//定义配置初始化结构体
	EXTI_InitTypeDef EXTI_InitStruct;
	NVIC_InitTypeDef NVIC_InitStruct;
	
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);  //打开GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);   //打开AFIO时钟
	//EXTI 和 NVIC已经默认开启时钟,不需要再开启
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;     //对于外部中断来说,要选择浮空,上拉或者下拉输入其中一个模式,如果不清楚看ST参考手册GPIO外设配置表(113页EXTI输入线)
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; 
	GPIO_Init(GPIOB, &GPIO_InitStruct);
	//第三步,给AFIO配置,库函数文件在GPIO一个文件里
	GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//用AFIO配置需要的中断引脚选择
	
	//第四步配置EXTI,选择触发的方式
	EXTI_InitStruct.EXTI_Line = EXTI_Line14;//选择PB14对应的14号线路;
	EXTI_InitStruct.EXTI_LineCmd = ENABLE;//开启中断
	EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//选择是中断还是事件触发
	EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;//配置为下降沿触发
	EXTI_Init(&EXTI_InitStruct);
	
	//第五步,配置NVIC(NVIC属于内核,库函数需要在杂项即misc.h里寻找)
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//先配置一下指定中断分组(这里选择抢占优先级和响应优先级)
	NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;//这里参数需要到整个文件搜索,不同类型的芯片终端通道列表不一样,选择MD的芯片找到10-15EXTI的通道
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
	//指定优先级,因为只有一个中断源,优先级随意设置
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;  //指定抢占优先级
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //指定响应优先级
	NVIC_Init(&NVIC_InitStruct);
	
}



//第六步写中断函数(在启动文件startup里面找,找对应之前开启的10-15通道)
void EXTI15_10_IRQHandler(void)//必须无参无返回值
{
	//因为有10-15EXTI都能进来所以一般首先要进行判断EXTI14的中断标志位是不是为1
	if(EXTI_GetITStatus(EXTI_Line14)== SET)
	{
			
			GPIO_InitTypeDef GPIO_InitStructure;	
			RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
			GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
			GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
			GPIO_Init(GPIOA,&GPIO_InitStructure);
		
		if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==Bit_RESET)//判断现在是低电平还是高电平,对应开关等
		{
			
			
			GPIO_SetBits(GPIOA,GPIO_Pin_5);
			//GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		}
	    else if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_14)==Bit_SET)
		{
		
			//GPIO_SetBits(GPIOA,GPIO_Pin_5);
			GPIO_ResetBits(GPIOA,GPIO_Pin_5);
		}
		
		
		//每次执行中断后都应该清除中断标志位,不然会一直申请中断,程序就卡死在中断里面
	EXTI_ClearITPendingBit(EXTI_Line14);
	}
	
}

7.LED.h头文件引入

#ifndef _LED_H
#define _LED_H
void LED_Init(void);
#endif

8.main.c主函数

#include "stm32f10x.h"                  // Device header
#include "LED.h"
int main(void)
{
	LED_Init();
	while(1)
	{
		
	}
} 


四.电路的连接

stm32中断控制led,stm32,单片机,arm
这里因为不涉及到串口通信,所以PA9和PA10不用向我这样连上
然后编译生成HEX文件,烧录到程序中


五.实验现象

stm32中断控制led,stm32,单片机,arm

可以看到,当PB14接3.3v或5v的高电平的时候由PA5决定的灯泡亮,当接地的时候灯泡熄灭
当PB14什么都不接的时候,灯泡会不稳定的闪亮,因为我们之前在PB14初始化GPIO的时候选择的浮空输入模式,既不上拉也不下拉,处在一个没有默认值的情况,所以灯泡随即闪亮,这里参考一篇文章


六.总结

这次实验花了我比较长的时间,前几次实验都用的HAL库做,其实很多时候不知道自己在配置些什么东西,都是跟着别人的文章做,别人做什么就跟着做什么。当我花时间去认真了解了标准库后,对稍微底层一些的东西以及对stm32本身的外设以及硬件知识多了一些了解,虽然不及寄存器开发底层,但是也足够了。文章来源地址https://www.toymoban.com/news/detail-686474.html

到了这里,关于STM32以中断的方式点亮LED小灯(标准库)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用STM32点亮LED

    假设你手中已有 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED,并搭建了电路,分别GPIOA-5、GPIOB-9、GPIOC-14 这3个引脚上控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。 1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数; 2)用C语言 寄存器方式编程实

    2024年02月03日
    浏览(47)
  • 2、STM32点亮LED灯

    1、新建工程,新建一个目录存放以后所有的工程stmproject,在这个目录下新建文件夹寄存器点灯,文件名为LED。 接下来选择所用的软件包,之前安装软件时安装的,选择对应型号即可。 如果需要安装别的安装包可以在这个网址下载。点击打开文件 点击next,再点击finish就安装

    2024年02月01日
    浏览(45)
  • 最详细STM32,cubeMX 点亮 led

    这篇文章将详细介绍 如何在 stm32103 板子上点亮一个LED. 实验开发板:STM32F103C8T6。 所需软件:keil5 , cubeMX 。 实验目的:了解 led 点亮原理,cubeMX配置 , GPIO 等相关函数 。 代码编写软件 : MDK keil5 。 图形化配置软件 :STM32cubeMX。 仿真器驱动 : STLINK 。 串口驱动 :CH340 。

    2024年01月16日
    浏览(47)
  • STM32寄存器点亮LED灯

     这个灯是 PB5引脚 看原理图可以看出 让GPIOB5输出低电平 就能点亮 那么我们得让 打开控制GPIOB5的时钟 让GPIOB5 输出模式 让GPIOB5低电平 时钟就相当于一个阀门开关,或者理解成水龙头,你打开了 才有水出来,也就是你打开才能工作。 看中文参考手册 系统架构 找到你的GPIO

    2024年02月07日
    浏览(54)
  • STM32点亮LED的三种方法

    学习STM32的第一课,都是点亮LED。 芯片:STM32F107RC 系统时钟:72MHz LED引脚:板载引脚PD2,正极接3.3V,负极接PD2,低电平点亮 解释: 1.第1句:RCC-APB2ENR寄存器的位[5]设为1,表示GPIOD时钟使能。类似的还有位[2]表示GPIOA,位[3]表示GPIOB,位[4]表示GPIOC,设为1表示使能,设为0表示失

    2024年02月14日
    浏览(34)
  • 【STM32】STM32CubeMX教程一--基本使用(新建工程点亮LED灯)

    前言 在配置好CubeMX之后,就是新建工程的开始了,那么首先我们需要一些准备,本片博客我们会很详细的介绍STM32CubeMX的基本使用和如何创建一个新的工程并且点亮LED灯 在新建工程时,我们分为了具体流程1~7,如果您不想看每部分的讲解,直接按照流程操作即可,5分钟即可

    2024年02月09日
    浏览(51)
  • 野火stm32指南者开发板点亮LED

    目录 1.芯片手册中的LED电路图 2.官网手册 3.代码演示 3.1 stm32f10x.h 头文件 3.2 点亮绿灯 3.3 点亮蓝灯 3.4 点亮红灯 3.5 LED灯闪烁,绿灯闪烁 。 3.6 红绿蓝三色LED灯切换闪烁 3.1 stm32f10x.h 头文件 3.2 点亮绿灯 3.3 点亮蓝灯 3.4 点亮红灯 3.5 LED灯闪烁,绿灯闪烁 。 3.6 红绿蓝三色LED灯切

    2024年02月13日
    浏览(43)
  • STM32——震动传感器点亮LED灯

    若产品不震动,模块上的 DO 口输出高电平; 若产品震动,模块上的 DO 口输出低电平,D0-LED绿色指示灯亮。 需求:当震动传感器接收到震动信号时,使用中断的方式点亮led1。 1、打开cubeMX a.在SYS中选择调试方式为串行线调试。 b.在RCC(复位和时钟控制)中选择 HSE(高速时钟)

    2024年02月04日
    浏览(41)
  • STM32/51单片机编程入门(点亮LED)

    目录 一、Proteus电路仿真软件上的C51程序设计及仿真 1.原理图绘制 2.Keil5上的51程序编写 3.仿真 二、安装mdk5软件和stm32包,完成一个stm32的简单程序 1.mdk5软件中编写程序 2.stm32仿真程序调试 三、STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置的一般步骤

    2024年02月02日
    浏览(60)
  • arm学习stm32串口指令点亮led灯

    main.c uart-led.h uart-led.c

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包