合泰HT32F2352按键中断处理
前面已经试验完串口点灯,接着做按键点灯,通过中断处理翻转LED的状态
下面实验是使用B2 B4两个引脚就行中断控制,具体使用的引脚大家根据自己的进行相应的修改
因为ht32f52352只自带一个复位按键 ,所以我们如果想要使用按键进行其他控制需要我们自行进行外部按键的扩展我是用洞洞板就行的简易焊接。
实验效果
ht32外部中断点灯
工程链接需要自取哈
- 链接:https://pan.baidu.com/s/1qL3cpS8ranh2k0TcT-hTVw
提取码:47wm
–来自百度网盘超级会员V4的分享
在进行按键中断配置的时候一般有两种方式:上升沿触发和下降沿触发
1》如果按键一端接的是VCC则我们采用上升沿触发方式
EXTI_InitStruct.EXTI_IntType=EXTI_POSITIVE_EDGE; //上升沿触发
GPIO_PullResistorConfig(HT_GPIOB, GPIO_PIN_4, GPIO_PR_DOWN);
2》如果按键一端接的是GND则我们采用下降沿触发方式
EXTI_InitStruct.EXTI_IntType=EXTI_NEGATIVE_EDGE; //下降沿触发
GPIO_PullResistorConfig(HT_GPIOB, GPIO_PIN_4, GPIO_PR_UP);
注意:HT32中只能同时使用三个中断 ht32f5xxxx_01_it.c中
中断配置相关
typedef enum
{
EXTI_DEBOUNCE_DISABLE = 0x0,
EXTI_DEBOUNCE_ENABLE = 0x1
} EXTIDeb_TypeDef;
typedef struct
{
u32 EXTI_Channel;
EXTIDeb_TypeDef EXTI_Debounce;
u16 EXTI_DebounceCnt;
EXTIInterrupt_TypeDef EXTI_IntType;
} EXTI_InitTypeDef;
typedef enum
{
EXTI_LOW_LEVEL = 0x0,
EXTI_HIGH_LEVEL = 0x1,
EXTI_NEGATIVE_EDGE = 0x2,
EXTI_POSITIVE_EDGE = 0x3,
EXTI_BOTH_EDGE = 0x4
} EXTIInterrupt_TypeDef;
typedef enum
{
EXTI_CHANNEL_0 = 0,
EXTI_CHANNEL_1,
EXTI_CHANNEL_2,
EXTI_CHANNEL_3,
EXTI_CHANNEL_4,
EXTI_CHANNEL_5,
EXTI_CHANNEL_6,
EXTI_CHANNEL_7,
EXTI_CHANNEL_8,
EXTI_CHANNEL_9,
EXTI_CHANNEL_10,
EXTI_CHANNEL_11,
EXTI_CHANNEL_12,
EXTI_CHANNEL_13,
EXTI_CHANNEL_14,
EXTI_CHANNEL_15
} EXTI_Channel_TypeDef;
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
void EXTI_IntConfig(u32 EXTI_Channel, ControlStatus NewState);
key.c
#include "key.h"
#include "delay.h"
void Key_Init(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
CKCU_PeripClockConfig_TypeDef CKCUClock= {{0}};
CKCUClock.Bit.PB = 1; //开启GPIOB时钟
CKCUClock.Bit.AFIO = 1;
CKCUClock.Bit.EXTI = 1; //开启中断时钟
CKCU_PeripClockConfig(CKCUClock, ENABLE);
GPIO_InputConfig(HT_GPIO_GROUP, GPIO_PIN, ENABLE);
GPIO_PullResistorConfig(HT_GPIO_GROUP, GPIO_PIN, GPIO_PR);
//GPIOB_4 中断配置
AFIO_GPxConfig( GPIO_PB, AFIO_PIN_4, AFIO_FUN_GPIO);
AFIO_EXTISourceConfig(AFIO_EXTI_CH_4, AFIO_ESS_PB);//中断来源选择PB3
EXTI_InitStruct.EXTI_Channel=EXTI_CHANNEL_4;
EXTI_InitStruct.EXTI_Debounce=EXTI_DEBOUNCE_ENABLE;//决定是否去抖
EXTI_InitStruct.EXTI_DebounceCnt = 65535;
EXTI_InitStruct.EXTI_IntType=EXTI_POSITIVE_EDGE; //上升沿触发
EXTI_Init(&EXTI_InitStruct);
NVIC_EnableIRQ(EXTI4_15_IRQn);//
EXTI_IntConfig(EXTI_CHANNEL_4, ENABLE);//检测中断源状态函数
//GPIOB_2 中断配置
AFIO_GPxConfig( GPIO_PB, AFIO_PIN_2, AFIO_FUN_GPIO);
AFIO_EXTISourceConfig(AFIO_EXTI_CH_2, AFIO_ESS_PB);//中断来源选择PB3
EXTI_InitStruct.EXTI_Channel=EXTI_CHANNEL_2;
EXTI_InitStruct.EXTI_Debounce=EXTI_DEBOUNCE_ENABLE;//决定是否去抖
EXTI_InitStruct.EXTI_DebounceCnt = 65535;
EXTI_InitStruct.EXTI_IntType=EXTI_POSITIVE_EDGE; //上升沿触发
EXTI_Init(&EXTI_InitStruct);
NVIC_EnableIRQ(EXTI2_3_IRQn);//
EXTI_IntConfig(EXTI_CHANNEL_2, ENABLE);//检测中断源状态函数
}
key.h
#ifndef _KEY_H_
#define _KEY_H_
#include "ht32f5xxxx_ckcu.h"
#include "ht32f5xxxx_gpio.h"
#include "ht32f5xxxx_01.h"
//定义使用端口
#define HT_GPIO_GROUP (HT_GPIOB)
//引脚定义
#define GPIO_PIN (GPIO_PIN_2 |GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5)
//定义方式
#define GPIO_PR (GPIO_PR_DOWN)
//定义模式
#define GPIO_FIFO_MODE (AFIO_FUN_GPIO)
void Key_Init(void);
#endif
main.c
#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "uart.h"
#include "key.h"
/**********************TH32 按键中断点灯**********************
Author:小殷
Date:2022-4-18
******************************************************/
uint8_t key_stat = 0; //按键状态
int main()
{
uint8_t keynum = 0;
Led_Init();
USARTx_Init();
Key_Init();
printf("------key test------\n");
while(1)
{
}
}
void EXTI4_15_IRQHandler(void)
{
if(key_stat == 0)
{
key_stat = 1;
LED1_ON();
}
else if(key_stat == 1)
{
key_stat = 0;
LED1_OFF();
}
EXTI_ClearEdgeFlag(EXTI_CHANNEL_4);
}
void EXTI2_3_IRQHandler(void)
{
if(key_stat == 0)
{
key_stat = 1;
LED2_ON();
}
else if(key_stat == 1)
{
key_stat = 0;
LED2_OFF();
}
EXTI_ClearEdgeFlag(EXTI_CHANNEL_2);
}