2017-10-16 8 views
1

Je suis en train de démarrer un STM32L576VGT avec FreeRTOS.stm32l476v TIM15 CH2 PWM ne fonctionne pas à partir de cubeMx

J'ai un led clignotant d'une tâche et maintenant j'essaye de mettre un PWM dessus, freq et le devoir n'est pas important maintenant, est un "hello world pwm".

Tout est fait en utilisant CubeMx, et j'ai été incapable de le faire fonctionner.

tim.c généré avec CubeMx pour TIM15

/* TIM15 init function */ 
void MX_TIM15_Init(void) 
{ 
    TIM_MasterConfigTypeDef sMasterConfig; 
    TIM_OC_InitTypeDef sConfigOC; 
    TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; 

    htim15.Instance = TIM15; 
    htim15.Init.Prescaler = 47999; 
    htim15.Init.CounterMode = TIM_COUNTERMODE_UP; 
    htim15.Init.Period = 200; 
    htim15.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
    htim15.Init.RepetitionCounter = 0; 
    htim15.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; 
    if (HAL_TIM_PWM_Init(&htim15) != HAL_OK) 
    { 
    _Error_Handler(__FILE__, __LINE__); 
    } 
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; 
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; 
    if (HAL_TIMEx_MasterConfigSynchronization(&htim15, &sMasterConfig) != HAL_OK) 
    { 
    _Error_Handler(__FILE__, __LINE__); 
    } 
    sConfigOC.OCMode = TIM_OCMODE_PWM1; 
    sConfigOC.Pulse = 0; 
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; 
    sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; 
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; 
    sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; 
    sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; 
    if (HAL_TIM_PWM_ConfigChannel(&htim15, &sConfigOC, TIM_CHANNEL_2) != HAL_OK) 
    { 
    _Error_Handler(__FILE__, __LINE__); 
    } 
    sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; 
    sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; 
    sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; 
    sBreakDeadTimeConfig.DeadTime = 0; 
    sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; 
    sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; 
    sBreakDeadTimeConfig.BreakFilter = 0; 
    sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; 
    if (HAL_TIMEx_ConfigBreakDeadTime(&htim15, &sBreakDeadTimeConfig) != HAL_OK) 
    { 
    _Error_Handler(__FILE__, __LINE__); 
    } 
    HAL_TIM_MspPostInit(&htim15); 



} 

void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle) 
{ 
    if(tim_pwmHandle->Instance==TIM15) 
    { 
    /* USER CODE BEGIN TIM15_MspInit 0 */ 
    /* USER CODE END TIM15_MspInit 0 */ 
    /* TIM15 clock enable */ 
    __HAL_RCC_TIM15_CLK_ENABLE(); 
    /* USER CODE BEGIN TIM15_MspInit 1 */ 
    /* USER CODE END TIM15_MspInit 1 */ 
    } 
} 

void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) 
{ 
    GPIO_InitTypeDef GPIO_InitStruct; 
    if(timHandle->Instance==TIM15) 
    { 
    /* USER CODE BEGIN TIM15_MspPostInit 0 */ 
    /* USER CODE END TIM15_MspPostInit 0 */ 
    /**TIM15 GPIO Configuration  
    PB15  ------> TIM15_CH2 
    */ 
    GPIO_InitStruct.Pin = GPIO_PIN_15; 
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; 
    GPIO_InitStruct.Pull = GPIO_PULLDOWN; 
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 
    GPIO_InitStruct.Alternate = GPIO_AF14_TIM15; 
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); 
    /* USER CODE BEGIN TIM15_MspPostInit 1 */ 
    /* USER CODE END TIM15_MspPostInit 1 */ 
    } 
} 

principal main.c

int main(void) 
{ 
    /* USER CODE BEGIN 1 */ 
    /* USER CODE END 1 */ 
    /* MCU Configuration----------------------------------------------------------*/ 
    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ 
    HAL_Init(); 
    /* USER CODE BEGIN Init */ 
    /* USER CODE END Init */ 
    /* Configure the system clock */ 
    SystemClock_Config(); 
    /* USER CODE BEGIN SysInit */ 
    /* USER CODE END SysInit */ 
    /* Initialize all configured peripherals */ 
    MX_GPIO_Init(); 
    MX_QUADSPI_Init(); 
    MX_LPUART1_UART_Init(); 
    MX_SPI2_Init(); 
    MX_I2C1_Init(); 
    MX_TIM15_Init(); 
    /* USER CODE BEGIN 2 */ 
// DISP_diplay_init(); 
    HAL_TIM_PWM_Start(&htim15,TIM_CHANNEL_2); 
    /* USER CODE END 2 */ 
    /* Call init function for freertos objects (in freertos.c) */ 
    MX_FREERTOS_Init(); 
    /* Start scheduler */ 
    osKernelStart(); 
    /* We should never get here as control is now taken by the scheduler */ 
    /* Infinite loop */ 
    /* USER CODE BEGIN WHILE */ 
    while (1) 
    { 
    /* USER CODE END WHILE */ 
    /* USER CODE BEGIN 3 */ 
    } 
    /* USER CODE END 3 */ 
} 

J'utilise TIM15 parce que le PCB est déjà fait et il est l'un est connecté à la sortie que je veux contrôler.

Merci, Guillermo

+0

Et qu'as-tu fait jusqu'ici pour trouver où est le problème? Connectez le débogueur l'arrêter et voir les registres de la minuterie 15 –

+0

Ps. Dans cette centaine de lignes du code l'activez-vous quelque part –

+0

le débbugin est ce que je fais maintenant, et oui dans le principal vous pouvez voir le MX_TIM15_Init(); et HAL_TIM_PWM_Start (& htim15, TIM_CHANNEL_2); – taquionbcn

Répondre

1

Avez-vous essayé avec des valeurs différentes sur sConfigOC.Pulse = 0;?