OSHW : Open Source HW로 배우기가 쉽고 빠르며, HW 및 SW 지식이 부족해도 작동 가능하다. 대표적인 예로는 라즈베리파이, 아두이노, 이글 등이 있다. 교육용 보드 이미지가 있다.
OSHW x : 반도체회사들이 만드는 반도체로 개발용 보드 이미지가 있다.
OSHW를 사용하지 않은 회사가 더많다.
MCU : Microcontroller Unit
MCU 업계
1. STMicroelectronics : 개발 보드 저렴, 무료 개발 환경, 다양한 오픈 소스코드
2. Microchip
3. NXP
4. Texas Instruments
5. Renesas
보통 회로설계와 칩셋 제조사가 분리되어 있다.
사용할 MCU 정보
- 보드 이름 : Nucleo
- 보드 모델명 : Nucleo F103RB
- ST 사의 CPU 칩셋 이름 : STM32F103RB
- CPU 설계 : ARM Cortex-M3
STM32CubeIDE 설치에서 회원가입 후 윈도우용으로 설치해준다.
임베디드에서는 보통 Trace가 안된다.
Trace : CPU동작
을 멈추면서, 한 단계씩 진행하는 디버깅 방식인데 임베디드 환경에서 CPU를 일시 중지
시키는 일은 어려운 일이다.
해결책
디버깅 장비
1. ST Link/V2 : 2만원 가량, ST사에서 제작
2. Trace32 : 1000만원 가량, 디버거 성능이 좋다.
제가 사용할 Nucleo 보드에는
ST Link/v2가 포함
되어 있다.
주석은 삭제 말고 명심히 살펴봐야한다. CODE Begin 과 CODE END 사이에 작성해줘야, generate 할 시 삭제되지 않는다.
Peripherals
: MCU 에서, CPU / 메모리를 제외한 나머지 장치들을 뜻합니다.
종류
1. Input Device : Switch(Button) / Sensor
2. Output Device : LED / Motor
3. 통신 Device : I2C / SPI 등
어떤 PIN 을 사용할지 결정
1. 옅은 노란색 : 전원 관련
2. 카키색 : 변경 불가 PIN
3. 초록색 : 선택완료 PIN
4. 회색 : 변경 가능 PIN
MCU Selector을 통해 F103RBT6를 선택했다면 SYS에서
Serial Wire
통신으로 설정해줘야 한다.
GPIO 핀을 확인하기 위해서는 내부 회로도를 살펴보면 확인할 수 있다.
회로도 - Schematic에서 회로도를 다운받아 확인할 수 있다.
Drivers > STM ~ > Src > ~gpio.c 에서 사용가능 함수를 사용할 수 있습니다.
main.c에서 MX_GPIO_Init()를 Crtl + 클릭
해보면 내가 설정한 핀을 확인할 수 있다.
회로도를 확인하여 핀을 살펴봐야한다.
초기셋팅
PA5 핀의 라벨 : LD2
PA6 핀의 라벨 : LD3
함수설명
HAL_GPIO_WritePin([핀타입], [핀번호], [핀상태])
1. HAL : Hardware Abstraction Layer로 펌웨어에서 하드웨어로 접근하기 위해서는 레지스터
를 설정하여야 하는데 조금 어렵다. 따라서, 펌웨어와 하드웨어 중간에 HAL
을 위치시켜 내부의 레지스터 설정을 감추고 다양한 API를 제공
해주어 HAL에 접근하면 된다.
2. 핀타입 : PA핀은 GPIOA
로, PB핀은 GPIOB
로 PAC핀은 GPIOC
로 설정해준다.
3. 핀번호 : PA5핀은 GPIO_PIN_5
혹은 [라벨]_Pin
으로 설정해준다.
4. 핀상태 : SET(1) 켜기 or RESET(0) 끄기로 설정해준다. set / reset 소문자로도 가능
HAL_GPIO_WritePin(GPIOA,LD2_Pin, 1);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,LD2_Pin, 0);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA,LD3_Pin, 1);
HAL_Delay(1000);
HAL_GPIO_WritePin(GPIOA,LD3_Pin, 0);
HAL_Delay(500);
while (1)
{
for(int j=1; j<10; j++)
{
for(int i=0; i<20; i++)
{
HAL_GPIO_WritePin(GPIOA,LD2_Pin, 1);
HAL_Delay(j);
HAL_GPIO_WritePin(GPIOA,LD2_Pin, 0);
HAL_Delay(10-j);
}
}