大家帮我看个玄学问题吧:stm32f429程序卡死

2019-07-20 05:07发布

程序的大概目的:通过外部中断,按键按下后,在外部中断中会使对应的LED亮,并且通过串口发送键值以下是存在问题的代码:通过调试后发现,程序会卡死在 USART_GetFlagStatus()中,但是程序根本就没完成串口初始化

int main()
{
        KeyInit();
        ExtiInit();
        LED_Init();
        NvicInit();
        UsartInit();
        while (1);
}

void EXTI0_IRQHandler()
{
        if (EXTI_GetITStatus(EXTI_Line0))
        {
                RLED_Toggle;
                printf("PA0 response ");
        }
        EXTI_ClearFlag(EXTI_Line0);
}

void EXTI15_10_IRQHandler()
{
        if (EXTI_GetITStatus(EXTI_Line13))
        {
                BLED_Toggle;
                printf("PC13 response ");
        }
        EXTI_ClearFlag(EXTI_Line13);
}



后来瞎鸡儿改代码,发现只是将        NvicInit(); 与UsartInit();交换了下位置程序就运行正常了
这两个函数代码如下
NvicInit(); 实现外部中断的配置
void NvicInit()
{
        NVIC_InitTypeDef NvicStructure;
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

        NvicStructure.NVIC_IRQChannel = EXTI0_IRQn;
        NvicStructure.NVIC_IRQChannelCmd = ENABLE;
        NvicStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NvicStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_Init(&NvicStructure);

        NvicStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
        NvicStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NvicStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_Init(&NvicStructure);
}


UsartInit();实现串口中断和串口的配置
void UsartInit()
{
        UsartGpioInit();
        Init();
        NvicConfig();
}


void Init()
{
        USART_InitTypeDef        UsartStructure;
        RCC_APB2PeriphClockCmd(UsartClk, ENABLE);
        USART_StructInit(&UsartStructure);

        UsartStructure.USART_BaudRate = DeaultBaudRate;
        UsartStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        UsartStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
        UsartStructure.USART_Parity = USART_Parity_No;
        UsartStructure.USART_StopBits = USART_StopBits_1;
        UsartStructure.USART_WordLength = USART_WordLength_8b;

        USART_Init(DefaultUsart, &UsartStructure);
        USART_Cmd(DefaultUsart, ENABLE);
        USART_ITConfig(DefaultUsart, USART_IT_RXNE, ENABLE);
}

void NvicConfig()
{
        NVIC_InitTypeDef        NvicStructure;
       
        NvicStructure.NVIC_IRQChannel = USART1_IRQn;
        NvicStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NvicStructure.NVIC_IRQChannelSubPriority = 6;
        NvicStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NvicStructure);
}


求救啊!!!大佬们、原子哥,救救孩子吧
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
jermy_z
1楼-- · 2019-07-20 06:32
 精彩回答 2  元偷偷看……
活捉奥巴马
2楼-- · 2019-07-20 07:28
程序还没有进入串口的配置就卡死了。在NvicInit();UsartInit();两处设断点根本到不了
活捉奥巴马
3楼-- · 2019-07-20 11:24
求助啊,大家可以分享下自己的看法吗
活捉奥巴马
4楼-- · 2019-07-20 11:59
 精彩回答 2  元偷偷看……
活捉奥巴马
5楼-- · 2019-07-20 13:19
jermy_z 发表于 2018-11-4 11:22
这不是玄学,STM32的中断开启时会进入一次,而你在中断里调用了printf,但是此时你的串口还未初始化,所以 ...

兄弟,我明白了。谢谢谢谢
https://blog.csdn.net/ygt666/article/details/79586390
772029356
6楼-- · 2019-07-20 16:50
jermy_z 发表于 2018-11-4 10:36
这不是玄学,STM32的中断开启时会进入一次,而你在中断里调用了printf,但是此时你的串口还未初始化,所以 ...

阿黄 。。。。

一周热门 更多>