Language/AVR

STM32 : LED

짱도르딘 2024. 9. 12. 14:45
728x90

STM32

 

새로운 프로젝트를 생성할 때에는 아래와 같은 MCU를 선택한다.

더블클릭한 후 프로젝트 이름을 설정하고 Finish를 누른다.

 

왼쪽 배너에서 RCC를 선택 후 HSE를 아래와 같이 설정한다.

 

그다음, 배너에서 SYS를 선택한 후 Serial Wire를 선택한다.

 

설정을 하고나면 아래와 같이 핀설정이 된 것을 확인할 수 있다.

상단의 배너에서 Clock Configuration을 선택한 후, 아래와 같이 설정한다.

 

 

 

상단 배너에서 Project Manager를 선택한 후, Code Generator에서 첫번째에 체크를 한 후 진행한다.

 

저장(Cntr + S)를 누르면 아래와 같이 문구가 뜨며 Yes를 선택한다.

 

 

새 창에서 File 선택 후 아래와 같이 Configuration를 선택한다.

 

Configuration을 선택하면 아래와 같이 창이 뜨는 것을 확인할 수 있는데, 경로를 찾아 파일을 대입한다.

 

 

Finish를 누르면 아래와 같이 Project가 두개가 생성된 것을 확인할 수 있다.

 


 

복사 된 프로젝트 이름과 ioc의 이름은 동일화 시켜야한다.

 

 

이름을 동일하게 변경 후, Properties를 클릭 후 C/C++ Build에서 Refresh Pollcy 선택하고 파일 선택 후 Apply 선택한다.

 

Apply Close 선택 후, Clean Project 후 Build Project를 진행한다.

 


 

LED 점등하기

 

main.c 에 다음과 같이 코드를 작성하였다.

 

  while (1)
  {
	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5 , GPIO_PIN_SET);
	  HAL_Delay(200);
	  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, 0);
	  HAL_Delay(200);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

STM32 C/C++을 더블클릭하면 아래와 같이 디버그가 생성되는 것을 확인할 수 있다.

RUN을 누르면 다음과 같이 LED가 깜빡이는 것을 확인할 수 있다.

 

 

 


CH10의 핀 구성도는 다음과 같다.


LED Bar

이번에는 LED Bar를 제어해보려한다.

 

PB1~9(7 제외)를 사용할 예정이므로 아래와 같이 핀 out을 설정한다.

 

코드는 아래와 같이 작성하였다.

while (1)
  {
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 , GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2 , GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3 , GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4 , GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5 , GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6 , GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8 , GPIO_PIN_SET);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9 , GPIO_PIN_SET);
	  HAL_Delay(200);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1 , 0);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2 , 0);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3 , 0);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4 , 0);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5 , 0);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6 , 0);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8 , 0);
	  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9 , 0);
	  HAL_Delay(200);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

코드를 실행시키면 아래와 같이 동작하는 것을 확인할 수 있다.

 

 

 


이번에는 LED Bar를 순서대로 점등시켜보려한다.

 

구조체 부분의 코드는 아래와 같이 작성하였다.

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

typedef struct
{
	GPIO_TypeDef *port;
	uint16_t	pinNumber;
	GPIO_PinState	onState;
	GPIO_PinState	offState;
}LED_TBL;

LED_TBL led_tbl[8] =
{
		{GPIOB, GPIO_PIN_1, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOB, GPIO_PIN_2, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOB, GPIO_PIN_3, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOB, GPIO_PIN_4, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOB, GPIO_PIN_5, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOB, GPIO_PIN_6, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOB, GPIO_PIN_8, GPIO_PIN_SET, GPIO_PIN_RESET},
		{GPIOB, GPIO_PIN_9, GPIO_PIN_SET, GPIO_PIN_RESET},
};

void ledOn(uint8_t ch)
{
	HAL_GPIO_WritePin(led_tbl[ch].port, led_tbl[ch].pinNumber, led_tbl[ch].onState);
}

void ledOff(uint8_t ch)
{
	HAL_GPIO_WritePin(led_tbl[ch].port, led_tbl[ch].pinNumber, led_tbl[ch].offState);
}

void ledToggle(uint8_t ch)
{
	HAL_GPIO_TogglePin(led_tbl[ch].port, led_tbl[ch].pinNumber);
}


/* USER CODE END PTD */

 

메인 부분의 코드는 아래와 같다.

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
	  for(uint8_t i = 0; i < 8; i++)
	  {
		  ledOn(i);
		  HAL_Delay(300);
	  }
	  HAL_Delay(500);
	  for(uint8_t i = 0; i < 8; i++)
	  {
		  ledOff(i);
		  HAL_Delay(300);
	  }
	  HAL_Delay(500);

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

 

코드를 돌리면 아래와 같은 동작을 수행하는 것을 확인할 수 있다.

 

 

 

 

728x90

'Language > AVR' 카테고리의 다른 글

STM32 : Button, Timer  (1) 2024.09.13
STM32 : UART  (2) 2024.09.12
ATmega 128 : CLCD, I2C  (0) 2024.09.10
ATmega 128 : 4-Digit FND 동작 구현  (0) 2024.05.30
ATmega 128 : FND 동작 구현  (0) 2024.05.29