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 */
}
코드를 돌리면 아래와 같은 동작을 수행하는 것을 확인할 수 있다.
'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 |