2023-04-20 03:51 AM - edited 2023-11-20 07:35 AM
I've written a code to trigger(toggle) GPIO_C1 by ADC_TC interrupt. And the GPIO_C13 by MDMA through SAItx_TC request.
I've programmed to both GPIO toggle together in-phase. But GPIO in-phase behaviour can be achieved in first time I program in MCU without debug mode. Resetting MCU causes out-of-phase behaviour:
The project is uploaded in STM32cubeIDE 1.12.
Main code:
MX_GPIO_Init();
MX_DMA_Init();
MX_MDMA_Init();
MX_LPTIM3_Init();
MX_SAI2_Init();
MX_LPTIM2_Init();
MX_ADC1_Init();
MX_SAI1_Init();
/* USER CODE BEGIN 2 */
MX_MDMA_Init();
HAL_SAI_Transmit(&hsai_BlockA1, (uint8_t*)&noisebuf[0], 1,100);
dummy=0;
/////////////////////////////////////////////////////////////////////////////////////////////////////
/*DElY
* SEQUENCE OF SYNCHRONIZED DELAY
* MDMA0 -> LPTIM2 -> DMA req gen0 -> GPIO
*/
#define WORD_SIZE 2
//disabling MDMA causes GPIO to trigger on tc interrupt
HAL_MDMA_Start(&hmdma_mdma_channel40_dma1_stream0_tc_0,
(uint32_t)&const_lptim_onePulse, (uint32_t)&(hlptim2.Instance->CR),
4, 1);
/////////////////////////////////////////////////////////////////////////////////////////////////////
/* Enable external trigger interrupt */
__HAL_LPTIM_ENABLE_IT(&hlptim3, LPTIM_IT_EXTTRIG);
HAL_LPTIM_OnePulse_Start(&hlptim3, 100, 0);
HAL_LPTIM_OnePulse_Start(&hlptim2, 660, 0);
HAL_GPIO_WritePin(test_GPIO_Port, test_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(test1_GPIO_Port, test1_Pin,GPIO_PIN_RESET);
tok_copy=tok;
while(tok==tok_copy);
HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&adcbuf[0], BLOCK_SIZE*BUFFER_BLOCK_COUNT);
HAL_SAI_Transmit_DMA(&hsai_BlockA1, (uint8_t*) &noisebuf[0], BLOCK_SIZE*BUFFER_BLOCK_COUNT);
HAL_SAI_DMAPause(&hsai_BlockA1);
for(uint32_t volatile i=0;i<14000;i++);
HAL_SAI_DMAResume(&hsai_BlockA1);
__HAL_LPTIM_DISABLE_IT(&hlptim3, LPTIM_IT_EXTTRIG);
Interrupt code:
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
// HAL_GPIO_TogglePin(test1_GPIO_Port, test1_Pin);
if(dummy==0)
{
HAL_GPIO_WritePin(test1_GPIO_Port, test1_Pin,GPIO_PIN_SET);
dummy=1;
}
else
{
HAL_GPIO_WritePin(test1_GPIO_Port, test1_Pin,GPIO_PIN_RESET);
dummy=0;
}
// HAL_GPIO_WritePin(test1_GPIO_Port, test1_Pin,GPIO_PIN_RESET);
}
void HAL_LPTIM_TriggerCallback(LPTIM_HandleTypeDef *hlptim)
{
if(tok==0)
{
tok=1;
}
else
{
tok=0;
}
}
MDMA setting:
Though exact scoping showed:
That ADC have one TC before SAItx, the block size is 8. I can't understand why SAI is responsing 8 block after ADC conversion!