打印
[其他ST产品]

在解除pb3的JTAG调试后设置STM32F103C8T6的PB3作为外部中断一直失败,无法进入3中断一直进入15中断,请各位大佬帮忙解答疑惑

[复制链接]
1449|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cr315|  楼主 | 2023-12-4 11:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void Encoder_Init(void)
{

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);




    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);

    EXTI_InitStructure.EXTI_Line =EXTI_Line4 | EXTI_Line15;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);




    NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStructure);

}
void EXTI15_10_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line15) == SET)
    {
        /*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
        if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 0)
        {
            if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 0)
            {
                Encoder_Count --;
            }
        }
        EXTI_ClearITPendingBit(EXTI_Line15);
    }
}

void EXTI3_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line3) == SET)
    {
        /*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
        if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_3) == 0)
        {
            if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15) == 0)
            {
                Encoder_Count ++;
            }
        }
        EXTI_ClearITPendingBit(EXTI_Line3);
    }
}

使用特权

评论回复
沙发
stormwind123| | 2023-12-4 15:05 | 只看该作者
确认一下中断触发方式

使用特权

评论回复
板凳
flycamelaaa| | 2023-12-4 15:05 | 只看该作者
检查中断优先级

使用特权

评论回复
地板
classroom| | 2023-12-4 15:08 | 只看该作者
检查你的代码和配置

使用特权

评论回复
5
vivilyly| | 2023-12-8 08:27 | 只看该作者
PB3默认是配置为JTAG/SWD使用的

使用特权

评论回复
6
jonas222| | 2023-12-8 09:13 | 只看该作者
需要开启外部中断。              

使用特权

评论回复
7
juliestephen| | 2023-12-8 10:07 | 只看该作者
正确启用了外部中断。              

使用特权

评论回复
8
wilhelmina2| | 2023-12-8 16:02 | 只看该作者
在配置外部中断时, 需要设置触发方式。STM32的外部中断可以通过下降沿、上升沿或者低电平触发。

使用特权

评论回复
9
jkl21| | 2023-12-8 16:27 | 只看该作者
检查PB3外部中断的配置是否正确

使用特权

评论回复
10
wengh2016| | 2023-12-8 16:56 | 只看该作者
中断处理程序是否已经正确编写              

使用特权

评论回复
11
phoenixwhite| | 2023-12-8 21:21 | 只看该作者
可以使用HAL_GPIO_EXTI_Init函数进行配置

使用特权

评论回复
12
mikewalpole| | 2023-12-9 10:24 | 只看该作者
检查JTAG和PB3之间的连接是否正确

使用特权

评论回复
13
kmzuaz| | 2023-12-9 15:15 | 只看该作者
可能是由于外部中断的触发方式设置不正确导致的

使用特权

评论回复
14
wwppd| | 2023-12-9 20:37 | 只看该作者
检查PB3外部中断的中断服务函数是否正确

使用特权

评论回复
15
yeates333| | 2023-12-9 22:50 | 只看该作者
void EXTI_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    // 使能GPIOB时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

    // 配置PB3为输入模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    // 连接PA0到事件线3
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource3);

    // 初始化外部中断线3
    EXTI_InitStructure.EXTI_Line = EXTI_Line3;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 设置为中断模式
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 上升沿触发
    EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能外部中断线3
    EXTI_Init(&EXTI_InitStructure);

    // 配置中断优先级分组2,子优先级3
    NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能外部中断通道3
    NVIC_Init(&NVIC_InitStructure);
}

使用特权

评论回复
16
elsaflower| | 2023-12-10 16:56 | 只看该作者
需要在EXTI初始化函数中配置PB3为外部中断

使用特权

评论回复
17
ulystronglll| | 2023-12-10 17:20 | 只看该作者
可能是由于 配置不正确或者中断优先级设置不正确导致的。

使用特权

评论回复
18
belindagraham| | 2023-12-10 18:06 | 只看该作者
需要在stm32f1xx_hal_msp.c文件中的MSP初始化函数中,取消PB3的JTAG/SWD配置。然后,你需要在stm32f1xx_it.c文件中的相应的中断服务程序中,添加PB3的外部中断处理代码。

使用特权

评论回复
19
lihuami| | 2023-12-12 10:08 | 只看该作者
已经正确实现了中断处理函数,并且它能够正确处理中断。

使用特权

评论回复
20
mnynt121| | 2023-12-12 10:31 | 只看该作者
外部中断的触发方式是否正确              

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1392

主题

4448

帖子

0

粉丝