GD32F103的EXTI中断和EXTI事件

文章介绍了GD32F103的EXTI功能,包括其触发源、中断和事件信号的配置,以及Cortex-M3的WFI/WFE/SEV和WIC在低功耗模式下如何通过EXTI唤醒处理器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GD32F103的EXTI可以产生中断,也产生事件信号。 

GD32F03的EXTI触发源:

1、I/O管脚的16根线;

2、内部模块的4根线(包括LVD、RTC闹钟、USB唤醒、以太网唤醒)。


通过配置GPIO模块的AFIO_EXTISSx寄存器,所有的GPIO管脚都可以被选作EXTI的触发源。因此,EXTI可以产生中断,也产生事件信号。

//函数功能:初始化ExternalInterrupt3
void ExternalInterrupt3_Init(void)
{
	//NVIC_PRIGROUP_PRE4_SUB0:抢占优先级为4bit(取值为0~15),子优先级为0bit(没有响应优先级)
	//NVIC_PRIGROUP_PRE3_SUB1:抢占优先级为3bit(取值为0~7),子优先级为1bit(取值为0~1)
	//NVIC_PRIGROUP_PRE2_SUB2:抢占优先级为2bit(取值为0~3),子优先级为2bit(取值为0~3)
	//NVIC_PRIGROUP_PRE1_SUB3:抢占优先级为1bit(取值为0~1),子优先级为3bit(取值为0~7)
	//NVIC_PRIGROUP_PRE0_SUB4:抢占优先级为0bit(没有抢占优先级),子优先级为3bit(取值为0~15)
	nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);//设置系统中断优先级"抢占优先级为4bit,子优先级为0bit"
  nvic_irq_enable(EXTI3_IRQn, 2U, 0U);//设置EXTI3_IRQn的中断优先级,抢占优先级为2,子优先级为0

	rcu_periph_clock_enable(RCU_GPIOE);//使能GPIOE时钟,enable GPIO clock
	rcu_periph_clock_enable(RCU_AF);   //外部中断,需要使能复用功能时钟

	gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_3);//将GPIOE3设置为浮空输入

	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOE, GPIO_PIN_SOURCE_3);
	//设置GE3引脚为外部中断源,select GPIO pin exti sources
  exti_init(EXTI_3, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
	//配置外部中断线使用外部中断3(EXTI_3)
	//中断模式为外部中断(EXTI_INTERRUPT)
	//中断触发方式为下降沿中断(EXTI_TRIG_FALLING)
	exti_interrupt_flag_clear(EXTI_3);//清除外部中断3标志
	exti_interrupt_enable(EXTI_3);//使能外部中断3(EXTI_3)
	exti_event_enable(EXTI_3);//使能外部事件3(EXTI_3)
}

除了EXTI中断,EXTI还可以向处理器提供事件信号。

Cortex-M3内核完全支持等待中断(WFI),等待 事件(WFE)和发送事件(SEV)指令。芯片内部有一个唤醒中断控制器(WIC),用户可以放心的让 处理器和NVIC进入功耗极低的省电模式,由WIC来识别中断和事件以及判断优先级。当某些预 期的事件发生时,EXTI能唤醒处理器及整个系统,例如一个特定的I/O管脚电平翻转或者RTC 闹钟动作。

### 关于GD32F103 ADC中断配置及处理 对于GD32F103系列微控制器中的ADC模块,当中断功能被启用时,可以通过设置相应的标志位来清除这些中断,并通过使能特定的中断源来进行控制。 #### 中断标志清除 为了确保程序能够正常响应新的事件而不受之前未处理完成的状态影响,在每次进入中断服务函数之后应当立即清除对应的中断状态标志。这一步骤可通过调用`adc_interrupt_flag_clear()`实现[^1]。 ```c // 清除指定的ADC中断标志位 void clear_adc_interrupt_flags(void){ adc_interrupt_flag_clear(ADC_FLAG_EOC); // 假设清除转换结束EOC标志为例 } ``` #### 启用/禁用中断 当希望开启某个类型的ADC中断(比如规则通道或者注入通道),则需利用`adc_interrupt_enable()`接口参数化地打开所需的功能开关;同样地,也可以关闭不再需要监听的那些中断以节省资源并减少不必要的打扰。 ```c // 开启或关闭ADC中断 (此处假设为规则组转换结束中断) void configure_adc_interrupt(bool enable){ if(enable){ adc_interrupt_enable(ADC_INT_EOC); }else{ adc_interrupt_disable(ADC_INT_EOC); } } ``` #### 外部触发中断关联 除了上述基本操作之外,还可以借助外部信号作为触发条件之一来启动AD转换过程。例如,使用外部中断线IT11去激活规则通道扫描流程,而采用另一个不同的IO口——即EXTI Line IT15—用于激发注入通道的工作模式[^2]。 ```c // 配置外部中断IT11触发规则通道转换 void setup_exti_for_regular_channel(){ exti_init(); exti_select_source(EXTI_SOURCE_GPIO, EXTI_PORT_SOURCE_GPIOA, EXTI_PIN_SOURCE_11); exti_line_enable(EXTI_LINE_11); /* 设置上升沿触发 */ exti_line_trigger_config(EXTI_TRIGGER_RISING, EXTI_LINE_11); } // 类似地为注入通道做准备... void setup_exti_for_injected_channel(){ ... } ``` 以上就是针对GD32F103芯片上ADC组件有关中断机制的一些说明技术细节介绍。值得注意的是实际应用过程中还需要考虑更多因素如优先级分配等具体场景下的需求调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值