AnsweredAssumed Answered

Prescaler value is not updating.

Question asked by Shubhendu Banerjee on Mar 17, 2018
Latest reply on Mar 19, 2018 by Shubhendu Banerjee

Here is the code snippets-

/* My custom timer struct */

typedef struct TagPWMTimer
{
    TIM_TypeDef *TIMx;
    HAL_TIM_ActiveChannel Channel;
    uint32_t Prescaler;
    uint32_t Count_Periode;
    uint32_t Count_Pulse;
    TimerMode Timer_Mode;
    TimerSubMode Timer_Sub_Mode;
    PeripheralState Peripheral_State;
}PWMTimer, *pPWMTimer;

 

/* Struct initialization here */

SegmentPWMGenerator_Timer=*(TIM21);
    SegmentPWMGenerator.TIMx=SegmentPWMGenerator_Timer;
    SegmentPWMGenerator.Channel=LL_TIM_CHANNEL_CH1;
    SegmentPWMGenerator.Prescaler=16000;
    SegmentPWMGenerator.Count_Periode=0X9FFF;
    SegmentPWMGenerator.Count_Pulse=0x1FFF;
    SegmentPWMGenerator.Timer_Mode=PWM1;
    SegmentPWMGenerator.Timer_Sub_Mode=EdgeAlliened;   
    PWM_Init(&SegmentPWMGenerator);

 

 

 

 

 

/* PWM_Init definition */

status PWM_Init(PWMTimer * pPWMTimer_n)
{
    status ReturnStatus=0;
    pPWMTimer_n->Peripheral_State=BUSY;
      /* Set the Prescaler value */
    pPWMTimer_n->TIMx->CR1=SETBIT(pPWMTimer_n->TIMx->CR1, UDIS);
    LL_TIM_SetPrescaler (pPWMTimer_n->TIMx, pPWMTimer_n->Prescaler);
    LL_TIM_EnableARRPreload(pPWMTimer_n->TIMx);
    LL_TIM_SetAutoReload(pPWMTimer_n->TIMx, pPWMTimer_n->Count_Periode);//__LL_TIM_CALC_ARR(16000000,LL_TIM_GetPrescaler (pPWMTimer_n->TIMx),20000));
    LL_TIM_SetCounterMode(pPWMTimer_n->TIMx, LL_TIM_COUNTERMODE_UP);
    ReturnStatus=Channel_Init(pPWMTimer_n);
    LL_TIM_EnableCounter(pPWMTimer_n->TIMx);
    LL_TIM_GenerateEvent_UPDATE(pPWMTimer_n->TIMx);
    pPWMTimer_n->Peripheral_State=READY;
    return ReturnStatus;
}

 

 

/* Channel_Init Definition */

status Channel_Init(PWMTimer * pPWMTimer_n)
{
    status ReturnStatus=0;
    LL_TIM_EnableIT_UPDATE(pPWMTimer_n->TIMx);
    if(pPWMTimer_n->TIMx==TIM21)
    {
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,GPIO_PIN_SET);
        __HAL_RCC_TIM21_CLK_ENABLE();
        HAL_NVIC_SetPriority(TIM21_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(TIM21_IRQn);
        TIM21->DIER |= TIM_IT_UPDATE;

 

    }
    if(GETBIT(pPWMTimer_n->TIMx->CR1, CEN)!=1)
    {
        switch(pPWMTimer_n->Timer_Sub_Mode)
        {
            case EdgeAlliened:
            {
                break;
            }
            case CenterAligned_1:
            {
                break;
            }
            case CenterAligned_2:
            {
                break;
            }
            case CenterAligned_3:
            {
                break;
            }
        }
    }
    else
        ReturnStatus= STATUS_INCOMPLETE;

 

    switch(pPWMTimer_n->Channel)
    {
        case LL_TIM_CHANNEL_CH1:
        {
            pPWMTimer_n->TIMx->CCR1=pPWMTimer_n->Count_Pulse;
            switch(pPWMTimer_n->Timer_Mode)
            {
                case Freeze:
                {
                    break;
                }
                case UpCount:
                {
                    break;
                }
                case DownCount:
                {
                    break;
                }
                case CenterAligned:
                {
                    break;
                }
                case InputCapture:
                {
                    break;
                }
                case PWMInput:
                {
                    break;
                }
                case ForcedOutput:
                {
                    break;
                }
                case OutputCompare:
                {
                    break;
                }
                case PWM1:
                {
                    LL_TIM_OC_SetMode(pPWMTimer_n->TIMx, LL_TIM_CHANNEL_CH1, LL_TIM_OCMODE_PWM1);
                    LL_TIM_OC_ConfigOutput(pPWMTimer_n->TIMx, LL_TIM_CHANNEL_CH1, LL_TIM_OCPOLARITY_HIGH);
                    LL_TIM_CC_EnableChannel(pPWMTimer_n->TIMx, LL_TIM_CHANNEL_CH1);
                    break;
                }
                case PWM2:
                {
                    break;
                }
                case OnePulse:
                {
                    break;
                }
                case EncoderInterface:
                {
                    break;
                }
                default:
                    break;
            }
            break;
        }
        case 2:
        {
            break;
        }
        default:
        {
            ReturnStatus=6;
            break;
        }
    }
    return ReturnStatus;
}

Outcomes