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