使用STM32F103c8t6这款芯片,写外部中断按键消抖的代码
时间: 2024-10-17 07:03:25 浏览: 42
在STM32F103C8T6这款微控制器上,使用外部中断按键消抖的代码通常涉及到GPIO配置、中断系统以及延时函数。以下是一个简化版的基本示例,假设我们有一个EXTI端口用于连接按键,并且按键通过边沿触发中断:
```c
#include "stm32f10x.h"
// 定义按键引脚
#define KEY_PIN GPIO_Pin_0
#define KEY_GPIO_PORT GPIOB
// EXTI线配置
void EXTI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 配置按键GPIO为输入模式,带内部上拉
GPIO_InitStructure.GPIO_Pin = KEY_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // 输入浮空
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);
// EXTI线配置为上升沿触发
EXTI_InitStructure.EXTI_Line = EXTI_Line_0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_IT = EXTI_IT_Rising;
EXTI_Init(&EXTI_InitStructure);
}
// 消抖处理函数
static void EXTI_Keypress_Callback(void)
{
uint16_t i = 0;
while((GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_PIN) == GPIO_Pin_Reset) && (i < 10)) {
__delay_us(10); // 简单的10us延时
i++;
}
if (i >= 10) { // 如果按键连续按下超过10us,认为是有效按键事件
// 这里可以添加实际的按键处理逻辑,比如点亮LED等
// ...
}
}
int main(void)
{
EXTI_Init();
// 开启EXTI中断并注册回调函数
NVIC_EnableIRQ(EXTI0_IRQn);
EXTI_SetITConfig(EXTI_Line_0, EXTI_IT_Rising);
EXTI_EXTIRegisterCallback(EXTI_Keypress_Callback);
while (1) {}
}
// EXTI0_IRQHandler()中断服务程序
void EXTI0_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line_0);
EXTI_Keypress_Callback(); // 调用消抖后的处理函数
}
```
在这个例子中,当按键按下时,EXTI0_IRQHandler()会被调用。然后在EXTI_Keypress_Callback()中,我们通过简单的计数器来判断是否真的有按键按下,避免因轻微抖动引起的多次触发。
阅读全文