STM32中断功能的实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32中断功能的实现相关的知识,希望对你有一定的参考价值。

参考技术A //GPIO中断实验,按键KEY1接上拉电阻,通过PC3做为中断输入,DS1(PF10)做为中断指示,中断一次,亮灭状态改变一次。
#include "stm32f10x.h"
u8 count=0;//软件延时寄存器。
//**********************************************函数声明
void Delay_ms(vu16 nCount); //ms级延时函数声明。
void Delay_10us(vu16 nCount);//10us级延时函数声明。
void GPIO_PC_Init(void);
void GPIO_PF_Init(void);
void EXTI_Line3_Init(void);
void NVIC_Configuration(void);
//*******************************************初始化子程序
void GPIO_PC_Init(void)//PC3初始化子程序

GPIO_InitTypeDef GPIO_InitStructure; //声明一个名为GPIO_InitStructure的结构体,其原型由GPIO_InitTypeDef确定。只能放在一个函数的最前面。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//选择待初始化的端口号
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入模式(因为外部有上拉电阻)。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;//管脚速度设定。
GPIO_Init(GPIOC,&GPIO_InitStructure);//用以上参数初始化GPIOC。

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);//指定用作外部中断线路的管脚。

void GPIO_PF_Init(void)//PC3初始化子程序

GPIO_InitTypeDef GPIO_InitStructure; //声明一个名为GPIO_InitStructure的结构体,其原型由GPIO_InitTypeDef确定。只能放在一个函数的最前面。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出模式。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;//管脚速度设定。
GPIO_Init(GPIOF,&GPIO_InitStructure);//用以上参数初始化GPIOF。

void EXTI_Line3_Init(void)//中断线PC3的配置。

EXTI_InitTypeDef EXTI_InitStructure;//声明一个名为EXTI_InitStructure的结构体,其原型由EXTI_InitTypeDef确定。只能放在一个函数的最前面。
EXTI_InitStructure.EXTI_Line=EXTI_Line3;//选择待初始化的外部中断端口
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置EXTI线路为中断请求。
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//设置输入线路中断请求为下降沿触发。
EXTI_InitStructure.EXTI_LineCmd=ENABLE;//中断线使能。
EXTI_Init(&EXTI_InitStructure);//用以上参数初始化外部中断。

void NVIC_Configuration(void)//NVIC嵌套向量中断控制器配置。

NVIC_InitTypeDef NVIC_InitStructure;//声明一个名为NVIC_InitStructure的结构体,其原型由NVIC_InitTypeDef确定。
NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;//指定要配置的中断源。
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//设置先占优先级.
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//设置从优先级。
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能中断
NVIC_Init(&NVIC_InitStructure);//用以上参数初始化中断控制器。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);//设置优先级分组位长度.

int main(void)


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOF|RCC_APB2Periph_AFIO, ENABLE);//开启GPIOC,GPIOF,AFIO(复用时钟)的时钟。
//要配置stm32的事件输出/外部中断/重映射的时候.就必须开启复用时钟.
GPIO_PC_Init();
GPIO_PF_Init();
EXTI_Line3_Init();
NVIC_Configuration();
while(1);//等待中断。


void EXTI3_IRQHandler(void)//外部中断线3的中断服务程序。

if(EXTI_GetITStatus(EXTI_Line3)==SET);//检测指定线路的中断请求是否产生。

Delay_ms(10);//去抖延时
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==0);//等待按键释放
GPIO_WriteBit(GPIOF, GPIO_Pin_10, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOF, GPIO_Pin_10)));//对GPIOF_10脚输出取反。
Delay_ms(100);

EXTI_ClearFlag(EXTI_Line3);//与EXTI_ClearITPendingBit(EXTI_Line3);等效 清除中断标注后,下次中断才能进入。


/*******************************************************************************
* 函数功能:1ms延时,8M晶振
*******************************************************************************/
void Delay_ms(vu16 nCount)

vu16 i;
for(; nCount >0; nCount--)
for(i=10276;i!=0;i--);

/*******************************************************************************
* 函数功能:10us延时,8M晶振
*******************************************************************************/
void Delay_10us(vu16 nCount)

vu16 i;
for(; nCount >0; nCount--)
for(i=74;i!=0;i--);


只要将相应的端口改为你自己的端口就OK了。

STM32Cubemx——外部中断


前言

本文将向大家详细演示STM32Cubemx配置GPIO外部中断实验,使用按键来翻转LED电平。


提示:以下是本篇文章正文内容,下面案例可供参考

一、使用工具

STM32F103C8T6核心板
STM32Cubemx 版本6.0.1
Keil 版本 5.31
ST-Link

二、前置知识

查看核心板原理图
在这里插入图片描述
按键两端分别连接PA0,和GND。
当按键被按下时,单片机PA0口被拉低,为低电平。
在这里插入图片描述
LED正极接3.3V电压,负极接PC13,当PC13输出低电平时LED点亮。

2.功能分析

目的:当按键被按下时,LED状态翻转。
有两种方案:
1.不断扫描PA0口电平状态,当检测到低电平时,即按键被按下。
2.使用外部中断,当发生低电平时,进入中断函数,翻转PC13口输出电平。
显然第二种方案占用更少的资源。

3.STM32Cubemx配置

1.新建工程

在这里插入图片描述
选择相应单片机型号

2.选择时钟源及配置时钟树

在这里插入图片描述
在这里插入图片描述

3.选择调试方式

在这里插入图片描述
时基选择SysTick(使用操作系统要选TIM)

4.配置LED

在这里插入图片描述
配置PC13口为输出模式,默认输出高电平,重定义为LED,及LED熄灭。

5.配置按键中断

在这里插入图片描述
选择PA0口为外部中断
在这里插入图片描述
配置引脚为低电平触发,默认上拉,引脚重定义为KEY

6.开启外部中断

在这里插入图片描述
在EXTI lin0 interrupt 后打上对勾。

7.生成工程

在这里插入图片描述
在这里插入图片描述
点击生成工程并打开。

4.Keil编写功能函数

1.找到外部中断回调函数

在这里插入图片描述
将此函数在主函数内重新定义,_weak(弱定义)

2.在中断回调函数内编写服务函数

/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  /* Prevent unused argument(s) compilation warning */
    if(GPIO_Pin == KEY_Pin)            //如果发生外部中断的是KEY_Pin
    {
        while(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==GPIO_PIN_RESET);//等待按键松开,避免LED状态重复翻转
        HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);//翻转LED状态
    }
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}
/* USER CODE END 4 */

避免长时间按下按键不放开,可能导致阻塞,程序其他部分不能正常运行。

3.编译并烧录代码

在这里插入图片描述
第一次按下按键,LED点亮,之后每按下一次,LED状态翻转一次。

4.工程下载地址

链接:https://pan.baidu.com/s/1I9J6LnbX9t-x40EFy287MQ
提取码:vi2d

以上是关于STM32中断功能的实现的主要内容,如果未能解决你的问题,请参考以下文章

STM32进入中断怎么出不了中断

STM32Cubemx——外部中断

STM32_按键_外部中断_定时器扫描_循环扫描_FIFO机制

stm32 外部中断 能读gpio值吗

STM32之中断

stm32 WWDG 没进中断