void pwmWriteDshotInt(uint8_t index, uint16_t value) { motorDmaOutput_t *const motor = &dmaMotors[index]; if (!motor->timerHardware || !motor->timerHardware->dmaRef) { return; } uint16_t packet = prepareDshotPacket(motor, value); uint8_t bufferSize = loadDmaBuffer(motor, packet); if (motor->timerHardware->output & TIMER_OUTPUT_N_CHANNEL) { if (HAL_TIMEx_PWMN_Start_DMA(&motor->TimHandle, motor->timerHardware->channel, motor->dmaBuffer, bufferSize) != HAL_OK) { /* Starting PWM generation Error */ return; } } else { if (HAL_TIM_PWM_Start_DMA(&motor->TimHandle, motor->timerHardware->channel, motor->dmaBuffer, bufferSize) != HAL_OK) { /* Starting PWM generation Error */ return; } } }
/** * @brief Main program * @param None * @retval None */ int main(void) { /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Configure LED3 */ BSP_LED_Init(LED3); /* Compute the value of ARR regiter to generate signal frequency at 17.57 Khz */ uwTimerPeriod = (uint32_t)(SystemCoreClock / 17570 ) - 1; /* Compute CCR1 value to generate a duty cycle at 75% */ aCCValue_Buffer[0] = (uint32_t) ((75 * (uwTimerPeriod - 1)) / 100); /* Compute CCR2 value to generate a duty cycle at 50% */ aCCValue_Buffer[1] = (uint32_t) ((50 * (uwTimerPeriod - 1)) / 100); /* Compute CCR3 value to generate a duty cycle at 25% */ aCCValue_Buffer[2] = (uint32_t) ((25 * (uwTimerPeriod - 1)) / 100); /*##-1- Configure the TIM peripheral #######################################*/ /* Initialize TIM3 peripheral as follow: + Period = TimerPeriod (To have an output frequency equal to 17.570 KHz) + Repetition Counter = 3 + Prescaler = 0 + ClockDivision = 0 + Counter direction = Up */ TimHandle.Instance = TIMx; TimHandle.Init.Period = uwTimerPeriod; TimHandle.Init.RepetitionCounter = 3; TimHandle.Init.Prescaler = 0; TimHandle.Init.ClockDivision = 0; TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP; if(HAL_TIM_PWM_Init(&TimHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure the PWM channel 3 ########################################*/ sConfig.OCMode = TIM_OCMODE_PWM1; sConfig.OCPolarity = TIM_OCPOLARITY_HIGH; sConfig.Pulse = aCCValue_Buffer[0]; if(HAL_TIM_PWM_ConfigChannel(&TimHandle, &sConfig, TIM_CHANNEL_3) != HAL_OK) { /* Configuration Error */ Error_Handler(); } /*##-3- Start PWM signal generation in DMA mode ############################*/ if( HAL_TIM_PWM_Start_DMA(&TimHandle, TIM_CHANNEL_3, aCCValue_Buffer, 3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Wait till the channel3 start process finish */ while(TimHandle.State != HAL_TIM_STATE_READY) {} /*##-4- Start PWM Complementary signal generation in DMA mode ##############*/ if( HAL_TIMEx_PWMN_Start_DMA(&TimHandle, TIM_CHANNEL_3, aCCValue_Buffer, 3) != HAL_OK) { /* Starting Error */ Error_Handler(); } /* Infinite loop */ while (1) { } }