TM4C1294使用ADC和DMA,怎样配置DMA传输结束中断

2019-03-24 08:27发布

定时器触发ADC采样,之后用DMA把数据传出去,问题出在中断函数是由ADC采样触发的,而不是由DMA传输完成触发,所以请帮忙看一下,怎样配置为DMA传输结束触发中断,代码如下
  1. #include <stdint.h>
  2. #include <stdbool.h>
  3. #include "inc/hw_memmap.h"
  4. #include "driverlib/rom.h"
  5. #include "driverlib/gpio.h"
  6. #include "driverlib/pin_map.h"
  7. #include "driverlib/sysctl.h"
  8. #include "driverlib/uart.h"

  9. #include "utils/uartstdio.h"

  10. #include "myfunctions/led.h"
  11. #include "myfunctions/delay.h"

  12. #include "driverlib/timer.h"
  13. #include "driverlib/udma.h"
  14. #include "driverlib/adc.h"
  15. #include "driverlib/adc.c"

  16. //****************************************************************************

  17. // System clock rate in Hz.

  18. //****************************************************************************
  19. uint32_t g_ui32SysClock;


  20. uint32_t ADCBufferA[1024];
  21. uint32_t ADCBufferB[1024];

  22. uint32_t ADCBufferACount=0;
  23. uint32_t ADCBufferBCount=0;

  24. uint32_t TimeCount;

  25. //*****************************************************************************
  26. //
  27. // The control table used by the uDMA controller.  This table must be aligned
  28. // to a 1024 byte boundary.
  29. //
  30. //*****************************************************************************
  31. #if defined(ewarm)
  32. #pragma data_alignment=1024
  33. uint8_t pui8ControlTable[1024];
  34. #elif defined(ccs)
  35. #pragma DATA_ALIGN(pui8ControlTable, 1024)
  36. uint8_t pui8ControlTable[1024];
  37. #else
  38. uint8_t pui8ControlTable[1024] __attribute__ ((aligned(1024)));
  39. #endif

  40. //*****************************************************************************

  41. // Configure the UART and its pins.  This must be called before UARTprintf().

  42. //*****************************************************************************
  43. void
  44. ConsoleInit(void)
  45. {
  46.     // Enable the GPIO Peripheral used by the UART.
  47.     ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

  48.     // Enable UART0.
  49.     ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

  50.     // Configure GPIO Pins for UART mode.
  51.     ROM_GPIOPinConfigure(GPIO_PA0_U0RX);
  52.     ROM_GPIOPinConfigure(GPIO_PA1_U0TX);
  53.     ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

  54.     // Initialize the UART for console I/O.
  55.     UARTStdioConfig(0, 115200, g_ui32SysClock);
  56. }

  57. void
  58. Timer0AIntHandler()
  59. {
  60.                 TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
  61.                 TimeCount++;
  62. }


  63. void
  64. ADCIntHandler()
  65. {
  66.                 uint32_t ui32Mode;               
  67.                 LED_SET(4);
  68.                 ADCIntClearEx(ADC0_BASE, ADC_INT_DMA_SS0);
  69.        
  70.                 ui32Mode = uDMAChannelModeGet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT);
  71.     if(ui32Mode == UDMA_MODE_STOP)
  72.     {
  73.         ADCBufferACount++;
  74.                                 ADCBufferACount &= 1024;
  75.                                 ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT,
  76.                                                                                                                                          UDMA_MODE_PINGPONG,
  77.                                                                                                                                          (void *)(ADC0_BASE+ADC_O_SSFIFO0),
  78.                                                                                                                                          &ADCBufferA[ADCBufferACount*16], 8);
  79.     }       
  80.        
  81.                 ui32Mode = uDMAChannelModeGet(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT);
  82.     if(ui32Mode == UDMA_MODE_STOP)
  83.     {
  84.         ADCBufferBCount++;
  85.                                 ADCBufferBCount &= 1024;
  86.                                 ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT,
  87.                                                                                                                                          UDMA_MODE_PINGPONG,
  88.                                                                                                                                          (void *)(ADC0_BASE+ADC_O_SSFIFO0),
  89.                                                                                                                                          &ADCBufferB[ADCBufferBCount*16], 8);
  90.     }               
  91.                
  92.     if(!ROM_uDMAChannelIsEnabled(UDMA_CHANNEL_ADC0))
  93.     {
  94.                                 LED_SET(4);
  95.         ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC0);
  96.                        
  97.     }
  98. //                                UARTprintf(" Buffer A ");
  99.                 //                                UARTprintf("Value:%dmV ",(ADCBufferA[Index] * 3300)/4096);
  100.                                                 UARTprintf(" Buffer A  Value%d:%d ",ADCBufferACount,ADCBufferA[ADCBufferACount]);
  101. //                                UARTprintf(" Buffer B ");       
  102.                 //                                UARTprintf("Value:%dmV ",(ADCBufferB[Index] * 3300)/4096);
  103.                                                 UARTprintf(" Buffer B  Value%d:%d ",ADCBufferBCount,ADCBufferB[ADCBufferBCount]);
  104.                 if(TimeCount>5)
  105.                                 ADCIntDisableEx(ADC0_BASE, ADC_INT_DMA_SS0);
  106.                 LED_CLR(4);
  107. }

  108. int
  109. main(void)
  110. {
  111.        
  112.                 //&Aring;&auml;&Ouml;&Atilde;&Ecirc;±&Ouml;&Oacute;120MHz
  113.                 g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |
  114.                 SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |
  115.                 SYSCTL_CFG_VCO_480), 120000000);
  116.        
  117.                 //&Aring;&auml;&Ouml;&Atilde;UART0
  118.                 ConsoleInit();       
  119.                 //&Aring;&auml;&Ouml;&Atilde;LED
  120.                 LED_Init();
  121.        
  122.                 //&Aring;&auml;&Ouml;&Atilde;TIMER 0
  123.                 SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
  124.                 TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
  125.                 TimerLoadSet(TIMER0_BASE, TIMER_A, g_ui32SysClock);
  126.                 TimerIntRegister(TIMER0_BASE, TIMER_A, Timer0AIntHandler);
  127.                 IntEnable(INT_TIMER0A);
  128.                 TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
  129.                 TimerEnable(TIMER0_BASE, TIMER_A);

  130.                 //&Ecirc;&sup1;&Auml;&Uuml;DMA&Auml;&pound;&iquest;é
  131.                 SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
  132.                 uDMAEnable();
  133.                 uDMAControlBaseSet(pui8ControlTable);               
  134.                
  135.                 //&Ecirc;&sup1;&Auml;&Uuml;ADC0&Auml;&pound;&iquest;é
  136.                 SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0);
  137.                 //&Aring;&auml;&Ouml;&Atilde;&sup2;&Eacute;&Ntilde;ù&ETH;ò&Aacute;&ETH;&micro;&Auml;&acute;&yen;·&cent;&Ocirc;&acute;&ordm;&Iacute;&Oacute;&Aring;&Iuml;&Egrave;&frac14;&para;
  138.                 ADCSequenceConfigure(ADC0_BASE, 0, ADC_TRIGGER_TIMER, 0);
  139.                 //&Aring;&auml;&Ouml;&Atilde;ADC&acute;&yen;·&cent;
  140.                 TimerControlTrigger(TIMER0_BASE, TIMER_A, true);
  141.                
  142.                 //&Aring;&auml;&Ouml;&Atilde;ADC&Ouml;&ETH;&para;&Iuml;
  143.                 ADCIntEnable(ADC0_BASE, 0);
  144.                 //&Ouml;&ETH;&para;&Iuml;&Ntilde;&iexcl;&Ocirc;&ntilde;
  145.                 ADCIntEnableEx(ADC0_BASE, ADC_INT_DMA_SS0);
  146.                 //×&cent;&sup2;á&Ouml;&ETH;&para;&Iuml;&ordm;&macr;&Ecirc;&yacute;
  147.                 ADCIntRegister(ADC0_BASE, 0, ADCIntHandler);
  148.                 //&Ecirc;&sup1;&Auml;&Uuml;ADC&Ouml;&ETH;&para;&Iuml;
  149.                 IntEnable(INT_ADC0SS0);               
  150.                
  151.                 //&Aring;&auml;&Ouml;&Atilde;&sup2;&Eacute;&Ntilde;ù&ETH;ò&Aacute;&ETH;&micro;&Auml;&frac12;&Uacute;&Aring;&Auml;
  152.                 ADCSequenceStepConfigure(ADC0_BASE, 0, 0, ADC_CTL_CH0);
  153.                 ADCSequenceStepConfigure(ADC0_BASE, 0, 1, ADC_CTL_CH0);
  154.                 ADCSequenceStepConfigure(ADC0_BASE, 0, 2, ADC_CTL_CH0);
  155.                 ADCSequenceStepConfigure(ADC0_BASE, 0, 3, ADC_CTL_CH0);
  156.                 ADCSequenceStepConfigure(ADC0_BASE, 0, 4, ADC_CTL_CH0);
  157.                 ADCSequenceStepConfigure(ADC0_BASE, 0, 5, ADC_CTL_CH0);
  158.                 ADCSequenceStepConfigure(ADC0_BASE, 0, 6, ADC_CTL_CH0);
  159.                 ADCSequenceStepConfigure(ADC0_BASE, 0, 7, ADC_CTL_CH0 | ADC_CTL_END);
  160.                 //&Ecirc;&sup1;&Auml;&Uuml;&sup2;&Eacute;&Ntilde;ù&ETH;ò&Aacute;&ETH;&micro;&Auml;DMA&acute;&laquo;&Ecirc;&auml;
  161.                 ADCSequenceDMAEnable(ADC0_BASE, 0);

  162.                 //&Aring;&auml;&Ouml;&Atilde;&Iacute;¨&micro;&Agrave;&Ecirc;&ocirc;&ETH;&Ocirc;               
  163.                 ROM_uDMAChannelControlSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT,
  164.                                                                                                                         UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 |
  165.                                                                                                                         UDMA_ARB_4);
  166.     ROM_uDMAChannelControlSet(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT,
  167.                               UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 |
  168.                               UDMA_ARB_4);                       
  169.                 //&Aring;&auml;&Ouml;&Atilde;&acute;&laquo;&Ecirc;&auml;&sup2;&Icirc;&Ecirc;&yacute;       
  170.     ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_PRI_SELECT,
  171.                                UDMA_MODE_PINGPONG,
  172.                                (void *)(ADC0_BASE+ADC_O_SSFIFO0),
  173.                                ADCBufferA, 8);
  174.     ROM_uDMAChannelTransferSet(UDMA_CHANNEL_ADC0 | UDMA_ALT_SELECT,
  175.                                UDMA_MODE_PINGPONG,
  176.                                (void *)(ADC0_BASE+ADC_O_SSFIFO0),
  177.                                ADCBufferB, 8);
  178.                 //&Ecirc;&sup1;&Auml;&Uuml;&Iacute;¨&micro;&Agrave;
  179.                 ROM_uDMAChannelEnable(UDMA_CHANNEL_ADC0);
  180.                 //&Ecirc;&sup1;&Auml;&Uuml;&sup2;&Eacute;&Ntilde;ù&ETH;ò&Aacute;&ETH;
  181.                 ADCSequenceEnable(ADC0_BASE, 0);
  182.                
  183.                 IntMasterEnable();
  184.                
  185.                 LED_SET(1);
  186.                 while(1)
  187.                 {
  188.                                 LED_SET(2);       
  189.                                 Delay_ms(200);
  190.                                 LED_CLR(2);
  191.                                 Delay_ms(200);
  192.                                 if(TimeCount>6)
  193.                                                 break;
  194.                 }
  195.                 uint32_t Index;
  196.                 UARTprintf(" Buffer A ");
  197.                 for(Index=0;Index<128;Index++)
  198. //                                UARTprintf("Value:%dmV ",(ADCBufferA[Index] * 3300)/4096);
  199.                                 UARTprintf("Value:%d ",ADCBufferA[Index]);
  200.                 UARTprintf(" Buffer B ");       
  201.                 for(Index=0;Index<128;Index++)
  202. //                                UARTprintf("Value:%dmV ",(ADCBufferB[Index] * 3300)/4096);
  203.                                 UARTprintf("Value:%d ",ADCBufferB[Index]);
  204.                 while(1)
  205.                 {
  206.                                 LED_SET(3);       
  207.                                 Delay_ms(500);
  208.                                 LED_CLR(3);
  209.                                 Delay_ms(500);
  210.                 }
  211. }



复制代码






此帖出自小平头技术问答
0条回答

一周热门 更多>

相关问题

    相关文章