cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H743 BLDC use Hallsensor get speed(HAL)

yefushanchuan
Visitor

LED1_TOGGLE();cant run when i start BLDC. can someone solve it? status of HAL_TIMEx_HallSensor_Start_DMA is OK and Mspinit is OK.

void hall_init(void)
{
    __HAL_RCC_DMA1_CLK_ENABLE();
    __HAL_LINKDMA(&g_htimx_handle, hdma[TIM_DMA_ID_CC1], g_hall_dma_handle);
    
    g_hall_dma_handle.Instance = DMA1_Stream5;
    g_hall_dma_handle.Init.Request = DMA_REQUEST_TIM5_CH1;
    g_hall_dma_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;
    g_hall_dma_handle.Init.MemInc = DMA_MINC_ENABLE;
    g_hall_dma_handle.Init.PeriphInc = DMA_PINC_DISABLE;
    g_hall_dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    g_hall_dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    g_hall_dma_handle.Init.Priority = DMA_PRIORITY_HIGH;
    g_hall_dma_handle.Init.Mode = DMA_CIRCULAR;
    g_hall_dma_handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    g_hall_dma_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
    g_hall_dma_handle.Init.MemBurst = DMA_MBURST_SINGLE;
    g_hall_dma_handle.Init.PeriphBurst = DMA_PBURST_SINGLE;
    HAL_DMA_Init(&g_hall_dma_handle);

    HAL_NVIC_SetPriority(DMA1_Stream5_IRQn, 1, 1);
    HAL_NVIC_EnableIRQ(DMA1_Stream5_IRQn);
    __HAL_DMA_ENABLE_IT(&g_hall_dma_handle, DMA_IT_TC);
    
    TIM_HallSensor_InitTypeDef hall_tim_handle = {0};
    
    g_htimx_handle.Instance = TIM5;
    g_htimx_handle.Init.Period = HALL_ARR;
    g_htimx_handle.Init.Prescaler = 200-1;
    g_htimx_handle.Init.RepetitionCounter = 0;
    g_htimx_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
    g_htimx_handle.Init.CounterMode = TIM_COUNTERMODE_UP;
    g_htimx_handle.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

    hall_tim_handle.Commutation_Delay = 1;
    hall_tim_handle.IC1Prescaler = TIM_ICPSC_DIV1;
    hall_tim_handle.IC1Filter = 15;
    hall_tim_handle.IC1Polarity = TIM_ICPOLARITY_FALLING;
    HAL_TIMEx_HallSensor_Init(&g_htimx_handle, &hall_tim_handle);
    HAL_TIMEx_HallSensor_Start_DMA(&g_htimx_handle, (uint32_t *)g_encoder_data, 1);
}

void HAL_TIMEx_HallSensor_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM5)
    {
        __HAL_RCC_GPIOH_CLK_ENABLE();
        __HAL_RCC_TIM5_CLK_ENABLE();
        
        GPIO_InitTypeDef gpio_init_struct = {0};
        gpio_init_struct.Pin = GPIO_PIN_10;
        gpio_init_struct.Mode = GPIO_MODE_INPUT;
        gpio_init_struct.Pull = GPIO_PULLUP;
        gpio_init_struct.Alternate = GPIO_AF2_TIM5;
        HAL_GPIO_Init(GPIOH, &gpio_init_struct);
        
        gpio_init_struct.Pin = GPIO_PIN_11;
        HAL_GPIO_Init(GPIOH, &gpio_init_struct);
        
        gpio_init_struct.Pin = GPIO_PIN_12;
        HAL_GPIO_Init(GPIOH, &gpio_init_struct);
    }
}

void DMA1_Stream5_IRQHandler(void)
{
    LED1_TOGGLE();
    if(__HAL_DMA_GET_FLAG(&g_hall_dma_handle, DMA_FLAG_TCIF1_5) != RESET)
    {
        HAL_DMA_IRQHandler(&g_hall_dma_handle);
    }
}

 

4 REPLIES 4
MM..1
Chief III

Are you sure breakpoint on line toggle not break ? 

i am sure. no break. but mu ADC code can. they are similar. it  is my  first time use HAL_TIMEx_HallSensor_Start_DMA on H743

#include "./BSP/ADC/adc.h"

ADC_HandleTypeDef g_adc_handle = {0};
DMA_HandleTypeDef g_adc_dma_handler = {0};
volatile uint16_t g_adc_dma_buf[ADC_DMA_BUF_SIZE] = {0};
volatile uint16_t g_adc_val[ADC_CH_NUM] = {0};

