Skocz do zawartości

Kurs STM32 F1 HAL - #7 - liczniki (timery) w praktyce, PWM


Pomocna odpowiedź

@Harry_man Jesteś pewien, że przerabiasz ten kurs na STM32F103? Pytam, bo przykłady dotyczą tylko mikrokontrolera F103, na innych mają pełne prawo nie działać.

Dawno nie zaglądałem do kodu HAL na F1, więc wiele mogło się zmienić, ale nie widzę pola Alternate w strukturze GPIO_InitTypeDef (https://github.com/STMicroelectronics/STM32CubeF1/blob/master/Drivers/STM32F1xx_HAL_Driver/Inc/stm32f1xx_hal_gpio.h) - więc albo mamy inne wersje biblioteki, albo inny mikrokontroler. I jeśli różnica wynika z użycia innego modelu mikrokontrolera to miałbym prośbę do admina o wydzielenie dyskusji, bo chyba nie dotyczy tego kursu.

  • Lubię! 1
  • 5 miesiące później...

 ten kod mi nie działa wyskakuja błedy

image.thumb.png.26b0713c3eccf4577ab1f3faca4ce55c.png a skopiowałam dokładnie tak jak w kursie jest 

#include "stm32f1xx.h"
 
TIM_HandleTypeDef tim2;
 
void TIM2_IRQHandler(void)
{
	HAL_TIM_IRQHandler(&tim2);
}
 
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == GPIO_PIN_RESET)
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
	else
		HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET);
 
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_SET);
}
 
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim)
{
	switch (htim->Channel) {
	case HAL_TIM_ACTIVE_CHANNEL_1:
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
		break;
	case HAL_TIM_ACTIVE_CHANNEL_2:
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_1, GPIO_PIN_RESET);
		break;
	case HAL_TIM_ACTIVE_CHANNEL_3:
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_2, GPIO_PIN_RESET);
		break;
	case HAL_TIM_ACTIVE_CHANNEL_4:
		HAL_GPIO_WritePin(GPIOC, GPIO_PIN_3, GPIO_PIN_RESET);
		break;
	default:
		break;
	}
}
 
int main(void)
{
	SystemCoreClock = 8000000; // taktowanie 8Mhz
	HAL_Init();
 
	__HAL_RCC_GPIOA_CLK_ENABLE();
	__HAL_RCC_GPIOC_CLK_ENABLE();
	__HAL_RCC_TIM2_CLK_ENABLE();
 
	GPIO_InitTypeDef gpio;
	gpio.Mode = GPIO_MODE_OUTPUT_PP;
	gpio.Pin = GPIO_PIN_5;
	gpio.Pull = GPIO_NOPULL;
	gpio.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOA, &gpio);
 
	gpio.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
	HAL_GPIO_Init(GPIOC, &gpio);
 
	tim2.Instance = TIM2;
	tim2.Init.Period = 1000 - 1;
	tim2.Init.Prescaler = 8000 - 1;
	tim2.Init.ClockDivision = 0;
	tim2.Init.CounterMode = TIM_COUNTERMODE_UP;
	tim2.Init.RepetitionCounter = 0;
	tim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
	HAL_TIM_Base_Init(&tim2);
	HAL_TIM_Base_Start_IT(&tim2);
	HAL_NVIC_EnableIRQ(TIM2_IRQn);
 
	__HAL_TIM_SET_COMPARE(&tim2, TIM_CHANNEL_1, 100);
	__HAL_TIM_SET_COMPARE(&tim2, TIM_CHANNEL_2, 200);
	__HAL_TIM_SET_COMPARE(&tim2, TIM_CHANNEL_3, 500);
	__HAL_TIM_SET_COMPARE(&tim2, TIM_CHANNEL_4, 900);
	__HAL_TIM_ENABLE_IT(&tim2, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3|TIM_IT_CC4);
 
	while (1) {
	}
}

co jest w takim razie zle?

U mnie powyższy kod działa. Wydaje mi się, że problem leży gdzieś w strukturze projektu lub jego ustawieniach. Sugeruję stworzyć nowy projekt (zgodnie z tym jak opisane to było w trzeciej części kursu), wkleić kod do pliku main.c (w folderze src) a następnie sprawdzić czy działa. W przypadku gdyby nie działało, w zakładce Problems, w dolnej części IDE, będą wypisane błędy które wypiszą co jest nie tak 😄

Faktycznie to było coś z ustawieniami w projekcie ale i tak dziwne bo ja wtedy pisałam jakby na tym starym projekcie co wcześniej mi działały kody

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...