求助!! ADC_DMA中断进不去,标志位始终没改变,ADC_DMA是在ADC之后初始化的
//多文件编程,这里是ADC_DMA.c文件#include "STC8A8K64D4.H"
#include "ADC.h"
#include <intrins.h>
#include "oled.h"
#include "delay.h"
#include "adc_dma.h"
unsigned char xdata adc_samples_buff = {0};
void DMA_ADC_Isr() interrupt 48
{
if(DMA_ADC_STA & 0x01)
{
DMA_ADC_STA = 0x00;//清零中断标志位
DMA_ADC_RXAH = ((unsigned char)&adc_samples_buff); //ADC转换数据存储地址,即ADC DMA的目的地址
DMA_ADC_RXAL = ((unsigned char)&adc_samples_buff);
adc_dma_complete = 1;//转换完成
DMA_ADC_CR = 0xc0; //启动ADC_DMA转换
}
}
void adc_dma_init()
{
DMA_ADC_STA &= 0x00; //清零中断标志位
DMA_ADC_CFG = 0x80; // 开启DMA完成中断 ADC_DMA中断优先级最高
DMA_ADC_RXAH = ((unsigned char)&adc_samples_buff); //ADC转换数据存储地址,即ADC DMA的目的地址
DMA_ADC_RXAL = ((unsigned char)&adc_samples_buff);
DMAFinished = 1; //初始化完成标志位
DMA_ADC_CFG2 = 0x00; // 单次转换
DMA_ADC_CHSW0 = 0x00; // 关闭高通道
DMA_ADC_CHSW1 = 0xff; // 开启低通道
DMA_ADC_CR = 0xC0; //允许 ADC_DMA 功能 开始 ADC_DMA 操作
}
void adc_dma_voltage()
{
float xdata voltage;//存放ADC采样值计算后的电压值
unsigned char i;
if(adc_dma_complete)
{
adc_dma_complete = 0;
for (i=0;i<8;i++)
{
voltage = ((adc_samples_buff*256)+adc_samples_buff)*15/4096;
(voltage>9) ? (Pin_EC = 1) : (Pin_EC = 0);
//OLED_ShowNum(10,7,7,1,8);
OledShowFloatWithoutPole2(i*16,7,voltage,2);
}
}
}
//这里是ADC_DMA.h文件
#ifndef __ADC_DMA_H_
#define __ADC_DMA_H_
void adc_dma_init();
void adc_dma_voltage();
extern bit adc_dma_complete;
extern unsigned char xdata adc_samples_buff;
extern bit DMAFinished;
extern unsigned int xdata Pin_EC;
#endif
这个是全体工程,很神奇的是之前进去过ADC_DMA中断,但改了一下motor函数就进不去了{:cahan:}
深圳国芯人工智能有限公司-实验箱
此处 BMM 就是指 DMA
interrupt 48,中断号不是最大支持到32吗,是不是得做个中断跳转。 jsryveti 发表于 2025-6-4 17:48
interrupt 48,中断号不是最大支持到32吗,是不是得做个中断跳转。
可以看下手册这个章节
页:
[1]