๐ก ์ค์ต ๋ชฉํ
1. ๋ฒํผ์ ๋๋ฅผ ์ LD1 -> LD2 -> LD3 ์์ผ๋ก LED ์ ๋ฉธ์ ON / OFF ์ํจ๋ค.
2. HAL_Delay ์ฌ์ฉ ์์ด LED๊ฐ ๊น๋นก๊ฑฐ๋ฆฌ๊ฒ ์ค์ ํ๋ค.
3. ์ค์ตํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ๊ตฌ์กฐ์ฒด, ํฌ์ธํฐ, ํจ์๋ฅผ ํ์ฉํด ์ฝ๋๋ฅผ ์์ฑํ๋ค.
๐ก ์ฃผ์ ํจ์
๋๋ผ์ด๋ฒ ํ์ผ๋ช : stm32f4xx_hal.gpio.c
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
//์ธ๋ถ ์ธํฐ๋ฝํธ ์ฝ๋ฐฑ ํจ์๋ก์จ ๋ฒํผ์ ๋๋ ์ ๋ ์ ๊ฐ์ ์ธ๋ถ ์ธํฐ๋ฝํธ ๋์์ด ๋ฐ์ํ์ ๋ ํด๋น ํจ์๊ฐ ์คํ๋๋ค.
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState)
// ์ถ๋ ฅ ๋ชจ๋(Output)๋ก ์ค์ ๋ ํน์ GPIO Pin์ ์ด๋ค ๊ฐ์ ์ถ๋ ฅํ ๊ฒ์ธ์ง ์ค์ ํ๋ ํจ์์ด๋ค.
// (LED์ ๊ฒฝ์ฐ 1(High)์ ์ ๋ฌํ๋ฉด ์ ๋ฑ, 0(Low)์ ์ ๋ฌํ๋ฉด ๊บผ์ง๋ค.
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
// ์ถ๋ ฅ ๋ชจ๋(Output)์ผ ๋ ํด๋น ํ์ ์ ๋ฌ๋๊ณ ์๋ ์ ํธ๋ฅผ 1(High)์ผ ๋ 0(Low)๋ก ๋ฐ๋๋ก 0(Low)์ผ ๋ 1(High)๋ก
// ๋ฐ์ ์์ผ์ค๋ค.
๐ก GPIO ์ธํ
STM32-429zi์ ๊ฒฝ์ฐ Green, Blue, Red 3๊ฐ์ง LED๊ฐ ์์ผ๋ฉฐ GPIO์ ์ด๊ธฐ ์ค์ ๊ฐ์ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ๋ค.
Pin Name
Port๋ ํ์ ๊ทธ๋ฃนํํ ๊ฐ๋ ์ด๋ฉฐ(e.g. PA, PB) Pin Name์ ํน์ ํฌํธ์ ์ํด์๋ Pin์ ์๋ฏธํ๋ค. (e.g. PA0, PA1)
์๋ ๊ทธ๋ฆผ์์ MCU -> LED๋ก On/Off ์ ํธ(๋ฐ์ดํฐ)๋ฅผ ์ ๋ฌํ๋ฏ๋ก Output์ผ๋ก ์ค์ ํ๋ค.
GPIO Output Level
GPIO Output Level์ ์์คํ
์ ์ธํ
ํ GPIO ํ์ ์ด๊ธฐ ์ถ๋ ฅ ์ํ๋ฅผ ์ง์ ํ ์ ์๋ ์์ฑ์ด๋ค.
Low - 0V(GND), High - 3.3V(VCC) 2๊ฐ์ง๋ก ์ค์ ํ ์ ์๋ค.
(โป ์ด๊ธฐ ์ถ๋ ฅ ์ํ๋ฅผ ๊ผญ High๋ก ์ฃผ์ง ์์๋ MCU์์ ๋ฌธ์ ์์ด ๋ฐ๋ก ์ํ ๋ ์ ๋ ฅ์ ๊ณต๊ธํด On/Off ํ ์ ์๊ธฐ ๋๋ฌธ์
์ด๊ธฐ ์ค์ ์ Low๋ก ์ค์ ํด๋ ๋๋ ๊ฒ ๊ฐ๋ค.)
GPIO mode
GPIO๋ Input, Output, Alternate Function, Analog, External Interrupt, External Event๊ฐ ์์ผ๋ฉฐ
์ธํฐ๋ฝํธ์ ๊ฒฝ์ฐ์๋ Rising Edge, Falling Edge๋ก ์ธ๋ถ ์ค์ ์ด ๊ฐ๋ฅํ๋ฉฐ
์ถ๋ ฅ์ ๊ฒฝ์ฐ์๋ Push Pull ๊ณผ Open Drain ๋ชจ๋๋ก ์ธ๋ถ ์ค์ ์ด ๊ฐ๋ฅํ๋ค.
์ด์ ์ด๋ก ์ ๋ฆฌ ๊ธ์์ ์์ธํ ๋ค๋ฃจ์์ง๋ง Push Pull, Open Drain์ ๊ฐ๋จํ ๋งํ๋ฉด ์๋์ ๊ฐ๋ค.
1. Push Pull
- High๋ฅผ ์ฃผ๋ฉด 5V๊ฐ ๋์ค๊ณ , Low๋ฅผ ์ฃผ๋ฉด 0V๊ฐ ์ถ๋ ฅ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ์
์ถ๋ ฅ์ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
2. Open Drain
- High๋ฅผ ์ฃผ๋ฉด 0V๊ฐ ์ถ๋ ฅ๋๋ค.
- MCU์์๋ 5V๋ฅผ ์ฃผ๋๋ฐ ์ฐ๊ฒฐ๋๋ ์ ์ ์ฅ์น๊ฐ 3.3V๋ฅผ ๋ฐ์์ผ ํ ๋ ํด๋น ๋ชจ๋๋ฅผ ํตํด
5V๊ฐ ๋ค์ด๊ฐ์ง ์๊ฒ ํ๊ณ ๋ฐ๋ก ์ ํญ์ ํตํด 3.3V๊ฐ ๋ค์ด๊ฐ๊ฒ ํ ๋ ํด๋น ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ค.
๐ก ์ค์ต ๊ฒฐ๊ณผ
https://github.com/Tobbyvv/stm32-project/tree/main/gpio
๋ฒํผ์ ๋๋ฅผ ์ LD1 -> LD2 -> LD3 ์์ผ๋ก LED ์ ๋ฉธ์ ON / OFF
์ธ๋ถ ์ธํฐ๋ฝํธ ์ฒ๋ฆฌ์ฉ ํ๋๊ทธ ๋ณ์๊ฐ true์ผ ๋(๋ฒํผ์ด ๋๋ ธ์ ๋) state๊ฐ ์ฆ๊ฐํ๋ฉฐ
0, 1, 2 state์ ๋ฐ๋ผ 1๋ฒ, 2๋ฒ 3๋ฒ LED๊ฐ ์ํ ๋์ํ๋ ์ฝ๋ ์
๋๋ค.
static bool exti_flag = false; //๋ฒํผ on/off ์ํ ์ ์ฅ์ ์ํ ๋ณ์ ์ ์ธ
static uint8_t state = 0; //3๊ฐ์ง LED ์ ์ด๋ฅผ ์ํ 0, 1, 2 ์ ์ฅ์ ์ํ ๋ณ์ ์ ์ธ
while (1)
{
/* USER CODE END WHILE */
if (exti_flag == true) {
exti_flag = false;
state++; //๋ฒํผ์ด ๋๋ฆด๋๋ง๋ค state๋ฅผ ์ฆ๊ฐ์ํด
state %= 3; //3์ผ๋ก ๋๋ ๋๋จธ์ง ๊ฐ์ ์ ์ฅํด 0, 1, 2 ์ ์ฅ
}
switch(state){
case 0:{
HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
HAL_Delay(1000); //1์ด๋ง๋ค Toggle(High -> Low, Low -> High) ๋๋๋ก ์ค์
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
break;
}
case 1:{
HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_RESET);
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
HAL_Delay(1000);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
break;
}
case 2:{
HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
HAL_Delay(1000);
break;
}}}}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_13) { //F429zi์ ๊ฒฝ์ฐ button์ด 13๋ฒ PIN์ ์ฐ๊ฒฐ๋์ด ์๋ค.
exti_flag = true; //์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ Pin์ ์ง์ ํด์ค์ผ ํ๋ ๋ฏ ํ๋ค.
}}
HAL_Delay ์ฌ์ฉ ์์ด LED๊ฐ ๊น๋นก๊ฑฐ๋ฆฌ๊ฒ ์ค์
๋ฒํผ์ ๋๋ ์ ๋์ ์๊ฐ๊ณผ ํ์ฌ ์๊ฐ์ ์ฐจ์ด๊ฐ 1์ด๊ฐ ๋์ด๊ฐ๋ฉด LED Toggle ๋๋๋ก ์์ฑ ํ์์ผ๋..
ํด๋น ๋์์ LD3๋ง ๋์ํ์๊ณ LD1, LD2๋ ๋์ํ์ง ์์์ต๋๋ค...
static bool exti_flag = false; //๋ฒํผ on/off ์ํ ์ ์ฅ์ ์ํ ๋ณ์ ์ ์ธ
static uint8_t state = 0; //3๊ฐ์ง LED ์ ์ด๋ฅผ ์ํ 0, 1, 2 ์ ์ฅ์ ์ํ ๋ณ์ ์ ์ธ
static uint32_t prev = 0; // ์ด์ ์๊ฐ
#define D_TIME_MAX 1000 // ์๊ฐ ๊ฐ๊ฒฉ 1์ด
while (1)
{
/* USER CODE END WHILE */
if (exti_flag == true) {
exti_flag = false;
state++;
state %= 3;
}
switch(state){
case 0:{
if (HAL_GetTick() - prev > D_TIME_MAX) { // 1์ด๊ฐ ์ง๋๋ฉด LED ํ ๊ธ
HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
prev = HAL_GetTick();
}
else if(HAL_GetTick() - prev < D_TIME_MAX) {
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
}}
๊ตฌ์กฐ์ฒด, ํฌ์ธํฐ, ํจ์๋ฅผ ํ์ฉํด ์ฝ๋๋ฅผ ์ ๋ฆฌ
๊ตฌ์กฐ์ฒด์ ํฌ์ธํฐ ํจ์๋ฅผ ์ด์ฉํด ์ค์ตํ ์ฝ๋๋ฅผ ์์ฑํ์์ต๋๋ค.
#include <stdio.h>
#include <stdbool.h>
#include "main.h"
#include "app.h"
static bool exti_flag = false; //๋ฒํผ on/off ์ํ ์ ์ฅ์ ์ํ ๋ณ์ ์ ์ธ
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
static uint32_t prev;
volatile uint32_t curr;
curr = HAL_GetTick(); //ํ์ฌ ์๊ฐ ๊ฐ์ ธ์ด
if ((uint32_t)(curr - prev) > 150) { //๋ฒํผ ๋์ ์๊ฐ ๊ฐ๊ฒฉ 0.15์ด๋ก ์ค๋ณต ์คํ ๋ฐฉ์ง
if (GPIO_Pin == GPIO_PIN_13) {
exti_flag = true;
}
prev = curr; //๋ฒํผ ๋๋ฅธ ์๊ฐ ์ ์ฅ
}}
#define D_TIME_MAX 500 //LED ๊น๋นก๊ฑฐ๋ฆผ ์๊ฐ ๊ฐ๊ฒฉ 0.5์ด
#define D_LED_MAX 3 //LED ๊ฐฏ์
typedef struct {
uint32_t prev; //์ด์ LED ํ ๊ธ ์๊ฐ ์ ์ฅ
void (*cbf)(void *, uint8_t); //ํจ์ ํฌ์ธํฐ ์ ์ธ(โป LED Toggle ํจ์ ํ ๋น์ฉ)
} LED_TOGGLE_T;
LED_TOGGLE_T gLedObj[D_LED_MAX]; //3๊ฐ์ LED์ ํ ๊ธ ๋์์ ๊ด๋ฆฌํ ๋ฐฐ์ด ์ ์ธ
void app_init(void)
{
// LED ํ ๊ธ ํจ์ ๋ฐ ๊ตฌ์กฐ์ฒด ์ด๊ธฐํ
gLedObj[0].cbf = LD1_Toggle;
gLedObj[1].cbf = LD2_Toggle;
gLedObj[2].cbf = LD3_Toggle;
for (uint8_t i=0; i<D_LED_MAX; i++) {
if (gLedObj[i].cbf == NULL) while (1); //TOGGLE ํจ์ ํ ๋น์ด ๋์๋์ง ํ์ธ
} //ํ ๋น ๋์ง ์์์ ๊ฒฝ์ฐ while๋ฌธ ์ข
๋ฃ
}
void app(void)
{
uint8_t state = 0;
app_init();
while (1)
{
if (exti_flag == true) {
exti_flag = false;
state++;
state %= D_LED_MAX;
gLedObj[state].cbf((void *)&gLedObj[state], 0);
//1.gLedObj[state], ์ฆ๊ฐ๋ ๋งค๊ฐ๋ณ์์ ํด๋นํ๋ ํจ์์
//2.๋จผ์ 0์ ์ ๋ฌํ์ฌ ๋ค๋ฅธ LED๋ฅผ ์ข
๋ฃ์ํด
}
gLedObj[state].cbf((void *)&gLedObj[state], 1);
//1์ ์ ๋ฌํ์ฌ ํด๋น LED๋ฅผ ๊น๋นก๊ฑฐ๋ฆฌ๊ฒํจ
}}
// LD1 LED ํ ๊ธ ํจ์
void LD1_Toggle(void *pArg, uint8_t op)
{
LED_TOGGLE_T *p = (LED_TOGGLE_T *)pArg;
if (op == 1) {
uint32_t curr = HAL_GetTick();
if (curr - p->prev > D_TIME_MAX) {
HAL_GPIO_TogglePin(LD1_GPIO_Port, LD1_Pin);
p->prev = curr;
printf("%s\r\n", __func__);
}
} else {
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
}}
// LD2 LED ํ ๊ธ ํจ์
void LD2_Toggle(void *pArg, uint8_t op)
{
LED_TOGGLE_T *p = (LED_TOGGLE_T *)pArg;
if (op == 1) {
uint32_t curr = HAL_GetTick();
if (curr - p->prev > D_TIME_MAX) {
HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
p->prev = curr;
printf("%s\r\n", __func__);
}
} else {
HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
}}
// LD3 LED ํ ๊ธ ํจ์
void LD3_Toggle(void *pArg, uint8_t op)
{
LED_TOGGLE_T *p = (LED_TOGGLE_T *)pArg;
if (op == 1) {
uint32_t curr = HAL_GetTick();
if (curr - p->prev > D_TIME_MAX) {
HAL_GPIO_TogglePin(LD3_GPIO_Port, LD3_Pin);
p->prev = curr;
printf("%s\r\n", __func__);
}
} else {
HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
}}
๐ก ๊ฒฐ๊ณผ ์์
'embedded' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[stm32] UART ์ค์ต (0) | 2023.08.30 |
---|---|
[stm32] UART ์ด๋ก ์ ๋ฆฌ (0) | 2023.08.16 |
[stm32] Timer ์ค์ต (0) | 2023.08.16 |
[stm32] Timer ์ด๋ก ์ ๋ฆฌ (0) | 2023.08.16 |
[stm32] GPIO ์ด๋ก ์ ๋ฆฌ (0) | 2023.08.12 |