Embedded Programming (STM)/STM32F411RE
STM32 (9월 12일, STM32 입문 - (2))
유로 청년
2024. 9. 12. 21:59
1. LED 바를 이용하여 LED 바를 켰다 껐다를 반복하자.
1.1. 8개의 핀을 갖는 LED 바를 컨트롤하기 위해 STM32의 8개의 핀을 선택하여 출력으로 설정
- STM32의 8개 핀을 다음과 같이 선택하여 GPIO_OUTPUT으로 설정하였다.
- PA_5, PA_6, PA_7, PB_6, PC_7, PA_9, PA_8, PB_10 을 GPIO_OUTPUT으로 설정하였다,
1.2. HAL_GPIO_TogglePin 함수를 이용하여 각 핀의 값을 0.5초마다 Toggle되도록 설계한다.
- HAL_GPIO_TogglePin 함수는 해당 핀의 값을 Toggle 시켜주는 함수이다.
- HAL_GPIO_TogglePin 함수를 통해 0.5초마다 Toggle 시킴으로서 LED 바가 1초를 주기를 깜박이게 된다.
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_7);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_6);
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_7);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_9);
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_10);
HAL_Delay(500);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
1.3. 구현
2. 구조체를 통해 LED 바를 제어하기
- 위 코드를 통해서 알 수 있듯이 STM 32에서 각 포트의 핀들이 순서대로 정렬되어 있지 않고, 분산되어 있기 때문에 순차적으로 핀을 연결하기 위해서는 각각의 서로 다른 핀들을 사용해야 한다.
- 하지만, 각각의 핀들을 하나 하나 제어하는 것은 비효율적이기 때문에, 이번에는 구조체를 이용하여 하나의 그룹으로 묶어 보도록 하겠다.
2.1. 구조체를 정의
- PIN_TABLE 구조체는 GPIO PORT, GPIO PIN, LED On state, LED Off state를 맴버로 갖도록 설계했다.
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef struct {
GPIO_TypeDef* p_gpio_port;
uint16_t gpio_pin;
GPIO_PinState onState;
GPIO_PinState offState;
}PIN_TABLE;
/* USER CODE END PTD */
2.2. 구조체 초기화
- LED 바를 제어하기 위해 다음과 같이 서로 다른 포트의 8개의 핀으로 초기화를 하였다.
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
typedef struct {
GPIO_TypeDef* p_gpio_port;
uint16_t gpio_pin;
GPIO_PinState onState;
GPIO_PinState offState;
}PIN_TABLE;
PIN_TABLE pin_table [8] = {
{GPIOA, GPIO_PIN_5, GPIO_PIN_SET, GPIO_PIN_RESET},
{GPIOA, GPIO_PIN_6, GPIO_PIN_SET, GPIO_PIN_RESET},
{GPIOA, GPIO_PIN_7, GPIO_PIN_SET, GPIO_PIN_RESET},
{GPIOB, GPIO_PIN_6, GPIO_PIN_SET, GPIO_PIN_RESET},
{GPIOC, GPIO_PIN_7, GPIO_PIN_SET, GPIO_PIN_RESET},
{GPIOA, GPIO_PIN_9, GPIO_PIN_SET, GPIO_PIN_RESET},
{GPIOA, GPIO_PIN_8, GPIO_PIN_SET, GPIO_PIN_RESET},
{GPIOB, GPIO_PIN_10, GPIO_PIN_SET, GPIO_PIN_RESET},
};
/* USER CODE END PTD */
2.3. LED 바의 각각의 LED를 제어하는 사용자 정의 함수를 정의
- 핀 번호 값을 Parameter로 받으면 해당 값에 해당하는 핀의 LED를 켰다 끄는 함수를 정의하였다.
/* USER CODE BEGIN PFP */
void led_on(uint8_t index) {
HAL_GPIO_WritePin(pin_table[index].p_gpio_port, pin_table[index].gpio_pin, pin_table[index].onState);
}
void led_off(uint8_t index) {
HAL_GPIO_WritePin(pin_table[index].p_gpio_port, pin_table[index].gpio_pin, pin_table[index].offState);
}
/* USER CODE END PFP */
2.4. 구조체와 반복문을 이용하여 LED 바를 제어하도록 설계
- 이전 코드와 달리 구조체를 이용하여 서로 다른 포트더라도 하나의 묶음으로 묶음으로서 이제 반복문으로 제어 할 수 있게 되었다.
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
// LED ON & 0.5 delay
for(uint8_t i=0; i<8; i++) {
led_on(i);
HAL_Delay(500);
}
// LED OFF & 0.5s delay
for(uint8_t i=0; i<8; i++) {
led_off(i);
HAL_Delay(500);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
2.5. 구현