您好!
我已经尝试让这个代码工作一两周了、我已经知道了一段时间了。 我可以看到、三个不同的引脚正在使用调试工具将数据写入 MEM0-MEM2位置、但只能将数据从 MEM0获取到我可以实际使用的数组中、prim_buffer0。
我已经合并了两个示例、并尝试使用正在工作的 DMA_INT1_IRQHandler 来触发其他通道的软件请求、尽管这可能不是最好的方法。 但是、这不起作用。 我在 IRQ 中有一些递增、并且只有第一个递增。
#include "msp.h" #include #include #include "Crystalfontz128x128_ST7735.h" #include #include #include "arm_const_structs.h" #define test_length_samples 1024 #define SAMPLE_LENGTH 1024 //#define NUMBER_of _SAMPLE 512 /*-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- * FFT Bin 的全局变量示例 *------------------------------------------ // uint32_t fftSize = sample_length; uint32_t ifftFlag = 0; uint32_t doBitReverse = 1; volatile ARM_STATUS 状态; //图形库上下文*/ Graphics_context g_sContext; #define SMCLK_FREQUENCY 48000000 #define SAMPLE_FREQUENCY 24000000 /* DMA 控制表*/ #ifdef ewarm #pragma DATA_ALIGIN=256 #else #pragma DATA_ALIGN (controlTable、256) #endif uint8_t controlTable[256]; // FFT 数据/处理缓冲区* / float Hann[sample_length];int16_prim_int16_t bufferlength ;bufferlength[16_bufferlength] ;int16_int_int_1_bufferlength[t_int_bufferlength] int16_t alt_buffer1[sample_length]; int16_t alt_buffer2[sample_length]; volatile int switch_data = 0; // Timer_A PWM 配置参数*/ Timer_A_PWMConfig pwmConfig = { Timer_A_CLOCKSOURCE_SMCLK、 Timer_A_CLOCKSOURCE_divider _1、 (SMCLK_FREQUENCY / SAMPLE_FREQUENCY)、 Timer_A_CAPTURECOMPARE 寄存器_1、 Timer_A_OUTPUTMODE_SET_RESET、 (SMCLK_FREQUENCY /SAMPLE_FREQUENCY)/2 }; 静态 uint16_t resultsBuffer[4]; volatile int adcIncrement = 0; volatile int irq1Increment = 0; volatile int irq2Increment = 0; volatile int irq3Increment = 0; void main (void) { /*停止 WDT 并禁用主中断*/ MAP_WDT_A_HOLDTimer(); MAP_Interrupt_disableMaster(); //memset (resultsBuffer、0x00、4); /*将内核电压电平设置为 VCORE1 */ MAP_PCM_setCoreVoltageLevel (PCM_VCORE1); //为闪存组0和1*/设置2个闪存等待状态 MAP_FlashCtl_setWaitState (FLASH_BANK0、2); MAP_FlashCtl_setWaitState (FLASH_BANK1、2); /*初始化时钟系统*/ MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48); MAP_CS_initClockSignal (CS_MCLK、CS_DCOCLK_SELECT、CS_Clock_divider _1); MAP_CS_initClockSignal (CS_HSMCLK、CS_DCOCLK_SELECT、CS_Clock_divider _1); MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_Clock_divider _1); MAP_CS_initClockSignal (CS_ACLK、CS_REFOCLK_SELECT、CS_CLOCK_DELUGER_1); /*将 Timer_A 配置为具有大约500ms 的周期和 *初始占空比为其10%(3200个节拍)*/ Timer_A_generatePWM (timer_A0_BASE、&pwmConfig); /*初始化 ADC (MCLK/1/1)*/ ADC14_enableModule(); ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_1、0); ADC14_setSampleHoldTrigger (ADC_TRIGGER_SOURCE1、false); ////////*配置 GPIO * MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN5、 GPIO_TICE_MODULE_FUNCTION); MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN4、 GPIO_TICE_MODULE_FUNCTION); MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P4、GPIO_PIN3、 GPIO_TICE_MODULE_FUNCTION); /*配置 ADC 内存*/ MAP_ADC14_configureMultiSequenceMode (ADC_MEM0、ADC_MEM2、TRUE); MAP_ADC14_configureConversionMemory (ADC_MEM0、ADC_VREFPS_AVCC_VREFNEG_VSS、 ADC_INPUT_A0、false); MAP_ADC14_configureConversionMemory (ADC_MEM1、ADC_VREFPS_AVCC_VREFNEG_VSS、 ADC_INPUT_A1、false); MAP_ADC14_configureConversionMemory (ADC_MEM2、ADC_VREFPS_AVCC_VREFNEG_VSS、 ADC_INPUT_A10、false); /*将 ADC 结果格式设置为带符号的二进制数*/ ADC14_setResultFormat (ADC_signed_binary); /*配置 DMA 模块*/ DMA_enableModule(); DMA_setControlBase (controlTable); DMA_disableChannelAttribute (DMA_CH7_ADC14、 UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK); /*设置控制索引。 在本例中、我们将设置的源 * DMA 传输到 ADC14存储器0 *和目标到 *目的数据数组。 * MAP_DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH7_ADC14、 UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH7_ADC14、 UDMA_MODE_pingpong、(void*)&ADC14->MEM[0]、 prim_buffer0、sample_length);
MAP_DMA_setChannelControl (UDMA_ALT_SELECT | DMA_CH7_ADC14、 UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH7_ADC14、 UDMA_MODE_pingpong、(void*)&ADC14->MEM[0]、 alt_buffer0、sample_length); /*分配/启用中断*/ MAP_DMA_赋 值中断(DMA_INT1、7); MAP_Interrupt_enableInterrupt (INT_DMA_INT1); MAP_DMA_赋 值通道(DMA_CH7_ADC14); MAP_DMA_clearInterruptFlag (7); MAP_Interrupt_enableMaster (); // MAP_ADC14_enableInterrupt (ADC_INT2); // MAP_Interrupt_enableInterrupt (INT_ADC14); MAP_DMA_赋 值中断(DMA_INT2、1); MAP_Interrupt_enableInterrupt (INT_DMA_INT2); MAP_DMA_assignChannel (DMA_CH1_RESERVED0); MAP_DMA_clearInterruptFlag (1); MAP_DMA_赋 值中断(DMA_INT3、2); MAP_Interrupt_enableInterrupt (INT_DMA_INT3); MAP_DMA_assignChannel (DMA_CH2_RESERVED0); MAP_DMA_clearInterruptFlag (2); MAP_DMA_enableChannel (1); MAP_DMA_enableChannel (2); /*现在 DMA 已启动并已设置,从而启用通道。 ADC14 *硬件应接管并传输/接收所有字节*/ MAP_DMA_enableChannel (7); MAP_ADC14_enableConversion(); /*强制在 DMA 通道1上进行软件传输*/ MAP_DMA_requestSoftwareTransfer (1); /*强制在 DMA 通道2上进行软件传输*/ MAP_DMA_requestSoftwareTransfer (2);
while (1) { MAP_PCM_gotoLPM0 (); } } //void ADC14_IRQHandler (void) //{ // adcIncrement++; // uint64_t status; // status = MAP_ADC14_getEnabableInterruptStatus (void); // MAP_ADC14_clearInterruptFlag (status); // if (status & adc_int2) MAP_ADC14_getMultiSequenceResult (resultsBuffer); //} // //} // ADC14 MEM0的// 完成中断*/ void DMA_INT1_IRQHandler (void) { irq1Increment++; /*使用 DMA 的交替模式在主缓冲器和备用缓冲器之间切换*/ IF (DMA_getChannelAttribute (7)& UDMA_ATTR_ALTSELECT) { DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH7_ADC14、 UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH7_ADC14、 UDMA_MODE_pingpong、(void*)&ADC14->MEM[0]、 prim_buffer0、sample_length); switch_data = 1; } 其他 { DMA_setChannelControl (UDMA_ALT_SELECT | DMA_CH7_ADC14、 UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH7_ADC14、 UDMA_MODE_pingpong、(void*)&ADC14->MEM[0]、 alt_buffer0、sample_length); switch_data = 0; } MAP_DMA_requestSoftwareTransfer (1); MAP_DMA_requestSoftwareTransfer (2); ADC14 MEM7的}/*完成中断*/ _属性_((ramfunc) ) void DMA_INT2_IRQHandler (void) { irq2Increment++; /*使用 DMA 的交替模式在主缓冲器和备用缓冲器之间切换*/ IF (DMA_getChannelAttribute (1)& UDMA_ATTR_ALTSELECT) { DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH1_RESERVED0、 UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH1_RESERVED0、 UDMA_MODE_pingpong、(void*)&ADC14->MEM[1]、 prim_buffer1、sample_length); } 其他 { DMA_setChannelControl (UDMA_ALT_SELECT | DMA_CH1_RESERVED0、 UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH1_RESERVED0、 UDMA_MODE_pingpong、(void*)&ADC14->MEM[1]、 alt_buffer1、sample_length); } } // ADC14 MEM8的完成中断*/ __attribute__((ramfunc) void dma_int3_IRQHandler (void) { irq3Increment++; /*使用 DMA 的交替模式在主缓冲器和备用缓冲器之间切换*/ IF (DMA_getChannelAttribute (2)& UDMA_ATTR_ALTSELECT) { DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH2_RESERVED0、 UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH2_RESERVED0、 UDMA_MODE_pingpong、(void*)&ADC14->MEM[2]、 prim_buffer2、sample_length); switch_data = 1; } 其他 { DMA_setChannelControl (UDMA_ALT_SELECT | DMA_CH2_RESERVED0、 UDMA_SIZE_16 | UDMA_SRC_INC_NONE | UDMA_DST_INC_16 | UDMA_ARB_1); DMA_setChannelTransfer (UDMA_ALT_SELECT | DMA_CH2_RESERVED0、 UDMA_MODE_pingpong、(void*)&ADC14->MEM[2]、 alt_buffer2、sample_length); switch_data = 0; } //map_Interrupt_disableSlepOnIsrExit(); SCB->SCR &=~SCB_SCR_SLEEPDEEP_Pos; }
是否有人能让我深入了解我需要做些什么才能正确设置通道、从而分别从 ADC14MEM1和 ADC14MEM2将数据输入 prim_buffer1和 prim_buffer2? 几天以来、我一直在用这个代码敲我的头、用30种不同的方式对它进行了重新调制、至今没有取得任何进展。
此致、
Julian