OpenEdv-开源电子网

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

调试总是死在NVIC_Init(&NVIC_Initstuctrue);一步步执行可以通过 全速就会死 求大神指导

[复制链接]

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-9
在线时间
4 小时
发表于 2019-1-9 11:18:53 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

89

帖子

0

精华

高级会员

Rank: 4

积分
686
金钱
686
注册时间
2017-8-8
在线时间
494 小时
发表于 2019-1-9 11:30:01 | 显示全部楼层
在某些地方加延时试试
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-9
在线时间
4 小时
 楼主| 发表于 2019-1-9 11:34:35 | 显示全部楼层
Arya 发表于 2019-1-9 11:30
在某些地方加延时试试

void RS485_Init(void)
{
        USART_InitTypeDef USART_Initstucture;
        GPIO_InitTypeDef GPIO_Initstucture;
        NVIC_InitTypeDef NVIC_Initstuctrue;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
       
        GPIO_Initstucture.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Initstucture.GPIO_Pin=GPIO_Pin_9;
        GPIO_Initstucture.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_Initstucture);
       
        GPIO_Initstucture.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Initstucture.GPIO_Pin=GPIO_Pin_10;
  GPIO_Init(GPIOA,&GPIO_Initstucture);
       
        GPIO_Initstucture.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Initstucture.GPIO_Pin=GPIO_Pin_8;
        GPIO_Initstucture.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_Initstucture);
       
        USART_Initstucture.USART_BaudRate=9600;
        USART_Initstucture.USART_HardwareFlowControl=USART_WordLength_8b;
        USART_Initstucture.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        USART_Initstucture.USART_Parity=USART_Parity_No;
        USART_Initstucture.USART_StopBits=USART_StopBits_1;
  USART_Init(USART1,&USART_Initstucture);
        USART_Cmd(USART1,ENABLE);
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_ClearFlag(USART1,USART_FLAG_TC);
       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_Initstuctrue.NVIC_IRQChannel=USART1_IRQn;
        NVIC_Initstuctrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Initstuctrue.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_Initstuctrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_Initstuctrue);
       
GPIO_ResetBits(GPIOA,GPIO_Pin_8);

}这是我的程序 就是个初始化程序 每次都死在NVIC_Init(&NVIC_Initstuctrue);帮忙看哈在哪里加延时嘛 谢谢了
回复

使用道具 举报

4

主题

79

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2018-1-31
在线时间
46 小时
发表于 2019-1-9 15:06:10 | 显示全部楼层
就只有RS485初始化?
前面没有其他程序?
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
中断优先级分组,不是RS485管的事情。
应该是在一上电,MAIN函数最前面,没有任何初始化中断之前配置好优先级分组。
后面的各外设中断配置,不要在配置优先级分组,否则,可能会有问题。
说白了就是,假如一个串口中断抢占配置为5,你现在修改优先级分组,没有了抢占优先级,串口中断可能就会出问题。
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-9
在线时间
4 小时
 楼主| 发表于 2019-1-9 15:36:58 | 显示全部楼层
屋脊雀 发表于 2019-1-9 15:06
就只有RS485初始化?
前面没有其他程序?
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

有啊 就是485接收 这死在NVIC_Init不知所措 在原来中断分组是在 main里面的  也是会死在这里
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2019-1-9 15:47:39 | 显示全部楼层
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
这句放在main函数一开始,其他地方不要写这句就行了
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-9
在线时间
4 小时
 楼主| 发表于 2019-1-9 16:11:39 | 显示全部楼层
szczyb1314 发表于 2019-1-9 15:47
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
这句放在main函数一开始,其他地方不要写这句就行了

但是还是会死掉  
回复

使用道具 举报

4

主题

