STM32F407 IO口中断

比如要是使用GPC3作为中断源,上升沿触发
外部中断必须配置好EXTI和NVIC
使用以下函数打开SYSCFG的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE)

GPIO设置如下
void GPIO_Configuration(void)
{

GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOF Periph clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//注意要打开SYSCFG时钟

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOC, &GPIO_InitStructure);

}

因为要用的IO口做中断源,故IO的复用功能必须使能,F4的与F103的有些不同,它的外部中断复用功能是由SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOx,GPIO_PinSourcex); 进行配置的。
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;

//GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);

//这是以前的F103所用的配置函数
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource3); //407使用的配置函数
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

}

设置外部中断源和优先级
void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;

/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

中断处理函数

void EXTI3_IRQHandler(void)
{

if(EXTI_GetITStatus(EXTI_Line3) != RESET)
{
do something();

EXTI_ClearITPendingBit(EXTI_Line3);
printf(“EXTI3_IRQHandler\r\n”);
}
}

### STM32F407 IO 输入捕获使用教程 #### 原理说明 输入捕获(Input Capture)技术允许测量外部信号的脉冲宽度或频率,在STM32系列微控制器中有广泛应用。通过定时器通道捕捉上升沿或下降沿的时间戳,计算两个时间戳之间的差值来获取脉宽或周期数据[^2]。 #### 实验准备 为了实现输入捕获功能,需先设置好硬件连接并编写相应的软件程序。具体来说: - **硬件部分**:根据原理图搭建电路,确保待测信号接入到指定GPIO引脚上。 - **软件环境**:推荐使用STM32CubeMX工具初始化外设配置,并生成初始代码框架;之后再基于此平台开发具体的业务逻辑[^1]。 #### 配置过程 以下是详细的配置流程描述: ##### 定时器参数设定 进入STM32CubeMX界面后找到需要使用的定时器模块(例如 TIM2),将其模式更改为“Input Capture”,接着调整其他必要选项如预分频系数、计数方向等以满足实际需求[^4]。 ##### GPIO端口映射 对于选定作为输入捕获源的GPIO管脚,应指派给对应的定时器通道(比如 CH1)。这一步骤同样可以在STM32CubeMX图形界面上轻松完成。 ##### 中断服务函数定制 当检测到边沿变化触发事件发生时会自动调用中断处理子程序ISR (Interrupt Service Routine),因此还需要自定义该回调函数的内容以便进一步处理所获得的数据。 ```c void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim){ if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1){ // 判是否为CH1产生的中断 uint32_t IC_Val = __HAL_TIM_GET_COMPARE(&htim, TIM_CHANNEL_1); // 获取当前比较寄存器中的值 static uint32_t prevICVal; if(prevICVal != 0){ uint32_t pulseWidth = IC_Val - prevICVal; // 计算两次采样之间的时间间隔 /* 这里可以根据pulseWidth做后续操作 */ printf("Pulse Width:%lu us\n", pulseWidth); } prevICVal = IC_Val; } } ``` 上述C语言片段展示了如何在一个典型的中断服务例程内读取并分析由定时器记录下来的电平跳变时刻点,进而求得目标波形特征量——即高/低电平时长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值