|
发表于 2020-12-20 11:45:28
|
显示全部楼层
请教硬汉兄弟,我想用dma的方式进行输入捕获,自己写了如下代码,不能正确工作。请帮忙看看哪儿有问题吧,谢谢!
//定义数组
ALIGN_32BYTES( uint32_t buf[LEN]) = {0};
/* Clean Data Cache to update the content of the SRAM to be used by the DMA */
SCB_CleanDCache_by_Addr( ( uint32_t * ) buf, sizeof( buf) );
//启用DMA
if(HAL_TIM_IC_Start_DMA(&TimHandle, TIM_CHANNEL_1, (uint32_t*)buf, LEN) != HAL_OK)
{
Error_Handler(__FILE__, __LINE__);
}
//具体配置下(TIM3 CH1):
//开启时钟
TIMx_GPIO_CLK_ENABLE();
//配置引脚
/* Configure (TIMx_Channel) in Alternate function, push-pull and high speed */
GPIO_InitStruct.Pin = TIMx_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = TIMx_GPIO_AF;
HAL_GPIO_Init( TIMx_GPIO_PORT, &GPIO_InitStruct );
TIMx_CLK_ENABLE();
TimHandle.Instance = TIMx;
TimHandle.Init.Period = 0xFFFF;
TimHandle.Init.Prescaler = 19;
TimHandle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
TimHandle.Init.CounterMode = TIM_COUNTERMODE_UP;
TimHandle.Init.RepetitionCounter = 0;
if( HAL_TIM_IC_Init( &TimHandle ) != HAL_OK )
{
Error_Handler(__FILE__, __LINE__);
}
/*##-2- Configure the Input Capture channel ################################*/
/* Configure the Input Capture of channel 1 */
s_ICConfig.ICPolarity = TIM_ICPOLARITY_RISING;
s_ICConfig.ICSelection = TIM_ICSELECTION_DIRECTTI;
s_ICConfig.ICPrescaler = TIM_ICPSC_DIV1;
s_ICConfig.ICFilter = 0;
if( HAL_TIM_IC_ConfigChannel( &TimHandle, &s_ICConfig, TIM_CHANNEL_1 ) != HAL_OK )
{
Error_Handler(__FILE__, __LINE__);
}
/* DMA controller clock enable */
__HAL_RCC_DMA1_CLK_ENABLE();
s_DMA_TIM3_CH1.Instance = DMA1_Stream0;
s_DMA_TIM3_CH1.Init.Request = DMA_REQUEST_TIM3_CH1;
s_DMA_TIM3_CH1.Init.Direction = DMA_PERIPH_TO_MEMORY;
s_DMA_TIM3_CH1.Init.PeriphInc = DMA_PINC_DISABLE;
s_DMA_TIM3_CH1.Init.MemInc = DMA_MINC_ENABLE;
s_DMA_TIM3_CH1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
s_DMA_TIM3_CH1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
s_DMA_TIM3_CH1.Init.Mode = DMA_CIRCULAR;
s_DMA_TIM3_CH1.Init.Priority = DMA_PRIORITY_LOW;
s_DMA_TIM3_CH1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
__HAL_LINKDMA(&TimHandle, hdma[TIM_DMA_ID_CC1], s_DMA_TIM3_CH1);
HAL_DMA_Init( TimHandle.hdma[TIM_DMA_ID_CC1] );
// /* DMA interrupt init */
// /* DMA1_Stream0_IRQn interrupt configuration */
HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 4, 4);
HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);
void DMA1_Stream0_IRQHandler(void)
{
/* USER CODE BEGIN DMA1_Stream0_IRQn 0 */
/* USER CODE END DMA1_Stream0_IRQn 0 */
HAL_DMA_IRQHandler(&s_DMA_TIM3_CH1);
/* USER CODE BEGIN DMA1_Stream0_IRQn 1 */
/* USER CODE END DMA1_Stream0_IRQn 1 */
}
|
|