【合泰HT32外部中断控制多路舵机】

合泰HT32外部中断控制多路舵机

本次分享的是外部中断进行多路舵机的控制,舵机的使用和外部中断的介绍在前面都讲过,需要的小伙伴看前面几篇文章

按键基本操作外部中断控制LED

实验效果

HT32按键控制多路舵机

这里想在说的是HT32中只有三个中断源
但是每个引脚都可以配置成外部中断个中断源有15个中断通道
void EXTI0_1_IRQHandler(void)
{
}

void EXTI2_3_IRQHandler(void)
{
}


void EXTI2_3_IRQHandler(void)
{
}



#define EXTI0_IRQn EXTI0_1_IRQn
#define EXTI1_IRQn EXTI0_1_IRQn
#define EXTI2_IRQn EXTI2_3_IRQn
#define EXTI3_IRQn EXTI2_3_IRQn
#define EXTI4_IRQn EXTI4_15_IRQn
#define EXTI5_IRQn EXTI4_15_IRQn
#define EXTI6_IRQn EXTI4_15_IRQn
#define EXTI7_IRQn EXTI4_15_IRQn
#define EXTI8_IRQn EXTI4_15_IRQn
#define EXTI9_IRQn EXTI4_15_IRQn
#define EXTI10_IRQn EXTI4_15_IRQn
#define EXTI11_IRQn EXTI4_15_IRQn
#define EXTI12_IRQn EXTI4_15_IRQn
#define EXTI13_IRQn EXTI4_15_IRQn
#define EXTI14_IRQn EXTI4_15_IRQn
#define EXTI15_IRQn EXTI4_15_IRQn


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;

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_4|GPIO_PIN_0|GPIO_PIN_1)
//定义方式
#define GPIO_PR           (GPIO_PR_DOWN)
//定义模式
#define GPIO_FIFO_MODE    (AFIO_FUN_GPIO)

void Key_Init(void);

#endif

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_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);//检测中断源状态函数
	
	
	//GPIOB_0 中断配置
	AFIO_GPxConfig( GPIO_PB, AFIO_PIN_0, AFIO_FUN_GPIO);
    AFIO_EXTISourceConfig(AFIO_EXTI_CH_0, AFIO_ESS_PB);//中断来源选择PB3
	EXTI_InitStruct.EXTI_Channel=EXTI_CHANNEL_0;
	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(EXTI0_1_IRQn);//	
	EXTI_IntConfig(EXTI_CHANNEL_0, ENABLE);//检测中断源状态函数
	
	
	//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_5 中断配置
//	AFIO_GPxConfig( GPIO_PB, AFIO_PIN_5, AFIO_FUN_GPIO);
//  AFIO_EXTISourceConfig(AFIO_EXTI_CH_5, AFIO_ESS_PB);//中断来源选择PB3
//	EXTI_InitStruct.EXTI_Channel=EXTI_CHANNEL_5;
//	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_5, ENABLE);//检测中断源状态函	
}

main.c

#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "uart.h"
#include "key.h"
#include "time.h"

/**********************TH32 外部中断控制舵机**********************
Author:小殷

Date:2022-4-29
****************************************************************/


int main()
{
	uint8_t keynum = 0;
	Led_Init();
	USARTx_Init();
	GPTM_PWM_init();
	Key_Init();
	Servo_Run(45);
	Servo_Run2(45);
	Servo_Run3(45);
	Servo_Run4(45);
	printf("------key test------\n");
	while(1)
	{
		

	}
}

//细节函数局部里面key_stat 定义为static修饰要不然按键第二次无反应

void EXTI4_15_IRQHandler(void)
{
 		static uint8_t key_stat = 0; //按键状态
    if(key_stat == 0)
		{
			key_stat = 1;
			LED1_ON();
			Servo_Run(0);
		}
		else if(key_stat == 1)
		{
			key_stat = 0;
			LED1_OFF();
			Servo_Run(45);
		}
		EXTI_ClearEdgeFlag(EXTI_CHANNEL_4);
}

void EXTI2_3_IRQHandler(void)
{
	static uint8_t key_stat = 0; //按键状态 
	if(key_stat == 0)
		{
			key_stat = 1;
			LED2_ON();
			Servo_Run2(0);
		}
		else if(key_stat == 1)
		{
			key_stat = 0;
			LED2_OFF();
			Servo_Run2(45);
		}
		EXTI_ClearEdgeFlag(EXTI_CHANNEL_2);
}



