按键KEY1作为外部中断,分别测试上升沿和下降沿,发现触...
本帖最后由 csz9981 于 2019-4-10 11:00 编辑按键KEY1作为外部中断,分别测试上升沿和下降沿,发现触发方式和程序设置的方式 对不上? 学习了中断后,想用PROTEUS8.8仿真,结果仿真的时候,LED灯能正常闪烁,按键也能控制LED_G反转,问题是 程序设置的触发方式是:EXTI_Trigger_Rising = 0x08, //上升沿触发EXTI_Trigger_Falling = 0x0C, //下降沿触发EXTI_Trigger_Rising_Falling = 0x10 //上升、下降沿都触发 仿真出来的触发方式是:EXTI_Trigger_Rising = 0x08, //上升、下降沿都触发EXTI_Trigger_Falling = 0x0C, //下降沿触发EXTI_Trigger_Rising_Falling = 0x10 //上升沿触发程序和仿真工程如下 :
主大家帮忙找找原因。
代码没有问题,是PROTEUS的问题。
要学习的话,用硬仿真吧。搞个Nucleo板子,或者买个简易ST-Link+STM32最小系统,最便宜35块钱给你搞一套。 表达问题应该清晰明了,我是没看懂,帮顶。 本帖最后由 csz9981 于 2019-4-10 11:02 编辑
wbnorth 发表于 2019-4-10 10:45
表达问题应该清晰明了,我是没看懂,帮顶。
按键KEY1作为外部中断,分别测试上升沿和下降沿,发现触发方式和程序设置的方式 对不上?
void EXTI_Key_Config(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //初始化结构体变量
EXTI_InitTypeDef EXTI_InitStruct; //初始化结构体变量
//配置中断优先级
EXTI_NVIC_Config();
//初始化 GPIO-KEY1
GPIO_InitStruct.GPIO_Pin = KEY1_INT_GPIO_PIN; //GPIO_Pin_0
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK, ENABLE);//开时钟,RCC_APB2Periph_GPIOA
GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStruct); //初始化PA0
//初始化 EXTI
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE); //AFIO 开时钟 RCC_APB2Periph_AFIO
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //选择输入线PA0 AFIO->EXTICR1
EXTI_InitStruct.EXTI_Line = EXTI_Line0; //选择输入线0
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;//上升,下降沿,都触发
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct); //把实参输入给初始化函数,通过初始化函数把实参传递给相应的寄存器。。
}
也许仿真软件有BUG,呵呵 本帖最后由 wenyangzeng 于 2019-5-13 15:53 编辑
参考ST官方手册EXTI寄存器设置,某一位设置上升沿中断,应该是EXTI_RTSR的该位置1,比如要设置D7位上升沿中断,应该是EXTI_RTSR |=0X08,比如要设置D7位下降沿中断,应该是EXTI_FTSR |=0X08,而非EXTI_FTSR =0X0C。(EXTI_FTSR =0X0C 是置D7、D6位下降沿中断了)
现在开发板很便宜了,买个板子吧 仿真就是仿真,以前用里面的MSP430仿真就发现很多东西不能用。STM32的核心板挺便宜的,为什么不买一个核心板试试呢?
页:
[1]