Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- dataflow modeling
- ATMEGA128A
- DHT11
- structural modeling
- atmega 128a
- ring counter
- test bench
- hc-sr04
- stop watch
- soc 설계
- i2c 통신
- prescaling
- Edge Detector
- verilog
- java
- half adder
- BASYS3
- gpio
- KEYPAD
- Algorithm
- pwm
- Pspice
- D Flip Flop
- vivado
- FND
- LED
- Recursion
- Linked List
- uart 통신
- behavioral modeling
Archives
- Today
- Total
거북이처럼 천천히
STM32 (9월 12일, STM32 입문 - (2)) 본문
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. 구현
'Embedded Programming (STM) > STM32F411RE' 카테고리의 다른 글
STM32 (9월 12일, STM32 입문 - (1)) (0) | 2024.09.12 |
---|