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中断功能的实现的主要内容,如果未能解决你的问题,请参考以下文章