标题:
proteus仿真用按键STM32单片机中断控制LED灯的亮灭,按键没有反应,求大佬帮助
[打印本页]
作者:
z2y
时间:
2022-4-29 15:41
标题:
proteus仿真用按键STM32单片机中断控制LED灯的亮灭,按键没有反应,求大佬帮助
小白求助,谢谢大家
#include "stdio.h"
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "sys.h"
#include "misc.h"
uint32_t i;
void delay_ms(uint32_t ms)
{
uint32_t i_cnt,j_cnt;
for(i_cnt=0;i_cnt<3000;i_cnt++);
for(j_cnt=0;j_cnt<ms;j_cnt++);
}
void led_cfg( )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIOC->BSRR=0xff;
}
void key_cfg( )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2 | GPIO_Pin_3| GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIOC->BSRR=0xff;
}
void EXTI_cfg( )
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择中断分组2
NVIC_InitStructure.NVIC_IRQChannel= EXTI0_IRQn; //选择中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0x02; //响应式中断优先级设置为0
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel= EXTI1_IRQn; //选择中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0x02; //响应式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel= EXTI2_IRQn; //选择中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0x02; //响应式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel= EXTI3_IRQn; //选择中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0x02; //响应式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn; //选择中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0x02; //响应式中断优先级设置为
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelSubPriority= 0; //响应式中断优先级设置
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; //使能中断
NVIC_Init(&NVIC_InitStructure);
EXTI_InitStructure.EXTI_Line=EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
int main(void)
{
delay_ms (1);
led_cfg( );
key_cfg( ) ;
EXTI_cfg( );
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
while (1)//测试程序是否运行
{
delay_ms (100);
GPIO_ResetBits(GPIOC,GPIO_Pin_2);
delay_ms (100);
GPIO_SetBits(GPIOC,GPIO_Pin_2);
}
}
void EXTI0_IRQHandler(void)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_1);
EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE 上的中断标志位
}
复制代码
作者:
z2y
时间:
2022-4-29 15:57
EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE 上的中断标志位
作者:
z2y
时间:
2022-4-29 15:58
EXTI_ClearITPendingBit(EXTI_Line2); //清除 LINE 上的中断标志位
最后一行我复制错了 清除的是Line0
作者:
z2y
时间:
2022-4-29 16:02
标题:
RE: proteus仿真用按键STM32单片机中断控制LED灯的亮灭,按键没有反应,求大佬帮助
仿真图
51hei.PNG
(113.91 KB, 下载次数: 41)
下载附件
2022-4-29 16:02 上传
作者:
Y_G_G
时间:
2022-4-29 20:37
1:GPIO_EXTILineConfig
中断IO需要映射
2:中断端口输入模式要设定为上拉输入 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
3:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);//使能复用和端口时钟
我不会用proteus,所以,我从不仿真
作者:
Y_G_G
时间:
2022-4-29 22:07
忘记了,中断要写在stm32f10x_it.c中
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1