各位好,我用版主的开发板, 在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,只是一发送完,系统就复位
|