OpenEdv-开源电子网

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

stm32f103vet6不能使用中断,请问有什么原因会导致这个问题?

[复制链接]

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
发表于 2018-6-5 08:42:03 | 显示全部楼层 |阅读模式
10金钱
比如我使用串口中断,程序会卡死不动。。。
配置了一个定时器中断,程序会在定时器初始化的地方卡死,调试发现程序在初始化后的下一条语句或函数卡住不动。继续调试会出错,退出调试.

最佳答案

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

VECT_TAB_SRAM 把你工程里的这个宏定义去掉,道理你自己懂得
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-6-5 08:42:04 | 显示全部楼层

VECT_TAB_SRAM
把你工程里的这个宏定义去掉,道理你自己懂得
一分耕耘一分收获。
回复

使用道具 举报

0

主题

58

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2387
金钱
2387
注册时间
2017-1-15
在线时间
318 小时
发表于 2018-6-5 08:46:40 | 显示全部楼层
可以仿真进入卡死的那一个函数,单步执行,看下具体卡在什么地方 一般很有可能卡在while循环,最好是贴出你的代码,大家才好帮你分析
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 08:53:46 | 显示全部楼层
lf19880813 发表于 2018-6-5 08:46
可以仿真进入卡死的那一个函数,单步执行,看下具体卡在什么地方 一般很有可能卡在while循环,最好是贴出你 ...

void Usart3_init(u32 bound)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);

    USART_DeInit(USART3);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;           //PB10 TX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      //¸′óÃíÆíìêä3ö  
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;              //PB11 RX
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   
    GPIO_Init(GPIOB, &GPIO_InitStructure);
  
    USART_InitStructure.USART_BaudRate = bound;                 
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;      
    USART_InitStructure.USART_Parity = USART_Parity_No;         
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  
    USART_Init(USART3, &USART_InitStructure);                        
   
          NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);         
    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;      
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        
    NVIC_Init(&NVIC_InitStructure);                        
   
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);         
    USART_Cmd(USART3, ENABLE);                              
          USART_ClearFlag(USART3, USART_FLAG_TC);
}


这是串口3中断的初始化配置,串口2也试过了,是一样的,一使用串口中断程序就卡主不动
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 09:00:42 | 显示全部楼层
qiuzhicheng 发表于 2018-6-5 08:53
void Usart3_init(u32 bound)
{
    GPIO_InitTypeDef GPIO_InitStructure;

这是定时器3的初始化配置和中断函数

void TIM3_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //ê±Öóê1Äü
       
        TIM_DeInit(TIM3);
       
        TIM_TimeBaseStructure.TIM_Period = 1000;
        TIM_TimeBaseStructure.TIM_Prescaler =72-1;
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

        TIM_ClearFlag(TIM2, TIM_FLAG_Update);
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE );

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

        TIM_Cmd(TIM3, ENABLE);  //ê1ÄüTIMx                                                                  
}


void TIM3_IRQHandler(void)   //TIM3ÖD¶Ï
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  
                GPIOB->ODR ^= (1<<8);
        }
}
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 09:06:01 | 显示全部楼层
lf19880813 发表于 2018-6-5 08:46
可以仿真进入卡死的那一个函数,单步执行,看下具体卡在什么地方 一般很有可能卡在while循环,最好是贴出你 ...

定时器初始化程序卡死的地方
QQ图片20180605090319.png
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 09:10:25 | 显示全部楼层
有时候又卡死在另一个地方,继续点调试就会弹出这个错误
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-6-5 09:32:24 | 显示全部楼层
请确认如下问题
1:NVIC 初始化放在 IO 初始化之前
2:总中断是否开启
3:外部晶振是否起振
4:是否有复用jtag功能
另外请发整个工程初始化的函数看看
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 09:39:26 | 显示全部楼层
lanlzp 发表于 2018-6-5 09:32
请确认如下问题
1:NVIC 初始化放在 IO 初始化之前
2:总中断是否开启