void adc_init(void)
{
    __HAL_RCC_DMA1_CLK_ENABLE();

    __HAL_LINKDMA(&g_adc_handle, DMA_Handle, g_adc_dma_handler);

    g_adc_dma_handler.Instance = DMA1_Stream6;
    g_adc_dma_handler.Init.Direction = DMA_PERIPH_TO_MEMORY;
    g_adc_dma_handler.Init.Request = 9;
    g_adc_dma_handler.Init.PeriphInc = DMA_PINC_DISABLE;
    g_adc_dma_handler.Init.MemInc = DMA_MINC_ENABLE;
    g_adc_dma_handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    g_adc_dma_handler.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    g_adc_dma_handler.Init.Mode = DMA_CIRCULAR;
    g_adc_dma_handler.Init.Priority = DMA_PRIORITY_HIGH;
    HAL_DMA_Init(&g_adc_dma_handler);
    
    HAL_NVIC_SetPriority(DMA1_Stream6_IRQn, 2, 1);
    HAL_NVIC_EnableIRQ(DMA1_Stream6_IRQn);
    __HAL_DMA_ENABLE_IT(&g_adc_dma_handler, DMA_IT_TC);
    
    g_adc_handle.Instance = ADC1;
    g_adc_handle.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;
    g_adc_handle.Init.Resolution = ADC_RESOLUTION_16B;
    g_adc_handle.Init.EOCSelection = ADC_EOC_SEQ_CONV;
    g_adc_handle.Init.ScanConvMode = ADC_SCAN_ENABLE;
    g_adc_handle.Init.NbrOfConversion = ADC_CH_NUM;
    g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    g_adc_handle.Init.ContinuousConvMode = ENABLE;
    g_adc_handle.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_CIRCULAR;
    g_adc_handle.Init.DiscontinuousConvMode = DISABLE;
    g_adc_handle.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
    g_adc_handle.Init.OversamplingMode = DISABLE;
    g_adc_handle.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
    HAL_ADC_Init(&g_adc_handle);
    
    HAL_ADCEx_Calibration_Start(&g_adc_handle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED);

    ADC_ChannelConfTypeDef adc_ch_conf;
    adc_ch_conf.Channel = ADC_CHANNEL_14;//PA2电压
    adc_ch_conf.Rank = ADC_REGULAR_RANK_1;
    adc_ch_conf.SingleDiff = ADC_SINGLE_ENDED;
    adc_ch_conf.Offset = 0;
    adc_ch_conf.OffsetNumber = ADC_OFFSET_NONE;
    adc_ch_conf.OffsetRightShift = DISABLE;
    adc_ch_conf.OffsetSignedSaturation = DISABLE;
    adc_ch_conf.SamplingTime = ADC_SAMPLETIME_810CYCLES_5;
    HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
    
    adc_ch_conf.Channel = ADC_CHANNEL_15;//PA3温度
    adc_ch_conf.Rank = ADC_REGULAR_RANK_2;
    HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
    
    adc_ch_conf.Channel = ADC_CHANNEL_17;//PA1电流u
    adc_ch_conf.Rank = ADC_REGULAR_RANK_3;
    HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
    
    adc_ch_conf.Channel = ADC_CHANNEL_18;//PA4电流v
    adc_ch_conf.Rank = ADC_REGULAR_RANK_4;
    HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
    
    adc_ch_conf.Channel = ADC_CHANNEL_19;//PA5电流w
    adc_ch_conf.Rank = ADC_REGULAR_RANK_5;
    HAL_ADC_ConfigChannel(&g_adc_handle, &adc_ch_conf);
    
    HAL_ADC_Start_DMA(&g_adc_handle, (uint32_t *)g_adc_dma_buf, ADC_DMA_BUF_SIZE);
}

void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{
    if(hadc->Instance == ADC1)
    {
        GPIO_InitTypeDef gpio_init_struct;
        __HAL_RCC_GPIOA_CLK_ENABLE();
        __HAL_RCC_ADC12_CLK_ENABLE();
        
        gpio_init_struct.Pin = GPIO_PIN_1;
        gpio_init_struct.Mode = GPIO_MODE_ANALOG;
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);

        gpio_init_struct.Pin = GPIO_PIN_2;
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
        
        gpio_init_struct.Pin = GPIO_PIN_3;
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
        
        gpio_init_struct.Pin = GPIO_PIN_4;
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
        
        gpio_init_struct.Pin = GPIO_PIN_5;
        HAL_GPIO_Init(GPIOA, &gpio_init_struct);
        
        RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
        adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;
        adc_clk_init.PLL2.PLL2M = 25;
        adc_clk_init.PLL2.PLL2N = 504;
        adc_clk_init.PLL2.PLL2P = 7;
        adc_clk_init.PLL2.PLL2Q = 7;
        adc_clk_init.PLL2.PLL2R = 7;
        adc_clk_init.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_0;
        adc_clk_init.PLL2.PLL2FRACN = 0;
        adc_clk_init.PLL2.PLL2VCOSEL = RCC_PLL2VCOWIDE;
        adc_clk_init.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;
        HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);
    }
}

void DMA1_Stream6_IRQHandler(void)
{
    if(__HAL_DMA_GET_FLAG(&g_adc_dma_handler, DMA_FLAG_TCIF2_6) != RESET)
    {
        HAL_DMA_IRQHandler(&g_adc_dma_handler);
    }
}

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
    if(hadc->Instance == ADC1)
    {
        HAL_ADC_Stop_DMA(&g_adc_handle);
        calc_adc_val((uint16_t *)(volatile void *)g_adc_val);
        HAL_ADC_Start_DMA(&g_adc_handle, (uint32_t *)g_adc_dma_buf, ADC_DMA_BUF_SIZE);
    }
}

void calc_adc_val(uint16_t *p)
{
    uint32_t temp[ADC_CH_NUM] ={0};
    int i,j;
    for(i=0;i<ADC_COLL;i++)
    {
        for(j=0;j<ADC_CH_NUM;j++)
        {
            temp[j] += g_adc_dma_buf[j+i*ADC_CH_NUM];
        }
    }
    for(j=0;j<ADC_CH_NUM;j++)
    {
        temp[j] /= ADC_COLL;
        p[j] = temp[j];
    }
}

 

Check startup files if your 

DMA1_Stream5_IRQHandler

realy exist i mean no. On ADC you use too HAL right cb for ADC and this works, but DMA too maybe no.
Your code you manage in MX ? And too check if TIM5 is connected to Stream5 DMA.

Example for is maybe

void HAL_TIMEx_HallSensor_DMAFullCpltCallback(TIM_HandleTypeDef *htim) {
    // Full buffer processed
}

 and use DMA for buffer with size 1 is ...

no. i use HAL manually. But i have solved problem.The mode should be GPIO_MODE_AF_PP or GPIO_MODE_AF_OD on H7. Thanks a lot !