void EXTI0_1_IRQHandler(void)
{
		static uint8_t key_stat = 0;
		if(key_stat == 0)
		{
			key_stat = 1;
			LED2_ON();
			Servo_Run3(0);
		}
		else if(key_stat == 1)
		{
			key_stat = 0;
			LED2_OFF();
			Servo_Run3(45);
		}
		EXTI_ClearEdgeFlag(EXTI_CHANNEL_0);
}

加油耶

<think>好的,用户需要关于HT32F52352控制器的外部中断配置的资料或教程,特别是杯的示例代码和参考手册。首先,我需要回忆单片机的相关资料,特别是用户提供的引用内容。 用户提供的引用[1]提到了单片机的外部中断函数格式和中断向量,说明中断函数有固定格式,可能需要查看头文件的宏定义。引用[3]中的System_Init函数涉及系统初始化,可能包括时钟、GPIO、ADC等,这提示外部中断配置可能需要类似的初始化步骤。 接下来,用户需要具体的配置步骤和示例代码。根据单片机的一般流程,配置外部中断通常包括以下几个步骤:GPIO初始化(设置为输入模式)、中断触发方式设置(上升沿、下降沿等)、中断向量配置、使能中断、清除中断标志位以及编写中断服务函数。 需要确保代码符HT32F52352的库函数,可能参考HT66F2390或HT66F3185的例程结构。同时,用户提到参考手册,因此需要建议查阅HT32F52352的数据手册,特别是关于中断控制寄存器和GPIO配置的部分。 另外,用户提到了杯的示例代码,可能需要参考往届杯项目的工程结构,比如初始化函数中的系统时钟配置、中断优先级设置等。此外,需要注意中断服务函数的格式和清除中断标志位的步骤,避免死循环。 最后,生成相关问题时要围绕用户的需求扩展,比如中断优先级配置、多个中断处理、触发方式选择等,帮助用户深入理解外部中断的应用。</think>### HT32F52352 外部中断配置说明 根据单片机开发经验[^1][^3],配置外部中断需以下关键步骤: #### 1. GPIO初始化 将目标引脚设置为输入模式并启用中断功能: ```c // 假设使用PA0作为外部中断引脚 GPIO_ModeConfig(HT_GPIOA, GPIO_PIN_0, GPIO_MODE_INPUT); GPIO_IntConfig(HT_GPIOA, GPIO_PIN_0, ENABLE); // 启用中断 ``` #### 2. 中断触发方式设置 通过寄存器配置触发条件(参考手册第12章): ```c EXTI_InitTypeDef EXTI_InitStruct; EXTI_InitStruct.EXTI_Line = EXTI_Line0; // 对应PA0 EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发 EXTI_Init(&EXTI_InitStruct); ``` #### 3. 中断向量配置 根据头文件宏定义格式编写中断服务函数: ```c #pragma vector = 0x04 // 查看数据手册确定向量号 __interrupt void EXTI0_IRQHandler(void) { if(EXTI_GetIntStatus(EXTI_Line0) == SET) { // 处理中断 EXTI_ClearIntPendingBit(EXTI_Line0); // 必须清除标志位[^1] } } ``` #### 4. 使能全局中断 ```c NVIC_EnableIRQ(EXTI0_IRQn); __enable_irq(); // 开启全局中断 ``` §§注意事项§§ 1. 必须通过`System_Init()`初始化系统时钟 2. 中断标志位未清除会导致重复进入中断 3. 不同引脚对应不同中断线(EXTI_Line0~15) ### 相关参考资源 1. 《HT32F52352 Reference Manual》第9章GPIO控制、第12章中断系统 2. Holtek官网提供的HAL库示例代码中的EXTI例程 3. 杯往届工程中的`GPIO_Init()`实现 ```c // 完整初始化示例 void System_Init(void) { SysClock_Init(); // 系统时钟配置 GPIO_ModeConfig(HT_GPIOA, GPIO_PIN_0, GPIO_MODE_INPUT); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 中断优先级分组 EXTI_Init(...); // 如上述配置 __enable_irq(); } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华阳电子工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值