定时器初始化后,程序还会往后跑一段,我认为是进入了定时器中断导致程序卡死的,我把TIM_Cmd(TIM3, ENABLE);函数注释掉后,程序可以正常运行。

好的,我试试

这是我的初始化:

        //TIM3_Int_Init(4900,71);
        delay_init(72);
        LED_Init();
        KEY_Init();
        Usart3_init(9600);
        RTC_Init();  
        ili9341_Init();      
        IIC_Init_GPIO();
       
  TIM3_Int_Init(4900,71);

不管把TIM3_Int_Init(4900,71);初始化函数放在哪里,程序都会执行完这个函数后一段时间卡死,没有固定的位置,所以我判断是进了中断卡死的程序
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-6-5 09:45:04 | 显示全部楼层
qiuzhicheng 发表于 2018-6-5 09:39
定时器初始化后,程序还会往后跑一段,我认为是进入了定时器中断导致程序卡死的,我把TIM_Cmd(TIM3, ENAB ...

GPIOB->ODR ^= (1<<8); ????????
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 10:01:29 | 显示全部楼层
lanlzp 发表于 2018-6-5 09:32
请确认如下问题
1:NVIC 初始化放在 IO 初始化之前
2:总中断是否开启

1.我把NVIC初始化放在了IO口初始化前面,没有用
2.我在程序初始化上加了__enable_irq( );这个函数,据说是使能全部中断的,也没用(中断是默认全部使能的吧)
3.如图,程序上加了SystemInit();函数,调试可以进入图中断点,能否判断外部晶振是否起振
4.我用的是SW模式下载程序的,开发板没用jtag的接口引脚

里面的断电都能进

里面的断电都能进
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 10:02:11 | 显示全部楼层

一个LED灯,状态取反
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2018-6-5 10:23:50 | 显示全部楼层
qiuzhicheng 发表于 2018-6-5 10:02
一个LED灯,状态取反

注释掉这句led取反,应该是错的
另外是否有使用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 10:34:23 | 显示全部楼层
lanlzp 发表于 2018-6-5 10:23
注释掉这句led取反,应该是错的
另外是否有使用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ...

没用用到这个函数
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 10:42:58 | 显示全部楼层
lanlzp 发表于 2018-6-5 10:23
注释掉这句led取反,应该是错的
另外是否有使用GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE) ...

在初始化之前加上这个函数也没用
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 11:54:54 | 显示全部楼层
求助论坛大佬
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-6-5 12:08:42 | 显示全部楼层
上整个工程
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 13:35:02 | 显示全部楼层

这是整个工程文件,麻烦帮我看看出了什么问题

显示.rar

5.24 MB, 下载次数: 54

回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 13:35:22 | 显示全部楼层

非常感谢!
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 15:20:32 | 显示全部楼层
yklstudent 发表于 2018-6-5 15:15
VECT_TAB_SRAM
把你工程里的这个宏定义去掉,道理你自己懂得

本来就是注释了的呀
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 15:22:21 | 显示全部楼层
yklstudent 发表于 2018-6-5 15:15
VECT_TAB_SRAM
把你工程里的这个宏定义去掉,道理你自己懂得

在system_stm32f10x.c里面,是注释了的
QQ图片20180605151925.png
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2018-6-5 15:23:02 | 显示全部楼层
qiuzhicheng 发表于 2018-6-5 15:20
本来就是注释了的呀

打开你的工程options=>C/C++=>Preprocessor Symbols
自己好好看看
一分耕耘一分收获。
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 15:29:13 | 显示全部楼层
yklstudent 发表于 2018-6-5 15:23
打开你的工程options=>C/C++=>Preprocessor Symbols
自己好好看看

谢谢谢谢,改了之后就好了
回复

使用道具 举报

39

主题

535

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1065
金钱
1065
注册时间
2018-3-27
在线时间
378 小时
 楼主| 发表于 2018-6-5 15:34:06 | 显示全部楼层
yklstudent 发表于 2018-6-5 15:23
打开你的工程options=>C/C++=>Preprocessor Symbols
自己好好看看

非常感谢您
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-30 13:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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