[LED_Extern]
LD1 : 통신에 관련된 LED
LD3 : 전원이 연결되면 해당 LED On(Red)
[Switch_Extern]
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int i = HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
int j = HAL_GPIO_ReadPin(Switch_Extern_GPIO_Port, Switch_Extern_Pin);
if((i == 0) || (j == 1))
{
// Extern LED Green
HAL_GPIO_WritePin(LED_Extern_Green_GPIO_Port, LED_Extern_Green_Pin, 1);
HAL_Delay(200);
HAL_GPIO_WritePin(LED_Extern_Green_GPIO_Port, LED_Extern_Green_Pin, 0);
HAL_Delay(200);
}
}
/* USER CODE END 3 */
[STM32 Mission #1]
Mission #1
① Red, Green, Yellow 세 가지 LED를 이용하여 회로를 구성하라.
② Sw1 ~Sw3의 3 개의 Sw 회로를 구성하라.
③ 각 LED 회로와 Sw 회로를 STM32 보드의 Pin에 Assign하고 각 스위치를 누를 때마다
각각의 LED가 200ms 간격으로 점멸되도록 프로그램 구성하여라.
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int i = HAL_GPIO_ReadPin(Switch_Extern_1_GPIO_Port, Switch_Extern_1_Pin);
int j = HAL_GPIO_ReadPin(Switch_Extern_2_GPIO_Port, Switch_Extern_2_Pin);
int k = HAL_GPIO_ReadPin(Switch_Extern_3_GPIO_Port, Switch_Extern_3_Pin);
if(i == 1)
{
// Extern LED Green & Switch_1
HAL_GPIO_WritePin(LED_Extern_Green_GPIO_Port, LED_Extern_Green_Pin, 1);
HAL_Delay(200);
HAL_GPIO_WritePin(LED_Extern_Green_GPIO_Port, LED_Extern_Green_Pin, 0);
HAL_Delay(200);
}
if(j == 1)
{
// Extern LED Green & Switch_1
HAL_GPIO_WritePin(LED_Extern_Red_GPIO_Port, LED_Extern_Red_Pin, 1);
HAL_Delay(200);
HAL_GPIO_WritePin(LED_Extern_Red_GPIO_Port, LED_Extern_Red_Pin, 0);
HAL_Delay(200);
}
if(k == 1)
{
// Extern LED Green & Switch_1
HAL_GPIO_WritePin(LED_Extern_Yellow_GPIO_Port, LED_Extern_Yellow_Pin, 1);
HAL_Delay(200);
HAL_GPIO_WritePin(LED_Extern_Yellow_GPIO_Port, LED_Extern_Yellow_Pin, 0);
HAL_Delay(200);
}
}
/* USER CODE END 3 */
[UART]
STM32 Board 에서는 총 2개의 UART Pin을 제공한다.
▶ PA2, PA3 (시리얼 포트로 연결되어 있음)
Hardware Flow Control
ctsrtos 에 관한 건데, 지금은 안 쓸 거니까 Disable
Basic Parameter
UART 통신 시, 사용되는 기본 Parameter들을 볼 수 있다.
여담이지만, LAM의 속도를 얘기할 때, bps를 쓴다.
이때 bps는 byte / sec도 아니고, bit / sec는 좀 부족하고, Baud Rate로 알고 있으면 된다.
Terminal Program
Teraterm
: 시리얼 쪽에 좀 더 특화되어 있고
putty
: 보통 얘를 많이 쓴다.
PuTTY 다운로드 링크
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_UART_Transmit(&huart2, "Hello Harman!", 13, 100); // Serial funcrion, Transmit
HAL_Delay(1000);
}
/* USER CODE END 3 */
원래는 문자열의 크기를 세서 써야 되는데, 그냥 적당히 13을 쓰자.
13, 100 : 각각의 문자열의 크기(Byte 수) , Time out(100ms 동안만 통신을 기다려라)
Timeout을 안 해주면, 오매불망 통신만 기다리기 때문에 blocking 에 걸려서 다른 기능을 쓸 수 없다.
Button을 활용한 UART
버튼을 누르면, UART를 통해 PuTTY로 문자열 출력
눌렀을 때, 한 번만 출력되고
계속 누르고 있어도 한 번만 출력되도록 코딩하여라.
/* Infinite loop */
/* USER CODE BEGIN WHILE */
int j = 0;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int i = HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
if (i == 0 && j == 0)
{
HAL_UART_Transmit(&huart2, "Hello Harman!", 13, 100);
HAL_Delay(1000);
j++;
}
else if(i == 1)
{
i = 0;
j = 0;
}
}
/* USER CODE END 3 */
}
※ 이스케이프 시퀀스를 사용하여 좀 더 깔끔하게 출력해보자.
단, \n, \r, \0 과 같은 이스케이프 시퀀스를 쓸 때는 문자열 크기가 그만큼 커진다는 것을 감안할 것.
ex) \n은 ASCII Code로 0a = LF(Line Feed) 이며 일정한 크기를 갖는다.
원래는 가상의 함수로 정의되어 있고, 사용 시 실체화를 해주면 된다.
char a = ch;
int 변수를 char에 넣으면, 앞에 불필요한 데이터는 다 날라가고 맨 마지막 byte만 남게 된다.
int j = 0;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int i = HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
if (i == 0 && j == 0)
{
// HAL_UART_Transmit(&huart2, "Hello Harman!\r\n", 13, 100);
printf("Hello Harman!\n");
HAL_Delay(1000);
j++;
}
else if(i == 1)
{
i = 0;
j = 0;
}
}
/* USER CODE END 3 */
}
int __io_putchar(int ch) // console 함수를 UART 기능 함수의 실체 구현
{
char a = ch;
HAL_UART_Transmit(&huart2, &a, 1, 100);
}
캐리지 리턴(\r)도 해줘야 한다.
int j = 0;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int i = HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
if (i == 0 && j == 0)
{
// HAL_UART_Transmit(&huart2, "Hello Harman!\r\n", 13, 100);
printf("Hello Harman!\r\n");
HAL_Delay(1000);
j++;
}
else if(i == 1)
{
i = 0;
j = 0;
}
}
/* USER CODE END 3 */
}
int __io_putchar(int ch) // console 함수를 UART 기능 함수의 실체 구현
{
char a = ch;
HAL_UART_Transmit(&huart2, &a, 1, 100);
}
몇 번 썼는지 카운트도 가능
int j = 0;
int k = 0;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
int i = HAL_GPIO_ReadPin(B1_GPIO_Port, B1_Pin);
if (i == 0 && j == 0)
{
// HAL_UART_Transmit(&huart2, "Hello Harman!\r\n", 13, 100);
printf("Hello Harman!(%08x)\r\n", k);
HAL_Delay(1000);
j++;
k++;
}
else if(i == 1)
{
i = 0;
j = 0;
}
}
/* USER CODE END 3 */
}
int __io_putchar(int ch) // console 함수를 UART 기능 함수의 실체 구현
{
char a = ch;
HAL_UART_Transmit(&huart2, &a, 1, 100);
}
'# Semiconductor > - Semicon Academy' 카테고리의 다른 글
[Harman 세미콘 아카데미] 32일차 - PSpice(BJT, 소신호 등가 모델) (0) | 2023.08.01 |
---|---|
[Harman 세미콘 아카데미] 31일차 - PSpice(Passive Filter, Diode) (0) | 2023.07.31 |
[Harman 세미콘 아카데미] 29일차 - STM32(Initial setting, Pin assign, LED_On/Off) (0) | 2023.07.27 |
[Harman 세미콘 아카데미] 28일차 - ATmega128 과제(UART와 LED활용) (0) | 2023.07.27 |
[Harman 세미콘 아카데미] 28일차 - ATmege128(UART 통신, Realtime clock) (0) | 2023.07.26 |