Hallo Zusammen,
ich möchte gerne ein Software PWM Signal mit einem STM32F303
(ST-Nucleo-32) Board generieren.
Ich verwende CubeMX und deren HAL_Library.
Das gewünschte PWM habe ich damit auch generieren können, allerdings mit
einem Problem. Das PWM Signal "flackert":
|||__|||__||__|||__|||_|||__|||__|||__|||__|||__|||__
1 | int main(void)
|
2 | {
|
3 | HAL_Init();
|
4 | SystemClock_Config();
|
5 | MX_GPIO_Init();
|
6 | MX_TIM2_Init();
|
7 |
|
8 | HAL_TIM_OC_Start_IT(&htim2,TIM_CHANNEL_1);
|
9 | __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1, 0x100);
|
10 |
|
11 | }
|
1 | void SystemClock_Config(void)
|
2 | {
|
3 |
|
4 | RCC_OscInitTypeDef RCC_OscInitStruct;
|
5 | RCC_ClkInitTypeDef RCC_ClkInitStruct;
|
6 |
|
7 | /**Initializes the CPU, AHB and APB busses clocks
|
8 | */
|
9 |
|
10 | RCC_OscInitStruct.HSEState = RCC_HSE_ON;
|
11 | RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
|
12 | RCC_OscInitStruct.HSIState = RCC_HSI_ON;
|
13 | RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_NONE;
|
14 | RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
|
15 | RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
|
16 | RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
|
17 |
|
18 | if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
|
19 | {
|
20 | _Error_Handler(__FILE__, __LINE__);
|
21 | }
|
22 |
|
23 | /**Initializes the CPU, AHB and APB busses clocks
|
24 | */
|
25 | RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
|
26 | RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
|
27 | RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
|
28 | RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
|
29 | RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
|
30 |
|
31 | if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
|
32 | {
|
33 | _Error_Handler(__FILE__, __LINE__);
|
34 | }
|
35 |
|
36 | /**Configure the Systick interrupt time
|
37 | */
|
38 | HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
|
39 |
|
40 | /**Configure the Systick
|
41 | */
|
42 | HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
|
43 |
|
44 | /* SysTick_IRQn interrupt configuration */
|
45 | HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
|
46 | }
|
1 | static void MX_TIM2_Init(void)
|
2 | {
|
3 |
|
4 | TIM_ClockConfigTypeDef sClockSourceConfig;
|
5 | TIM_MasterConfigTypeDef sMasterConfig;
|
6 |
|
7 | htim2.Instance = TIM2;
|
8 | htim2.Init.Prescaler = 8;
|
9 | htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
|
10 | htim2.Init.Period = 0xFFFE;
|
11 | htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
12 | htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
|
13 | if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
|
14 | {
|
15 | _Error_Handler(__FILE__, __LINE__);
|
16 | }
|
17 |
|
18 | sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
|
19 | if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
|
20 | {
|
21 | _Error_Handler(__FILE__, __LINE__);
|
22 | }
|
23 |
|
24 | sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;
|
25 | sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
|
26 | if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
|
27 | {
|
28 | _Error_Handler(__FILE__, __LINE__);
|
29 | }
|
30 |
|
31 | }
|
1 | void TIM2_IRQHandler(void)
|
2 | {
|
3 |
|
4 | switch(c){
|
5 |
|
6 | case 1: //+0xBB8
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | CNT_Current= __HAL_TIM_GET_COUNTER(&htim2);
|
12 | __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, CNT_Current+0xBB8);
|
13 | GPIOB -> ODR |= GPIO_PIN_3;
|
14 |
|
15 | c=3;
|
16 |
|
17 | break;
|
18 |
|
19 |
|
20 | case 2:
|
21 | //kommt später...
|
22 | break;
|
23 |
|
24 |
|
25 | case 3: //+0x1F4
|
26 |
|
27 | CNT_Current=__HAL_TIM_GET_COUNTER(&htim2);
|
28 | __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, CNT_Current+ 0x1F4);
|
29 | GPIOB -> ODR &= ~GPIO_PIN_3;
|
30 | c = 1;
|
31 |
|
32 | break;
|
33 |
|
34 | }
|
35 |
|
36 |
|
37 | HAL_TIM_IRQHandler(&htim2);
|
38 |
|
39 | }
|
Ich wäre für eine Lösung bzw. Erklärung sehr dankbar!