HAL_TIM_PWM_Start_DMA 함수를 사용했을 때
같은 타이머에 다른 채널일 때 첫번째만 PWM이 전송되고 두 번째는 전송이 안됐다.
HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_4, motor2, DSHOT_FRAME_SIZE);
HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, motor3, DSHOT_FRAME_SIZE);
찾아보니까 htim->State가 HAL_TIM_STATE_READY라서 HAL_BUSY를 리턴하는데
이유를 내가 알 턱이 있나?
HAL_StatusTypeDef HAL_TIM_PWM_Start_DMA(TIM_HandleTypeDef *htim, uint32_t Channel, uint32_t *pData, uint16_t Length)
{
uint32_t tmpsmcr;
/* Check the parameters */
assert_param(IS_TIM_CCX_INSTANCE(htim->Instance, Channel));
if (htim->State == HAL_TIM_STATE_BUSY) //여기서 걸린다.
{
return HAL_BUSY;
}
else if (htim->State == HAL_TIM_STATE_READY)
{
if ((pData == NULL) && (Length > 0U))
{
return HAL_ERROR;
}
else
{
htim->State = HAL_TIM_STATE_BUSY;
}
}
else
{
/* nothing to do */
}
...생략
구글에 찾아보니 나랑 똑같은 질문한 사람이 있더라
답변 중에 하나가 타이머 상태를 임의로 바꾸라는 답변이 있었다.
"it may be safe to set htim->State = HAL_TIM_STATE_READY manually after first HAL_TIM_PWM_Start_DMA call."
그래서 나는 상태 리셋 매크로 써서 해봤는데 전송 잘 되는 것 같더라
HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_4, motor2, DSHOT_FRAME_SIZE);
__HAL_TIM_RESET_HANDLE_STATE(&htim5); //추가
HAL_TIM_PWM_Start_DMA(&htim5, TIM_CHANNEL_2, motor3, DSHOT_FRAME_SIZE);
이렇게 하는게 맞는건지는 모르겠는데 일단 되니까 패스