高中生
最后登录1970-1-1
在线时间 小时
注册时间2020-4-4
|
本帖最后由 ADIC 于 2020-4-23 20:43 编辑
我写了一个中断程序,来实现C8T6核心板的按键检测使LED1和LED2反转,结果只能用KEY1控制LED1的反转,KEY2不起作用。用仿真器仿真的时候全速运行会直接进入KEY2的中断里,KEY2接的是GPIOC_Pin13。我在仿真里查看EXTI的PR寄存器时,只要EXTI_Config();函数运行完后PR13就为1,找了很久都不知道错在哪。
建议先看二楼和三楼,再看程序
主程序
int main(void)
{
GPIO_KEY_LED_Config();
EXTI_Config();
while(1)
{
}
}
bsp_c8t6.h文件
#ifndef __BSP_C8T6__
#define __BSP_C8T6__
#include "stm32f10x.h"
#define LED1_GPIO_PORT GPIOA
#define LED1_GPIO_PIN PIO_Pin_1
#define LED1_RCC_PORT RCC_APB2Periph_GPIOA
#define LED1_ON GPIO_ResetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_OFF GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN)
#define LED1_TOGGLE LED1_GPIO_PORT->ODR ^= LED1_GPIO_PIN
#define LED2_GPIO_PORT GPIOA
#define LED2_GPIO_PIN GPIO_Pin_2
#define LED2_RCC_PORT RCC_APB2Periph_GPIOA
#define LED2_ON GPIO_ResetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_OFF GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN)
#define LED2_TOGGLE LED2_GPIO_PORT->ODR ^= LED2_GPIO_PIN
#define LED3_GPIO_PORT GPIOA
#define LED3_GPIO_PIN GPIO_Pin_3
#define LED3_RCC_PORT RCC_APB2Periph_GPIOA
#define LED3_ON GPIO_ResetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_OFF GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN)
#define LED3_TOGGLE LED3_GPIO_PORT->ODR ^= LED3_GPIO_PIN
#define KEY1_GPIO_PORT GPIOA
#define KEY1_GPIO_PIN GPIO_Pin_0
#define KEY1_RCC_PORT RCC_APB2Periph_GPIOA
#define KEY1_IRQChannel EXTI0_IRQn
#define KEY1_EXTI_Line EXTI_Line0
#define KEY2_GPIO_PORT GPIOC
#define KEY2_GPIO_PIN GPIO_Pin_13
#define KEY2_RCC_PORT RCC_APB2Periph_GPIOC
#define KEY2_IRQChannel EXTI15_10_IRQn
#define KEY2_EXTI_Line EXTI_Line13
void GPIO_KEY_LED_Config(void);
void SysTick_Delay_ms(uint32_t ms);
void EXTI_Config(void);
#endif /*__BSP_C8T6__*/
bsp_c8t6.c文件
void GPIO_KEY_LED_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(LED1_RCC_PORT | KEY2_RCC_PORT, ENABLE);
//LED
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Pin = LED1_GPIO_PIN;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED1_GPIO_PORT,&GPIO_InitStruct);
GPIO_SetBits(LED1_GPIO_PORT,LED1_GPIO_PIN);
GPIO_InitStruct.GPIO_Pin = LED2_GPIO_PIN;
GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStruct);
GPIO_SetBits(LED2_GPIO_PORT,LED2_GPIO_PIN);
GPIO_InitStruct.GPIO_Pin = LED3_GPIO_PIN;
GPIO_Init(LED2_GPIO_PORT,&GPIO_InitStruct);
GPIO_SetBits(LED3_GPIO_PORT,LED3_GPIO_PIN);
//KEY1
GPIO_InitStruct.GPIO_Pin = KEY1_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY1_GPIO_PORT,&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = KEY2_GPIO_PIN;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY2_GPIO_PORT,&GPIO_InitStruct);
}
static void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//key1
NVIC_InitStruct.NVIC_IRQChannel = KEY1_IRQChannel;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
//key2
NVIC_InitStruct.NVIC_IRQChannel = KEY2_IRQChannel;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_Config();
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
EXTI_InitStruct.EXTI_Line = KEY1_EXTI_Line;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource13);
EXTI_InitStruct.EXTI_Line = KEY2_EXTI_Line;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
EXTI_ClearFlag(KEY1_EXTI_Line|KEY2_EXTI_Line);
}
|
|