349

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1046
金钱
1046
注册时间
2017-5-19
在线时间
335 小时
发表于 2019-1-9 16:17:50 | 显示全部楼层
用调试器看死在哪里了
[mw_shl_code=applescript,true]void RS485_Init(void)
{
        USART_InitTypeDef USART_Initstucture;
        GPIO_InitTypeDef GPIO_Initstucture;
        NVIC_InitTypeDef NVIC_Initstuctrue;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
        
        GPIO_Initstucture.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Initstucture.GPIO_Pin=GPIO_Pin_9;
        GPIO_Initstucture.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_Initstucture);
        
        GPIO_Initstucture.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Initstucture.GPIO_Pin=GPIO_Pin_10;
  GPIO_Init(GPIOA,&GPIO_Initstucture);
        
        GPIO_Initstucture.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Initstucture.GPIO_Pin=GPIO_Pin_8;
        GPIO_Initstucture.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_Initstucture);
        
        USART_Initstucture.USART_BaudRate=9600;
        USART_Initstucture.USART_HardwareFlowControl=USART_WordLength_8b;
        USART_Initstucture.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        USART_Initstucture.USART_Parity=USART_Parity_No;
        USART_Initstucture.USART_StopBits=USART_StopBits_1;
        USART_Init(USART1,&USART_Initstucture);
        USART_Cmd(USART1,ENABLE);
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_Initstuctrue.NVIC_IRQChannel=USART1_IRQn;
        NVIC_Initstuctrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Initstuctrue.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_Initstuctrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_Initstuctrue);
        
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}[/mw_shl_code]
用这个还有问题,那要么你中断函数名错了,或者根本没写
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-9
在线时间
4 小时
 楼主| 发表于 2019-1-9 16:40:40 | 显示全部楼层
wxjhby 发表于 2019-1-9 16:17
用调试器看死在哪里了
[mw_shl_code=applescript,true]void RS485_Init(void)
{

[mw_shl_code=c,true]void RS485_Init(void)
{
        USART_InitTypeDef USART_Initstucture;
        GPIO_InitTypeDef GPIO_Initstucture;
        NVIC_InitTypeDef NVIC_Initstuctrue;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1,ENABLE);
         
        GPIO_Initstucture.GPIO_Mode=GPIO_Mode_AF_PP;
        GPIO_Initstucture.GPIO_Pin=GPIO_Pin_9;
        GPIO_Initstucture.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_Initstucture);
         
        GPIO_Initstucture.GPIO_Mode=GPIO_Mode_IN_FLOATING;
        GPIO_Initstucture.GPIO_Pin=GPIO_Pin_10;
        GPIO_Init(GPIOA,&GPIO_Initstucture);
         
        GPIO_Initstucture.GPIO_Mode=GPIO_Mode_Out_PP;
        GPIO_Initstucture.GPIO_Pin=GPIO_Pin_8;
        GPIO_Initstucture.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&GPIO_Initstucture);
         
        USART_Initstucture.USART_BaudRate=9600;
        USART_Initstucture.USART_HardwareFlowControl=USART_WordLength_8b;
        USART_Initstucture.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        USART_Initstucture.USART_Parity=USART_Parity_No;
        USART_Initstucture.USART_StopBits=USART_StopBits_1;
        USART_Init(USART1,&USART_Initstucture);
        USART_Cmd(USART1,ENABLE);
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
         
        NVIC_Initstuctrue.NVIC_IRQChannel=USART1_IRQn;
        NVIC_Initstuctrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Initstuctrue.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_Initstuctrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_Initstuctrue);
         
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}

void USART1_IRQHandler(void)
{
        u8 res;
        if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
        {
                res=USART_ReceiveData(USART1);
                if((USART_RX_STA&0X8000)==0)
                {
                        if(USART_RX_STA&0X4000)
                        {
                                if(res!=0X0a)USART_RX_STA=0;
                                else USART_RX_STA|=0X8000;       
                        }
                        else
                        {
                                if(res==0x0d)USART_RX_STA|=0X4000;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                                }
                        }
                }
        }
       
}
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        GPIO_SetBits(GPIOA,GPIO_Pin_8);               
          for(t=0;t<len;t++)               
        {
          while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
    USART_SendData(USART1,buf[t]);
        }         
        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
                  
        GPIO_ResetBits(GPIOA,GPIO_Pin_8);                               
}
还是死在NVIC_Init这里 这是全部的代码

回复

使用道具 举报

26

主题

355

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2017-4-1
在线时间
432 小时
发表于 2019-1-9 17:31:04 | 显示全部楼层
看着没问题啊,裸奔还是上系统了?
回复

