hi Leonid and Kerry,
How can your attached code for single Qtimer channel be modified and extended for two Qtimers GPIOs? Now I am using TMR1 timer0 and TMR1 timer1. I am having issues configuring both channels at the same time. The code below run normal only if a single channel is configured. I cant configure both channels in my code? any idea what the the issue below is?
Thank you in advance!
/* Qtimer configuration for PWM count*/
void QTimerPWM_Ch1config(void)
{
qtmr_config_t qtmrConfig;
edma_config_t userConfig2,userConfig1;
EDMA_Init(QTMR_DMA, &userConfig1);
EDMA_CreateHandle(&LED1_EDMA_Handle1, QTMR_DMA, 1);
EDMA_SetCallback(&LED1_EDMA_Handle1, EDMA_LED1_Callback1, NULL);
EDMA_Init(QTMR_DMA, &userConfig2);
EDMA_CreateHandle(&LED1_EDMA_Handle2, QTMR_DMA, 0);
EDMA_SetCallback(&LED1_EDMA_Handle2, EDMA_LED1_Callback2, NULL);
/*
* qtmrConfig.debugMode = kQTMR_RunNormalInDebug;
* qtmrConfig.enableExternalForce = false;
* qtmrConfig.enableMasterMode = false;
* qtmrConfig.faultFilterCount = 0;
* qtmrConfig.faultFilterPeriod = 0;
* qtmrConfig.primarySource = kQTMR_ClockDivide_2;
* qtmrConfig.secondarySource = kQTMR_Counter0InputPin;
*/
//added
QTMR_GetDefaultConfig(&qtmrConfig);
qtmrConfig.primarySource = kQTMR_ClockDivide_1;
DMAMUX_Init(QTMR_DMA_MUX);
DMAMUX_SetSource(QTMR_DMA_MUX, 1, QTMR_EDMA_REQUEST_LED1CMPLD2_SOURCE);
DMAMUX_EnableChannel(QTMR_DMA_MUX, 1);
DMAMUX_SetSource(QTMR_DMA_MUX, 0, QTMR_EDMA_REQUEST_LED1CMPLD1_SOURCE);
DMAMUX_EnableChannel(QTMR_DMA_MUX, 0);
QTMR_Init(QTMR_BASEADDR, QTMR_PWM_CHANNEL1, &qtmrConfig);
/* Generate a 800Khz PWM signal with 0% dutycycle */
QTMR_SetupPwm(QTMR_BASEADDR, QTMR_PWM_CHANNEL1, 800000, 0, false, QTMR_SOURCE_CLOCK / 1);
/* Enable comparator preload register 1 DMA */
QTMR_EnableDma(QTMR_BASEADDR, QTMR_PWM_CHANNEL1, kQTMR_ComparatorPreload1DmaEnable);
/* Enable comparator preload register 2 DMA */
QTMR_EnableDma(QTMR_BASEADDR, QTMR_PWM_CHANNEL1, kQTMR_ComparatorPreload2DmaEnable);
/* Start the counter */
QTMR_StartTimer(QTMR_BASEADDR, QTMR_PWM_CHANNEL1, kQTMR_PriSrcRiseEdge);
}
/* Qtimer configuration for PWM count*/
void QTimerPWM_Ch2config(void)
{
qtmr_config_t qtmrConfig;
edma_config_t userConfig2,userConfig1;
EDMA_Init(QTMR_DMA, &userConfig1);
EDMA_CreateHandle(&LED2_EDMA_Handle1, QTMR_DMA, 0);
EDMA_SetCallback(&LED2_EDMA_Handle1, EDMA_LED2_Callback1, NULL);
EDMA_Init(QTMR_DMA, &userConfig2);
EDMA_CreateHandle(&LED2_EDMA_Handle2, QTMR_DMA, 1);
EDMA_SetCallback(&LED2_EDMA_Handle2, EDMA_LED2_Callback2, NULL);
/*
* qtmrConfig.debugMode = kQTMR_RunNormalInDebug;
* qtmrConfig.enableExternalForce = false;
* qtmrConfig.enableMasterMode = false;
* qtmrConfig.faultFilterCount = 0;
* qtmrConfig.faultFilterPeriod = 0;
* qtmrConfig.primarySource = kQTMR_ClockDivide_2;
* qtmrConfig.secondarySource = kQTMR_Counter0InputPin;
*/
//added
QTMR_GetDefaultConfig(&qtmrConfig);
qtmrConfig.primarySource = kQTMR_ClockDivide_1;
DMAMUX_Init(QTMR_DMA_MUX);
DMAMUX_SetSource(QTMR_DMA_MUX, 0, QTMR_EDMA_REQUEST_LED2CMPLD2_SOURCE);
DMAMUX_EnableChannel(QTMR_DMA_MUX, 0);
DMAMUX_SetSource(QTMR_DMA_MUX, 1, QTMR_EDMA_REQUEST_LED2CMPLD1_SOURCE);
DMAMUX_EnableChannel(QTMR_DMA_MUX, 1);
QTMR_Init(QTMR_BASEADDR, QTMR_PWM_CHANNEL2, &qtmrConfig);
/* Generate a 800Khz PWM signal with 0% dutycycle */
QTMR_SetupPwm(QTMR_BASEADDR, QTMR_PWM_CHANNEL2, 800000, 0, false, QTMR_SOURCE_CLOCK / 1);
/* Enable comparator preload register 1 DMA */
QTMR_EnableDma(QTMR_BASEADDR, QTMR_PWM_CHANNEL2, kQTMR_ComparatorPreload1DmaEnable);
/* Enable comparator preload register 2 DMA */
QTMR_EnableDma(QTMR_BASEADDR, QTMR_PWM_CHANNEL2, kQTMR_ComparatorPreload2DmaEnable);
/* Start the counter */
QTMR_StartTimer(QTMR_BASEADDR, QTMR_PWM_CHANNEL2, kQTMR_PriSrcRiseEdge);
}
// a user function
void DataTransfer(uint8_t LEDport)
{
edma_transfer_config_t LED1transferConfig1, LED1transferConfig2;
edma_transfer_config_t LED2transferConfig1, LED2transferConfig2;
if(LEDport==1)
{
if((LED1_Transfer_Done1==true)&&(LED1_Transfer_Done2==true))
{
LED1_Transfer_Done1 = false;
LED1_Transfer_Done2 = false;
EDMA_PrepareTransfer(&LED1transferConfig1, (uint16_t *)&g_Cmpld1buf, 2,
(uint16_t *)&QTMR_BASEADDR->CHANNEL[QTMR_PWM_CHANNEL1].CMPLD1, 2, 2,484,
kEDMA_MemoryToPeripheral);
EDMA_SubmitTransfer(&LED1_EDMA_Handle1, &LED1transferConfig1);
EDMA_PrepareTransfer(&LED1transferConfig2, (uint16_t *)&g_Cmpld2buf, 2,
(uint16_t *)&QTMR_BASEADDR->CHANNEL[QTMR_PWM_CHANNEL1].CMPLD2, 2, 2,484,
kEDMA_MemoryToPeripheral);
EDMA_SubmitTransfer(&LED1_EDMA_Handle2, &LED1transferConfig2);
EDMA_StartTransfer(&LED1_EDMA_Handle2);
EDMA_StartTransfer(&LED1_EDMA_Handle1);
}
}
else if(LEDport==2)
{
if((LED2_Transfer_Done1==true)&&(LED2_Transfer_Done2==true))
{
LED2_Transfer_Done1 = false;
LED2_Transfer_Done2 = false;
EDMA_PrepareTransfer(&LED2transferConfig1, (uint16_t *)&g_Cmpld1buf, 2,
(uint16_t *)&QTMR_BASEADDR->CHANNEL[QTMR_PWM_CHANNEL2].CMPLD1, 2, 2,484,
kEDMA_MemoryToPeripheral);
EDMA_SubmitTransfer(&LED2_EDMA_Handle1, &LED2transferConfig1);
EDMA_PrepareTransfer(&LED2transferConfig2, (uint16_t *)&g_Cmpld2buf, 2,
(uint16_t *)&QTMR_BASEADDR->CHANNEL[QTMR_PWM_CHANNEL2].CMPLD2, 2, 2,484,
kEDMA_MemoryToPeripheral);
EDMA_SubmitTransfer(&LED2_EDMA_Handle2, &LED2transferConfig2);
EDMA_StartTransfer(&LED2_EDMA_Handle2);
EDMA_StartTransfer(&LED2_EDMA_Handle1);
}
}
}