使用STM32F103c8t6这款芯片,写外部中断按键消抖的代码,其中按键引脚为PB0、PA5、PA6、PA7,按下按键PB0会返回数字1,按下PA5会返回数字2,按下PA6会返回数字3,按下PA7会返回数字4
时间: 2024-10-17 20:03:51 浏览: 68
在STM32F103C8T6中,你可以通过扩展中断和按键映射的方式来满足这种需求。下面是一个简化的示例代码,包含了四个外部中断和相应的按键处理:
```c
#include "stm32f10x.h"
#include "stdio.h"
// 定义按键引脚及对应的数值
enum Key {
KEY_PB0 = EXTI_LINE0,
KEY_PA5 = EXTI_LINE1,
KEY_PA6 = EXTI_LINE2,
KEY_PA7 = EXTI_LINE3
};
// 初始化GPIO和EXTI
void EXTI_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
for (uint8_t key = KEY_PB0; key <= KEY_PA7; ++key) {
EXTI_InitStructure.EXTI_Line = key;
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);
}
}
// 按键中断处理函数
void EXTI_IRQHandler(uint16_t line)
{
switch (line) {
case EXTI_LINE0: // PB0
printf("Number: 1\n");
break;
case EXTI_LINE1: // PA5
printf("Number: 2\n");
break;
case EXTI_LINE2: // PA6
printf("Number: 3\n");
break;
case EXTI_LINE3: // PA7
printf("Number: 4\n");
break;
}
// 清除当前中断标志
EXTI_ClearITPendingBit(line);
}
int main(void)
{
EXTI_Init();
NVIC_EnableIRQ(EXTI0_IRQn); // PB0
NVIC_EnableIRQ(EXTI1_IRQn); // PA5
NVIC_EnableIRQ(EXTI2_IRQn); // PA6
NVIC_EnableIRQ(EXTI3_IRQn); // PA7
while (1) {}
}
// EXTIx_IRQHandler()中断服务程序,这里x对应上面的中断线
void EXTIx_IRQHandler(void)
{
EXTI_IRQHandler(EXTI_Line_x);
}
```
这个代码首先初始化了GPIO和EXTI,然后设置每个按键对应的中断。当按下某个按键时,相应的中断会被触发,然后在EXTI_IRQHandler()中根据中断线判断并打印对应的数字。
请注意,你需要根据实际电路连接更新EXTI_InitStructure中的EXTI_Line值,并确保中断向量表的配置正确。
阅读全文