使用道具 举报

9

主题

796

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2038
金钱
2038
注册时间
2017-8-2
在线时间
522 小时
发表于 2019-1-9 17:34:06 | 显示全部楼层
全速运行等他卡住然后暂停看他死哪里了
猪猪熊呢?
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-9
在线时间
4 小时
 楼主| 发表于 2019-1-9 17:47:45 | 显示全部楼层
323232 发表于 2019-1-9 17:34
全速运行等他卡住然后暂停看他死哪里了

每次死在USART_GetITStatus这个函数里  每次死的位置不一样 有时候也死在USART1_IRQHandler的第一个大括号那里
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-1-9
在线时间
4 小时
 楼主| 发表于 2019-1-9 19:01:03 | 显示全部楼层
323232 发表于 2019-1-9 17:34
全速运行等他卡住然后暂停看他死哪里了

大神求指导啊   脑壳都憋烂了啊
回复

使用道具 举报

4

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2017-7-23
在线时间
11 小时
发表于 2019-1-10 12:52:28 | 显示全部楼层
用的是keil吗 将优化改为level0看看!
回复

使用道具 举报

0

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2018-10-15
在线时间
46 小时
发表于 2019-1-23 17:15:50 | 显示全部楼层
串口需要在初始化的时候就清除接收中断标志位吗?USART_ClearITPendingBit(USART1, USART_IT_RXNE);
回复

使用道具 举报

82

主题

589

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1255
金钱
1255
注册时间
2017-11-18
在线时间
296 小时
发表于 2019-1-23 17:43:01 | 显示全部楼层
USART_Initstucture.USART_BaudRate=9600;
        USART_Initstucture.USART_HardwareFlowControl=USART_WordLength_8b;
        USART_Initstucture.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
        USART_Initstucture.USART_Parity=USART_Parity_No;
        USART_Initstucture.USART_StopBits=USART_StopBits_1;
  USART_Init(USART1,&USART_Initstucture);
        USART_Cmd(USART1,ENABLE);
        USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
        USART_ClearFlag(USART1,USART_FLAG_TC);
        
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_Initstuctrue.NVIC_IRQChannel=USART1_IRQn;
        NVIC_Initstuctrue.NVIC_IRQChannelCmd=ENABLE;
        NVIC_Initstuctrue.NVIC_IRQChannelPreemptionPriority=0;
        NVIC_Initstuctrue.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&NVIC_Initstuctrue);
串口配置代码和中断向量配置代码前后互换一下位置
没有脑袋
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-4-24
在线时间
3 小时
发表于 2019-9-27 16:09:14 | 显示全部楼层
本帖最后由 昵称不要太长 于 2019-9-27 16:14 编辑

不知道现在楼主解决了没有,其实出现这个问题,很大的原因是因为中断向量表被更改过造成的。楼主可以在整个工程中搜索一下这个宏“VECT_TAB_OFFSET”,正常情况下,如果是在flash中调试的话,那么整个宏应该是0的,如果你的那个工程是直接拿别人的过来改,那么,很有可能别人为了IAP或者是其他各种原因,会修改这个宏“VECT_TAB_OFFSET”的值,你只需要将它改为0即可,就像这样:#define VECT_TAB_OFFSET  0x0
001.png
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-4-24
在线时间
3 小时
发表于 2019-9-27 16:12:38 | 显示全部楼层
C:\Users\Administrator\Desktop\001.png
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2019-9-21
在线时间
1 小时
发表于 2020-1-5 14:17:20 | 显示全部楼层
大哥,都2020了,这个问题解决了吗?
回复

使用道具 举报

62

主题

275

帖子

4

精华

金牌会员

Rank: 6Rank: 6

积分
1155
金钱
1155
注册时间
2012-3-4
在线时间
80 小时
发表于 2020-5-15 17:14:58 | 显示全部楼层
昵称不要太长 发表于 2019-9-27 16:09
不知道现在楼主解决了没有,其实出现这个问题,很大的原因是因为中断向量表被更改过造成的。楼主可以在整个 ...

我的是你这个问题,IAP忘记改了什么,要不是你这个提醒,真不知道找到什么时候,现在写了注释在main里面
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-1 02:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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