Ich möchte bei einem STM32L433 den TIM16 für eine PWM konfigurieren,
ohne direkt auf einen Ausgang zu gehen, sondern manuell im CompareMatch-
und im Update-Interrupt meinen Code auszuführen.
Ich habe die Config für den Einstieg mit CubeMX erledigt und frage dann
die entsprechenden IT-Bits in der IRQ ab. Zu Beginn der Main rufe ich
1 | HAL_TIM_PWM_Start_IT(&htim16, TIM_CHANNEL_1);
|
auf.
Ich bekomme mit dem Code auch Compare Match Interrupts (wie gewünscht),
allerdings treten keine Update-Interrupts auf. Kann mir jemand
aufzeigen, wo ich entwas vergessen habe?
IRQ:
1 | void TIM1_UP_TIM16_IRQHandler(void)
|
2 | {
|
3 | /* USER CODE BEGIN TIM1_UP_TIM16_IRQn 0 */
|
4 |
|
5 | if (__HAL_TIM_GET_FLAG(&htim16, TIM_FLAG_CC1) != RESET)
|
6 | {
|
7 | if (__HAL_TIM_GET_IT_SOURCE(&htim16, TIM_IT_CC1) != RESET)
|
8 | {
|
9 | // Do something
|
10 | }
|
11 | }
|
12 |
|
13 | if (__HAL_TIM_GET_FLAG(&htim16, TIM_FLAG_UPDATE) != RESET)
|
14 | {
|
15 | if (__HAL_TIM_GET_IT_SOURCE(&htim16, TIM_IT_UPDATE) != RESET)
|
16 | {
|
17 | // Do something else
|
18 | }
|
19 | }
|
20 | /* USER CODE END TIM1_UP_TIM16_IRQn 0 */
|
21 |
|
22 | HAL_TIM_IRQHandler(&htim16);
|
23 |
|
24 | }
|
TIM16-Config aus Cube:
1 | static void MX_TIM16_Init(void)
|
2 | {
|
3 | TIM_OC_InitTypeDef sConfigOC = {0};
|
4 | TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
|
5 |
|
6 | htim16.Instance = TIM16;
|
7 | htim16.Init.Prescaler = 0;
|
8 | htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
|
9 | htim16.Init.Period = 24000;
|
10 | htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
11 | htim16.Init.RepetitionCounter = 0;
|
12 | htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
13 | if (HAL_TIM_Base_Init(&htim16) != HAL_OK)
|
14 | {
|
15 | Error_Handler();
|
16 | }
|
17 | if (HAL_TIM_PWM_Init(&htim16) != HAL_OK)
|
18 | {
|
19 | Error_Handler();
|
20 | }
|
21 | sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
22 | sConfigOC.Pulse = 12000;
|
23 | sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
24 | sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
|
25 | sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
26 | sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
|
27 | sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
|
28 | if (HAL_TIM_PWM_ConfigChannel(&htim16, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
29 | {
|
30 | Error_Handler();
|
31 | }
|
32 | sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
|
33 | sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
|
34 | sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
|
35 | sBreakDeadTimeConfig.DeadTime = 0;
|
36 | sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
|
37 | sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
|
38 | sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
|
39 | if (HAL_TIMEx_ConfigBreakDeadTime(&htim16, &sBreakDeadTimeConfig) != HAL_OK)
|
40 | {
|
41 | Error_Handler();
|
42 | }
|
43 | }
|