OpenEdv-开源电子网

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

STM32 中断处理程序问题

[复制链接]

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
发表于 2011-8-3 17:02:24 | 显示全部楼层 |阅读模式

各位好,我用版主的开发板, 在DMA实验中,开启了中断功能, 再发现程序运行后,一但有中断,就跑飞导致系统复位了(备注: 系统开启了看门狗功能),程序如下,请各位帮分析一下
DMA.C文件源码
#include "dma.h"
/************
DMA1 第4通道中断服务程序
************/
void DMA1_Channel4_IRQHandler(void)
{
 if(DMA1->ISR & 1<<13) //传输完成
 { 
  DMA1->IFCR &=~(1<<13);
  LED0=!LED0;
 }
 if(DMA1->ISR & 1<<15)   //传输出错 
 { 
  DMA1->IFCR &=~(1<<15);
 }
 DMA1->IFCR &=~(1<<12);   // 清全局中断
}
void DMA1_4_Init(void)
{
 RCC->AHBENR|=1<<0;  //DMA1开启时钟
 USART1->CR3|=1<<7;  //开启USART1 的发送DMA功能
 DMA1_Channel4->CPAR=(u32)&USART1->DR;   //设置外设置地址  URART1_TX
 DMA1_Channel4->CMAR=(u32)&TempIntBuf;       //设置存储器地址
      
 DMA1_Channel4->CNDTR=20;     //一次发送20个字节
 DMA1_Channel4->CCR=0X00000;  // 复位控制寄存器
 DMA1_Channel4->CCR|=(3<<12)|(0<<10)|(0<<8)|(1<<7)|(0<<6)|(0<<5)|(1<<4)|(1<<3)|(1<<1);
   // 最高中断级别   存储器地址增量   从存储器写数据至外设  开启DMA发送完成及错误中断
 MY_NVIC_Init(2,2,DMA1_Channel4_IRQChannel,2); //定位中断入口及中断组\级别设置   ( 可能这里有问题,但我分析不出)
/////
}
void DMA1_4_Enable(void)
{
 DMA1_Channel4->CCR&=~(1<<0);//关DMA1第4通道 
 DMA1_Channel4->CNDTR=20; //重载发送数据为20
 DMA1_Channel4->CCR|=1<<0;//启动DMA
//
}

DMA.H文件源码:
#ifndef   _DMA_H_
#define  _DMA_H_
#include "sys.h"
#include "LED.h"
void DMA1_4_Init(void);
void DMA1_4_Enable(void);
extern u16 TempIntBuf[2000];
#endif
    再说明一下, 通过DMA发送的数据已OK,只是一发送完,系统就复位

Test.c

3.03 KB, 下载次数: 92

dma.h

163 Bytes, 下载次数: 106

dma.c

1.11 KB, 下载次数: 147

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2011-8-3 17:57:59 | 显示全部楼层
你还真无敌了,两个看门狗都开启了!!!!
中断导致看门狗复位,我推断你的原因是:
 1,进入普通中断函数,处理时间过长,而且又没有喂狗.导致独立看门狗复位.
2,进入普通中断函数,处理时间过长,此中断的优先级高于窗口看门狗的优先级,导致窗口看门狗的中断喂狗操作无法执行,导致复位.
 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-4 18:09:22 | 显示全部楼层
 中断处理程序应该时间不是很长,因为处理的数据很少, 不过你说得有道理 ,我先试试 ,谢了,等下有情况我再贴上来 
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-4 18:17:43 | 显示全部楼层
 开始时,Key0采用外部中断采集,看门狗全开时,快速按KEY0他会复位,后屏蔽主看门狗,复位依旧,再开户嘛看门狗屏蔽窗口看门狗,快速按KEY0,复位现象不在有   冒似窗口看门狗引起,  哈哈  ,  非常感觉原子兄指点 
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-4 18:32:37 | 显示全部楼层
感觉不对, 我把看门狗全关了, 只要按KEY1启动DMA串口发送, 没复位,但死机了,不知是不是我中断处理入口有问题 ,再请教 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2011-8-4 18:57:52 | 显示全部楼层
中断入口有问题会导致死机的哦.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-4 19:18:28 | 显示全部楼层
是的, 确实是中断处理函数名称有问题, 与 STM32F10x.s不相符引起 ,中断函数改为如下: 
void ADC_IRQHandler(void)
{
if(ADC1->SR & 0X02) //采集转换完成
{
Count=ADC1->DR; 
ADC1->SQR3&=0XFFFFFFE0;
ADC1->SQR3|=ADC_CH0;
ADC1->CR2|=1<<22; 
LED1=!LED1;
}
ADC1->SR=0x00000;
}
,在软件仿真时,可进入此中断处理函数, 但就是跳不出 ,还没弄明白  ..... 继续中 ............
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-4 19:19:51 | 显示全部楼层
同样, 下载程序后, 会死机 

回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-4 19:30:05 | 显示全部楼层
则才中断程序贴错了, DMA1-4通道中断服务程序如下: 

/************
DMA1 第4通道中断服务程序
************/
void DMAChannel4_IRQHandler(void)
{
if(DMA1->ISR & 1<<13) //传输完成 
{
DMA1->IFCR &=~(1<<13);
LED0=!LED0;
}
if(DMA1->ISR & 1<<15)   //传输出错
{
DMA1->IFCR &=~(1<<15);
}
DMA1->IFCR &=~(1<<12);  // 清全局中断
}
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-4 19:30:43 | 显示全部楼层
此程序在软件仿真时能进入,但就是跳不出 ,不知什么原因 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2011-8-5 00:07:00 | 显示全部楼层
实际硬件呢?可否跳出?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-5 10:20:43 | 显示全部楼层
硬件也跳不出来 
  进去之后也死机
回复 支持 反对

使用道具 举报

5

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2011-5-4
在线时间
0 小时
 楼主| 发表于 2011-8-5 10:21:57 | 显示全部楼层
原子兄这么晚了还在帮助我们, 可哥可泣啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2011-8-5 10:48:42 | 显示全部楼层
进入中断跳不出,应该是中断标志未清除.你看看中断标志.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
52
金钱
52
注册时间
2011-8-12
在线时间
0 小时
发表于 2011-8-12 17:35:20 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
为什么清不掉中断标志,用 TIM1->SR&=~(1<<0);   ~~清不掉啊~~  寄存器的UIF位一直是打勾的~~

用 TIM_ClearITPendingBit(TIM1, TIM_FLAG_Update); 还是打勾,郁闷啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2011-8-12 19:32:08 | 显示全部楼层
用库,我也郁闷啊....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

19

主题

43

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
204
金钱
204
注册时间
2013-8-29
在线时间
30 小时
发表于 2014-4-3 22:27:40 | 显示全部楼层
不知楼主解决了没?
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-12 19:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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