请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:MSP432P401R
您好!
我使用 MSP432从 ADS131A02获取48kHz 样本。
问题是 MSP432失去了一些中断、因此反应速度不够快。
这就是我要做的:通过 SPI 获取48kHz 样本并通过 UART 将其发送到 PC (FDTI 芯片)
因此、问题在于 MSP432接收和发送样本的速度太慢:
以下是我的代码:
/* main.c */ #include #include #include #include #include #include "ADS131A02.h" #include "UART.h" #define RX_TAGs 9 #define TX_TAGs 7 Timer_A_PWMConfig pwmConfig = { Timer_A_CLOCKSOURCE_SMCLK、 Timer_A_CLOCKSOURCE_DEVIDER_1、//8MHz = Timer_A_CLOCKSOURCE_DEVIDER_3 4MHz = Timer_A_CLOCKSOURCE_DEVIDER_6 2MHz = Timer_A_CLOCKSOURCE_DEVIDER_12 2、 Timer_A_CAPTURECOMPARE 寄存器_1、 Timer_A_OUTPUTMODE_TOGGLE_SET、 1 }; Timer_A_PWMConfig pwmConfig1 = { Timer_A_CLOCKSOURCE_SMCLK、 Timer_A_CLOCKSOURCE_DEVIDER_1、//8MHz = Timer_A_CLOCKSOURCE_DEVIDER_3 4MHz = Timer_A_CLOCKSOURCE_DEVIDER_6 2MHz = Timer_A_CLOCKSOURCE_DEVIDER_12 1、 Timer_A_CAPTURECOMPARE 寄存器_1、 Timer_A_OUTPUTMODE_TOGGLE_RESET、//TIMER_A_OUTPUTMODE_TOGGLE、 1 }; void main (void) { /*暂停看门狗计时器*/ MAP_WDT_A_HOLDTimer(); GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_PJ、GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_Function); cs_setExternalClockSourceFrequency (32768、48000000); PCM_setCoreVoltageLevel (PCM_VCORE1); FlashCtl_setWaitState (FLASH_BANK0、2); FlashCtl_setWaitState (FLASH_BANK1、2); CS_startHFXT (false); CS_initClockSignal (CS_MCLK、CS_HFXTCLK_select、CS_Clock_divider); CS_initClockSignal (CS_SMCLK、CS_HFXTCLK_select、CS_clock_divider);// MHz /*将 GPIO2.4配置为 PWM 的外设输出*/ MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4、GPIO_PRIMARY_MODULE_Function); MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P5、GPIO_PIN6、GPIO_PRIMARY_MODULE_Function); /*配置 Timer_A */ MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig); MAP_Timer_A_generatePWM (TIMER_A2_base、&pwmConfig1); /*加电板*/ MAP_GPIO_setAsOutputPin (GPIO_PORT_P2、GPIO_PIN7); MAP_GPIO_setOutputHighOnPin (GPIO_PORT_P2、GPIO_PIN7); ADS131A02_SPI_Setup(); ADS131A02_start(); UART_INIT_Communication (); while (1) { MAP_PCM_gotoLPM0 (); } } //* ADS131A02.c */ #include "ADS131A02.h" #include "UART.h" #include #include #include /* DMA 控制表*/ /* DMA 控制表*/ #pragma DATA_ALIGN (controlTable、256) uint8_t controlTable[256]; uint8_t DMA_recBuffer[9]; uint8_t DMA_sendBuffer[9]; int count_value=0; uint8_t DATA_ARRAT[9]={0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00}; int adc_value=0; #define DMATX dma_ch2_EUSCIB1TX0 #define DMARX void CH3_SC0 = 0;int adc_valuel1通道#define DMARTX2 DMARTX2 #define 通道#define DMARTX2 (void)#define DMARTX2通道#define DMARTX2通道#define 通道#define DMARTX2 (void 3 switch_data=0; GPIO_setAsOutputPin (GPIO_PORT_P3、GPIO_PIN0); GPIO_setAsOutputPin (GPIO_PORT_P3、GPIO_PIN6); GPIO_setAsInputPin (GPIO_PORT_P3、GPIO_PIN2); GPIO_setOutputHighOnPin (GPIO_PORT_P3、GPIO_PIN0); // CS 禁用 GPIO_setOutputLowOnPin (GPIO_PORT_P3、GPIO_PIN6); //复位使能 // SPI 主配置参数 const eUSCI_SPI_MasterConfig spiMasterConfig = { EUSCI_A_SPI_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 48000000、 // SMCLK = HFXT = 48Mhz 24000000、 // SPICLK =12000000 EUSCI_A_SPI_MSB_FIRST、 // MSB 优先 EUSCI_SPI_PHASE_DATA_Changed_ONFIRST_captured_on_next、 //相位 EUSCI_SPI_PHASE_DATA_Changed_ONFIRST_Capted_on_next / EUSCI_SPI_PHASE_DATA_Capted_ONFIRST_Changed_on_next EUSCI_A_SPI_CLOCKPOLARITY_INACT_LOW、 //高极性 EUSCI_A_SPI_3引脚 }; GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P6、GPIO_PIN3 | GPIO_PIN4 | GPIO_PIN5、GPIO_PRIMARY_MODULE_FUNCTION); /*在4线主控模式下配置 SPI */ SPI_initMaster (EUSCI_B1_base、&spiMasterConfig); SPI_enableModule (EUSCI_B1_BASE); /*启用中断*/ GPIO_clearInterruptFlag (GPIO_PORT_P3、GPIO_PIN2); GPIO_enableInterrupt (GPIO_PORT_P3、GPIO_PIN2); GPIO_interruptEdgeSelect (GPIO_PORT_P3、GPIO_PIN2、GPIO_HIGH_TO_LOW_TRANSITION);// SPI_clearInterruptFlag (eUSCI_B1_base、eUSCI_B_SPI_Transmit _interrupt); } void ADS131A02_CS_Disable (void) { GPIO_setOutputHighOnPin (GPIO_PORT_P3、GPIO_PIN0); // CS Disable } void ADS131A02_CS_Enable (void) { GPIO_setOutputLowOnPin (GPIO_PORT_P3、GPIO_PIN0); // CS Enable } void write_Command (uint16_t ADSregister) { uint8_t valueMSB=(ADSregister>>8)&0xFF; uint8_t valueLSB=(ADSregister)&0xFF; ADS131A02_CS_Enable(); _DELAY_CYCLES (10); eUSCI_A_SPI_transmitData (eUSCI_B1_base、valueMSB); EUSCI_A_SPI_transmitData (EUSCI_B1_base、valueLSB); // EUSCI_A_SPI_transmitData (EUSCI_B1_base、0x00); ADS131A02_CS_Disable (); } void write_register (uint8_t ADSregister、uint8_t ADSregisterValue) { ADS131A02_CS_Enable(); _DELAY_CYCLES (10); EUSCI_A_SPI_transmitData (EUSCI_B1_BASE、(0x40 | ADSregister)); EUSCI_A_SPI_transmitData (EUSCI_B1_base、ADSregisterValue); // EUSCI_A_SPI_transmitData (EUSCI_B1_base、0x00); ADS131A02_CS_Disable (); } uint16_t read_register (uint8_t ADSregister) { uint16_t ret=0; ADS131A02_CS_Enable(); EUSCI_A_SPI_transmitData (EUSCI_B1_BASE、(0x20 | ADSregister)); RET=EUSCI_A_SPI_receiveData (EUSCI_B1_BASE); EUSCI_A_SPI_transmitData (EUSCI_B1_BASE、0x00); RET = RET<<8; RET=ret | EUSCI_A_SPI_receiveData (EUSCI_B1_BASE); ///EUSCI_A_SPI_transmitData (EUSCI_B1_BASE、0x00); ADS131A02_CS_Disable (); return; } void ADS131A02_start (void) { GPIO_setOutputLowOnPin (GPIO_PORT_P3、GPIO_PIN6); //重置 _DELAY_CYCLES (240000); GPIO_setOutputHighOnPin (GPIO_PORT_P3、GPIO_PIN6); //重置禁用 _DELAY_CYCLES (240000); _DELAY_CYCLES (240000); while (1)//(GPIO_getInputPinValue (GPIO_PORT_P7、GPIO_PIN0)!=0) { //等待,直到准备就绪 WRITE_COMMAND (0x0000); WRITE_COMMAND (UNLOCK);//解锁寄存器 uint16_t myValue=Read_register (REG_STAT_1); if (myValue!= 0xFF02) 中断; } WRITE_REGISTER (REG_CLK1、REG_CLK1_VALUE);//设置 CLK1 WRITE_REGISTER (REG_CLK2、REG_CLK2_VALUE);//设置 CLK2 WRITE_register (REG_A_SYS_CFG、REG_A_SYS_CFG_VALUE);//设置 CLK2 WRITE_REGISTER (REG_ADC1、REG_ADC1_VALUE);//增益 ADC WRITE_REGISTER (REG_ADC2、REG_ADC2_VALUE);//增益 ADC WRITE_REGISTER_ADC_ENA、REG_ADC_ENA_VALUE);// Enbale ADC //uint8_t myValue=Read_register (REG_STAT_1); WRITE_COMMAND (WAKEUP);//唤醒 ADC WRITE_COMMAND (LOCK);//锁定寄存器 ADS131A02_DMASetup(); } void ADS131A02_data (void) { //读取值 } void ADS131A02_DMASetup (void) { //将 DMA 分配给 SPI 通道 DMA_enableModule(); DMA_setControlBase (controlTable); DMA_assignChannel (DMATX); DMA_assignChannel (DMARX); //禁用通道属性 dma_disableChannelAttribute (DMATX、Udma_attr_ALTSELECT | Udma_attr_USEBURST | Udma_attr_high_priority | Udma_attr_REQMASK); dma_disableChannelAttribute (DMARX、Udma_attr_ALTSELECT | Udma_attr_USEBURST | Udma_attr_high_priority | Udma_attr_REQMASK); //设置 TX 传输特性和缓冲区 DMA_setChannelControl (DMATX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1); DMA_setChannelTransfer (DMATX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、DATA_ARRAY、(void *) MAP_SPI_getTransmitBufferAddressForDMA (EUSCI_B1_BASE)、6); DMA_setChannelControl (DMARX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1); DMA_setChannelTransfer (DMARX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *) MAP_SPI_getReceiveBufferAddressForDMA (EUSCI_B1_BASE)、DATA_ARRAY1、SIZE 缓冲区地址); DMA_enableChannel (DMARX_Channel); DMA_assignInterrupt (DMA_INT1、DMATX_Channel); DMA_clearInterruptFlag (INT_DMA_INT1); INTERRUPT_enableInterrupt (DMA_INT1); DMA_assignInterrupt (DMA_INT2、DMARX_Channel); DMA_clearInterruptFlag (INT_DMA_INT2); INTERRUPT_enableInterrupt (DMA_INT2); INTERRUPT_enableInterrupt (INT_PORT3); interrupt_enableMaster(); } void dma_int2_IRQHandler (void) { ADS131A02_CS_Disable (); DMA_clearInterruptFlag (INT_DMA_INT2); DMA_setChannelControl (DMARX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_1); DMA_setChannelTransfer (DMARX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *) SPI_getReceiveBufferAddressForDMA (EUSCI_B1_BASE)、DATA_ARRAY1、SIZE、缓冲区接收器_TX); DMA_enableChannel (DMARX_Channel); if (Flag_UART==1) { memcpy (zUI8_buff TX、data_array1、sizeof (data_array1[0])* size_buff TX); DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH0_EUSCIA0TX、UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1); DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH0_EUSCIA0TX、UDMA_MODE_BASIC、zUI8_buff_TX、(void*) UART_getTransmitBufferAddressForDMA (EUSCI_A0_BASE)、Size_buff_TX); DMA_enableChannel (0); } } void dma_int1_IRQHandler (void) { DMA_clearInterruptFlag (INT_DMA_INT1); ADS131A02_CS_Disable (); } void PORT3_IRQHandler (void) { UINT_fast16_t status = GPIO_getEnabledInterruptStatus (GPIO_PORT_P3); GPIO_clearInterruptFlag (GPIO_PORT_P3、状态); IF (STATUS & GPIO_PIN2) { GPIO_clearInterruptFlag (GPIO_PORT_P3、GPIO_PIN2); ADS131A02_CS_Enable(); DMA_SPI_TX(); } } void dma_spi_tx (void) { //设置 TX 传输特性和缓冲区 DMA_setChannelControl (DMATX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_NONE | UDMA_ARB_1); DMA_setChannelTransfer (DMATX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、DATA_ARRAY、(void *) SPI_getTransmitBufferAddressForDMA (EUSCI_B1_BASE)、6); DMA_enableChannel (DMATX_Channel); } // * UART.c */ #include "UART.h" #include #include #include extern char receive_uart[100]={}; void UART_DMASetup (void); void UART_Send_out (char * read_buf); uint8_t BufferRad[2]={}; #define zCHAN_DMA_UART_TX DMA_CHANGE_0 uint8_t wert_inc=0;uart_uart_uart_uart_icrou_icrou_ics/uart_uart_icrou_icrou_ // DMA 控制表 //********* #ifdef ewarm #pragma DATA_alignment=1024 #else #pragma DATA_ALIGN (controlTable、1024) #endif uint8_t controlTable[1024]; //********* // // 115200波特 率//software-dl.ti.com/.../index.html //********* const eUSCI_UART_Config uartConfig = { EUSCI_A_UART_CLOCKSOURCE_SMCLK、 // SMCLK 时钟源 26、 // BRDIV = 26 0、 // UCxBRF = 0 111、 // UCxBRS = 111 EUSCI_A_UART_NO_奇 偶校验、 //无奇偶校验 EUSCI_A_UART_LSB_FIRST、 // LSB 优先 EUSCI_A_UART_One_stop_bit、 //一个停止位 EUSCI_A_UART_MODE、 // UART 模式 EUSCI_A_UART_oversampling_BAUDRATE_generation //过采样 }; //*************** //////// ************* void UART_init_Communication (void) { MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P1、GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3、GPIO_PRIMARY_MODULE_FUNCTION); MAP_UART_initModule (EUSCI_A0_BASE、uartConfig); MAP_UART_enableModule (EUSCI_A0_BASE); MAP_UART_enableInterrupt (EUSCI_A0_BASE、EUSCI_A_UART_receive_interrupt); MAP_Interrupt_enableInterrupt (INT_EUSCIA0); // Interrupt_disableSlepOnIsrExit (); //char info[]="UART"; //uart_Send_out (info); // memset (zUI8_buff _TX、0x00、size_buff _TX); UART_DMASetup(); } //********* // void UART_DMASetup (void) { //将 DMA 分配给 SPI 通道 //map_dma_enableModule(); //map_dma_setControlBase (controlTable); MAP_DMA_赋 值通道(DMA_CH0_EUSCIA0TX); //禁用通道属性 MAP_DMA_disableChannelAttribute (DMA_CH0_EUSCIA0TX、UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR|UDMA_ATTR_REQMASK); MAP_DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH0_EUSCIA0TX、UDMA_SIZE 8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH0_EUSCIA0TX、UDMA_MODE_BASIC、zUI8_buff_TX、(void*) MAP_UART_getTransmitBufferAddressForDMA (EUSCI_A0_BASE)、SIZE_TX_COUNT_x); } / *空 UART_DMA (空) * / void UART_DMA (void) { MAP_DMA_setChannelControl (UDMA_PRI_SELECT | DMA_CH0_EUSCIA0TX、UDMA_SIZE 8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_1); MAP_DMA_setChannelTransfer (UDMA_PRI_SELECT | DMA_CH0_EUSCIA0TX、UDMA_MODE_BASIC、zUI8_buff_TX、(void*) MAP_UART_getTransmitBufferAddressForDMA (EUSCI_A0_BASE)、SIZE; MAP_DMA_enableChannel (0); } /********* * void UART_Send_out (void) * / void UART_Send_out (char* read_buf) { int i; for (i=0;i < strlen (read_buf);i++) { while (!(EUSCI_A_IFG_TXIFG 和 EUSCI_A0->IFG); MAP_UART_transmitData (EUSCI_A0_BASE、READ_BUF[i]); } } void COM (void) { if (strcmp (receive_uart、"start")=0) { Flag_UART=1; } 否则、如果(strcmp (receive_uart、"stop")= 0 || strcmp (receive_uart、"stopt")= 0) { FLAG_UART=0; } memset (receive_UART、0x00、100); }/************* * EUSCI_A0_INT_BASE ISR。 。 秘书长的报告 / void EUSCIA0_IRQHandler (void) { uint32_t status = MAP_UART_getEnabledInterruptStatus (EUSCI_A0_BASE); MAP_UART_clearInterruptFlag (EUSCI_A0_BASE、STATUS); IF (STATUS 和 EUSCI_A_UART_receive_interrupt) { UART_Wert = UART_receiveData (EUSCI_A0_BASE); if (UART_Wert = 10 || UART_Wert == 13 || UART_Wert == 58) { com(); wert_inc=0; } 其他 { if (UART_Wert!= 0) { Receive_UART[wert_inc]= UART_Wert; wert_inc++; } } MAP_Interrupt_disableSlepOnIsrExit(); } }
我的问题是如何提高 MSP432的性能? 有可能吗?
问题是 DMA TX 始终必须重新配置、并且芯片选择必须启用/禁用。