OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4744|回复: 7

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

[复制链接]

2

主题

8

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-11-4
在线时间
3 小时
发表于 2018-11-4 10:36:53 | 显示全部楼层 |阅读模式
1金钱
程序的大概目的:通过外部中断,按键按下后,在外部中断中会使对应的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\n");
        }
        EXTI_ClearFlag(EXTI_Line0);
}

void EXTI15_10_IRQHandler()
{
        if (EXTI_GetITStatus(EXTI_Line13))
        {
                BLED_Toggle;
                printf("PC13 response\n");
        }
        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);
}


求救啊!!!大佬们、原子哥,救救孩子吧

最佳答案

查看完整内容[请看2#楼]

这不是玄学,STM32的中断开启时会进入一次,而你在中断里调用了printf,但是此时你的串口还未初始化,所以直接干死
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13117
金钱
13117
注册时间
2012-11-26
在线时间
3813 小时
发表于 2018-11-4 10:36:54 | 显示全部楼层
这不是玄学,STM32的中断开启时会进入一次,而你在中断里调用了printf,但是此时你的串口还未初始化,所以直接干死
学无止境
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-11-4
在线时间
3 小时
 楼主| 发表于 2018-11-4 10:38:09 | 显示全部楼层
程序还没有进入串口的配置就卡死了。在NvicInit();UsartInit();两处设断点根本到不了
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-11-4
在线时间
3 小时
 楼主| 发表于 2018-11-4 10:56:58 | 显示全部楼层
求助啊,大家可以分享下自己的看法吗
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-11-4
在线时间
3 小时
 楼主| 发表于 2018-11-4 11:44:05 | 显示全部楼层
jermy_z 发表于 2018-11-4 11:22
这不是玄学,STM32的中断开启时会进入一次,而你在中断里调用了printf,但是此时你的串口还未初始化,所以 ...

谢谢你的回复,STM32的中断开启时会进入一次是什么意思?这个我不太明白。
我没有按下按键,那么它应该不会进入中断的,就不会调用printf了,麻烦兄弟再指点下
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2018-11-4
在线时间
3 小时
 楼主| 发表于 2018-11-4 11:54:48 | 显示全部楼层
jermy_z 发表于 2018-11-4 11:22
这不是玄学,STM32的中断开启时会进入一次,而你在中断里调用了printf,但是此时你的串口还未初始化,所以 ...

兄弟,我明白了。谢谢谢谢
https://blog.csdn.net/ygt666/article/details/79586390
回复

使用道具 举报

5

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-1-14
在线时间
26 小时
发表于 2018-11-14 09:39:20 | 显示全部楼层
jermy_z 发表于 2018-11-4 10:36
这不是玄学,STM32的中断开启时会进入一次,而你在中断里调用了printf,但是此时你的串口还未初始化,所以 ...

阿黄 。。。。
回复

使用道具 举报

16

主题

111

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1242
金钱
1242
注册时间
2017-3-18
在线时间
312 小时
发表于 2018-11-15 09:39:12 | 显示全部楼层
jermy_z 发表于 2018-11-4 10:36
这不是玄学,STM32的中断开启时会进入一次,而你在中断里调用了printf,但是此时你的串口还未初始化,所以 ...

会进入一次个人觉得说法不准确,只是会产生中断标识一次,随后你给他清除掉,就能不进入了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 17:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表