2022. 5. 23. 14:08ㆍARM
STM32CubeIDE를 사용하여 칩 7483의 기능을 구현하였다.

Nucleo 보드에 스위치가 4개 임으로 7483의 핀 14,1,3,8,10의 입력을 브레드보드 스위치로 구현하였다.
I/O 보드의 스위치가 풀업 스위치이기 때문에 브레드보드의 스위치 또한 풀업 스위치로 구현하였다.

핀의 입력 부분은 if문과 HAL_GPIO_ReadPin 을 이용해서 구현하였다.
전원을 직접 인가하는 PIN4를 제외하고 나머지 핀은 풀업 스위치이기 때문에 GPIO_PIN_RESET( ! = 1 )을 사용하였다.
LED등에 불빛을 켜기 위해서 입력된 값들은 변수 output에 값을 더 해주었다.
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_4) == GPIO_PIN_SET) {
output = 1;
inCarry = 1;
}
// Bread Board switch
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8) != 1) {
output += 8;
}
if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_9) != 1) {
output += 4;
}
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_5) != 1) {
output += 2;
}
if (HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_6) != 1) {
output += 1;
}
//Nucleao Board switch
if (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_0) != 1) {
output += 8;
}
if (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_1) != 1) {
output += 4;
}
if (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_2) != 1) {
output += 2;
}
if (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_3) != 1) {
output += 1;
}
출력된 캐리를 표시하기 위해서 if문을 이용해 14번 핀의 값에 따라 다른 조건을 주웠다.
if (inCarry == 1) {
if (((HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_11) == GPIO_PIN_SET))
|| ((HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_3) == GPIO_PIN_RESET)))
OutCarry = 1;
else
OutCarry = 0;
} else if (inCarry == 0x0) {
if (((HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_6) == GPIO_PIN_RESET) && (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_3) == GPIO_PIN_RESET))
|| ((HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_5) == GPIO_PIN_RESET) && (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_2) == GPIO_PIN_RESET))
|| ((HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_9) == GPIO_PIN_RESET) && (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_1) == GPIO_PIN_RESET))
|| ((HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_8) == GPIO_PIN_RESET) && (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_0) == GPIO_PIN_RESET)))
OutCarry = 1;
else
OutCarry = 0;
}
I/O보드 LED에 불을 켜기위해서 변수 output에 비트연산을 하였다.
if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET){
GPIOD -> ODR = 0;
if(OutCarry == 1)
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0, GPIO_PIN_SET);
if((output & 8) == 8)
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4, GPIO_PIN_SET);
if((output & 4) == 4)
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_5, GPIO_PIN_SET);
if((output & 2) == 2)
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_6, GPIO_PIN_SET);
if((output & 1) == 1)
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_7, GPIO_PIN_SET);

LED가 켜졌을때 1, 꺼졌을때 0으로 입력값으로 0 / 0100 / 0010 을 주었을때 0110으로 계산되어 나왔다.

입력 값으로 0 / 0011 / 0010 을 주었을 때 0101이 나왔다. 캐리 값이 발생 했기 때문에 좌측의 1번 LED에도 불이 들어왔다.

이번에는 입력에 캐리 값을 넣었다. 1/ 0110 / 0001 을 입력했고 1000 값이 나왔고 캐리 값도 표시 되었다.
-힘들었던 점
1. I/O보드의 데이터시트를 구하지 못하였다. 보드에서 사용중인 핀을 중복으로 사용하였고 원치 않은 동작이 발생함.
2. 풀업 저항 / 풀다운 저항의 이해가 부족하여 회로 구현에 어려움을 겪음
-공부해야 할 부분
레지스터 제어코드를 이용해 소스코드를 짧게 바꿔볼것
'ARM' 카테고리의 다른 글
| [ARM] I2C 통신 (0) | 2022.06.14 |
|---|---|
| [ARM] 난수발생회로 (0) | 2022.06.01 |
| 디지털 금고 (0) | 2022.05.29 |
| 외부 인터럽트(EXTI) (0) | 2022.05.27 |
| [ARM] STM32CubeIDE 기초 펌웨어 프로그래밍 주석의 의미 (0) | 2022.05.23 |