This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/EK-TM4C1294XL:无法清除 ADC DMA 中断

Guru**** 1761415 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/674816/ccs-ek-tm4c1294xl-adc-dma-interrupt-cannot-be-cleared

器件型号:EK-TM4C1294XL

工具/软件:Code Composer Studio

您好!

在我的代码中、我为序列3配置 ADC0、并在序列完成后进行 DMA 传输。 转换序列的触发器为 ADC_TRIGGER_PROCESSOR.

现在、只要我触发一个转换序列、我的 ADC HWI (矢量表中的 ADC0序列0、#30) 就会在函数条目中使用以下寄存器内容进行调用:

ADC_ACTSS 0x0101
ADC_RIS 0x0001
ADC_IM 0x0001
ADC_ISC 0x0001

因此、现在为了清除中断、我调用 ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS0);

不会发生任何情况(与寄存器内容和程序流有关)、中断保持有效、程序重新进入 HWI。

提前感谢您的帮助!

以下是我的代码:

//
*版权所有(c) 2015,Texas Instruments Incorporated
*保留所有权利。
*
*
只要
符合以下条件*、允许以源代码和二进制形式重新分发和使用:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
***二进制形式的再发行必须在

*随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
***未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
*
*本软件由版权所有者和贡献者"按原样"提供
*、

不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
*贡献者都不对任何直接、间接、偶然、特殊、
*模范、 或相应的损害(包括但不限于
*采购替代产品或服务;丧失使用、数据或利润;
*或业务中断)、但出于任何责任理论
、*无论是在合同中、严格责任还是由于
使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
、*即使已获悉可能会发生此类损坏。
//

/*
=== empty_min.c ====
//
//* XDCtools 头文件*/
#include 
#include 
#include 
#include 
#include 

/* BIOS 头文件*/
#include 
#include 
#include 
#include 
#include 

/* TI-RTOS 头文件*//
#include 
#include 
//#include 
//#include 
//#include 
//#include 
//#include 
//#include 
//#include 


/*板头文件*/
#include "Board.h"
#include 
#include 
#include 
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_adc.h"
#include "inc/hw_types.h"

#include 
#include 
#include 
#include 
#include 

#define TASKSTACKSIZE 512

Task_Structt 任务0Struct;
字符任务0Stack[TASKSTACKSIZE];

uint32_t start、stop、result;

uint32_t pui32ADC0Value[8];
uint32_t adc_value[8];
uint32_t adc_value1[8];

#pragma DATA_ALIGN (DMAcontroltable、1024)
uint8_t DMAcontroltable[1024];


//================================ 任务
空心跳 Fxn (UARg arg0、UARg arg1)
{
while (1){
Task_sleep (unsigned int) arg0);
GPIO_TOGGLE (Board_LED0);
}
}//=================================

config

void configure_adc(){
//启用外设
SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);

ADCClockConfigSet (ADC0_BASE、ADC_CLOCK_SRC_MOSC | ADC_CLOCK_RATE_FULL、1);//将 ADC 时钟设置为25MHz (MOSC)

//设置引脚功能
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_3);//AIN0
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_2);//AIN1
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_1);//AIN2
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0);//AIN3
GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_7);//AIN4
GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_6);//AIN5
GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_5);//AIN6
GPIOPinTypeADC (GPIO_PORTD_base、GPIO_PIN_4);//AIN7

/*GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_5);//AIN8
GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_4);//AIN9
GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_4);//AIN10
GPIOPinTypeADC (GPIO_PORTB_BASE、GPIO_PIN_5);//AIN11*/

//启用采样序列3.
ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_PROCESSOR、3);

ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH0);
ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH1);
ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH2);
ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH3);
ADCSequenceStepConfigure (ADC0_BASE、0、4、ADC_CTL_CH4);
ADCSequenceStepConfigure (ADC0_BASE、0、5、ADC_CTL_CH5);
ADCSequenceStepConfigure (ADC0_BASE、0、6、ADC_CTL_CH6);
ADCSequenceStepConfigure (ADC0_BASE、0、7、ADC_CTL_CH7 | ADC_CTL_END);

return;
}

void configure_dma(){
//ADC DMA
ADCSequenceDMAEnable (ADC0_BASE、0);

uDMAEnable();

uDMAControlBaseSet (DMAcontroltable);

uDMAChannelAssign (UDMA_CHANGE_ADC0);

uDMAChannelControlSet (UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT、UDMA_SIZE 32 | UDMA_SRC_INC_NONE | UDMA_DST_ARC_32 | UDMA_INC_8);
uDMAChannelTransferSet (UDMA_CHANGE_ADC0 | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *)(ADC0_BASE + ADC_O_SSFIFO0)、pui32ADC0Value、8);
//uDMAChannelAttributeEnable (UDMA_CHANGE_ADC0、UDMA_ATTR_USEBURST);

返回;
}

//================================= Hwi
/*void timerInterrupt (UArg0){
TimerIntClear (TIMER2_base、TIMER_TINA_TIMEOUT);
Swi_post (sw0);
return;
}*/

void hwi_dma_error(){

return;
}

void hwi_ADC0 (){
//uDMAIntClear (UDMA_CHANGE_ADC0);

ADCIntClearEx (ADC0_BASE、ADC_INT_DMA_SS0);

返回;
}

//================================= 时钟
空 ledToggle (UArg0){
START = Timestamp_get32();
GPIO_TOGGLE (Board_LED1);
//对于(i = 0;i < 999999;i++){}
//Log_Info1 ("切换 LED %d "、i);
STOP = Timestamp_get32();

结果=停止-启动;
返回;

}


/*
=== main ====
*/
int main (void)
{
uint32_t f_clk;
f_clk = SysCtlClockFreqSet (SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、120000000);

Task_Params taskParams;

/*呼叫板初始化函数*/
Board_initGeneral();
// Board_initEMAC();
Board_initGPIO();
// Board_initI2C();
// Board_initSDSPI();
// Board_initSPI ();
// Board_initUART ();
// Board_initUSB (Board_USBDEVICE);
// Board_initUSBMSCHFatFs();
// Board_initWatchdog();
// Board_initWiFi ();

SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
SysCtlPeripheralEnable (SYSCTL_Periph_TIMER2);

/*构造心跳任务线程*/
Task_Params_init (&taskParams);
taskParams.arg0 = 1000;
taskParams.STACKSIZE = TASKSTACKSIZE;
taskParams.stack =_task0Stack;
Task_construct(&task0Struct,(Task_FuncPtr)心跳 BeatFxn、&taskParams、NULL);

//配置时钟
CONFIG_ADC();
CONFIG_DMA();

//
//将 Timer0B 中断配置为计时器超时。
//

TimerConfigure (TIMER2_base、TIMER_CFG_A_PERIODICRACASE);
TimerLoadSet (TIMER2_base、timer_A、12000000);

//TimerIntEnable (TIMER2_base、TIMER_TINA_TIMEOUT);

//IntEnable (INT_TIMER2A);
TimerControlTrigger (TIMER2_base、timer_A、true);
TimerEnable (TIMER2_base、TIMER_A);

/*打开用户 LED */
GPIO_WRITE (Board_LED0、Board_LED_ON);
GPIO_WRITE (Board_LED1、Board_LED_ON);


ADCSequenceEnable (ADC0_BASE、0);
ADCIntEnableEx (ADC0_BASE、ADC_INT_DMA_SS0);

ADCProcessorTrigger (ADC0_BASE、0);

/*启动 BIOS */
BIOS_start();
//while (1);
返回(0);
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    问题已解决:我没有打电话 ,这是启用传输所必需的。