请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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); }