728x90
- GPIO 제어 과정
- Power On -> Startup Code -> main()
- 예전에는 Stack Pointer를 코드로 (어셈블리만 이용가능했었음) 설정해줬어야 했으나 요즘에는 하드웨어에서 자동으로 설정해줌 (바로 C코드로 접근 가능)
- SP, PC 설정 후 전원 공급 -> Startup Code로 이동
- Stack Pointer : 현재 연산에 필요한 stack 영역에 저장되어있는 memory의 주소 저장. 저장시 자동으로 memory address가 바뀜
- Program Counter : 다음에 실행될 program code의 memory의 address 저장
1) Power On
- 보드의 동작 전원은 3.3V
- 가정에 AC로 들어오는 220V를 3.3V로 전환해줌
- 가정에 AC로 들어오는 220V를 3.3V로 전환해줌
2) Startup Code
- main 함수로 가기 전에 해야 할 최소한의 기능들을 적어놓음
- CPU가 바뀌면 (지금은 ARM Core Cortex M3용. 같은 M3여도 Flash Memory 용량이 바뀐다 등의 변화가 생기면) startup 코드가 바뀜
- STM32 IDE에서는 칩 설정만 하면 자동으로 startup code를 생성해줌
g_pfnVectors:
.word _estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
.word MemManage_Handler
.word BusFault_Handler
.word UsageFault_Handler
.word 0
.word 0
.word 0
.word 0
.word SVC_Handler
.word DebugMon_Handler
.word 0
.word PendSV_Handler
.word SysTick_Handler
.word WWDG_IRQHandler
.word PVD_IRQHandler
.word TAMPER_IRQHandler
.word RTC_IRQHandler
.word FLASH_IRQHandler
.word RCC_IRQHandler
.word EXTI0_IRQHandler
.word EXTI1_IRQHandler
.word EXTI2_IRQHandler
.word EXTI3_IRQHandler
.word EXTI4_IRQHandler
.word DMA1_Channel1_IRQHandler
.word DMA1_Channel2_IRQHandler
.word DMA1_Channel3_IRQHandler
.word DMA1_Channel4_IRQHandler
.word DMA1_Channel5_IRQHandler
.word DMA1_Channel6_IRQHandler
.word DMA1_Channel7_IRQHandler
.word ADC1_2_IRQHandler
.word USB_HP_CAN1_TX_IRQHandler
.word USB_LP_CAN1_RX0_IRQHandler
.word CAN1_RX1_IRQHandler
.word CAN1_SCE_IRQHandler
.word EXTI9_5_IRQHandler
.word TIM1_BRK_IRQHandler
.word TIM1_UP_IRQHandler
.word TIM1_TRG_COM_IRQHandler
.word TIM1_CC_IRQHandler
.word TIM2_IRQHandler
.word TIM3_IRQHandler
.word TIM4_IRQHandler
.word I2C1_EV_IRQHandler
.word I2C1_ER_IRQHandler
.word I2C2_EV_IRQHandler
.word I2C2_ER_IRQHandler
.word SPI1_IRQHandler
.word SPI2_IRQHandler
.word USART1_IRQHandler
.word USART2_IRQHandler
.word USART3_IRQHandler
.word EXTI15_10_IRQHandler
.word RTC_Alarm_IRQHandler
.word USBWakeUp_IRQHandler
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word 0
.word BootRAM /* @0x108. This is for boot in RAM mode for
STM32F10x Medium Density devices. */
- Startup Code에는 위처럼 memory map에 맞게끔 (word 간격) handler를 설정. GPIO Interrupt 발생 시 해당하는 handler 호출
- ex 1) .word DMA1_Channel1_IRQHandler : DMA을 사용할 때 채널 1에 int 발생시 해당 함수 호출
- ex 2) I2C interrupt 활성화 시
- 코드 실행 순서
- Startup Code의 Reset_Handler 함수 실행
- ld 파일 : 프로그램이 어떻게 구성되어있는지 적혀있음
- b LoopCopyDataInit : LoopCopyDataInit으로 jump
- branch : jump를 한다는 뜻
- CopyDataInit
- LoopFillZerobss
- FillZerobss
- SystemInit
- __libc_init_array
- main 함수
- HAL_Init 함수
- 주변 장치 Reset, Flash 관련 인터페이스 초기화, Systick (시스템의 시간을 결정하는 기준점)
- 전원이 켜질 때마다 위의 동작을 함
- SystemClock_Config()
- System Clock 설정
- MX_GPIO_Init()
- GPIO Ports Clock Enable, Pin의 output level 설정, pin의 번호를 샘
- __HAL_RCC_GPIOC_CLK_ENABLE() 에서 위의 과정을 수행
-
volatile unsigned int *reg = 0x40021018; *reg |= 16; // bit4를 1로 설정
- HAL_GPIO_WritePin(GPIO_LED_GPIO_Port, GPIO_LED_Pin, GPIO_PIN_SET) : GPIO Pin의 상태에 따라 LED13을 키거나 끔
- HAL_GPIO_Init(GPIO_LED_GPIO_Port, &GPIO_InitStruct) : GPIO option 설정
- 회로도 분석
- 위 회로도에서의 선은 전류가 흐르는 전선을 뜻하고, PCB판에 인쇄된 전선이거나, 점퍼선을 이용해서 구성한다.
- 점퍼선 : 떨어져 있는 두 소자들을 연결해주는 선으로, 실제로 납땜을 하기 전에 임시적으로 사용한다.
- 점퍼선에는 F, M의 두가지 type이 있다
- 브레드보드(별칭 빵판) : 납땜 없이 전자 회로를 구성할 수 있는 판. 판의 모양이 빵을 닮아 이름이 브레드보드가 됨
- 아래의 그림처럼 내부가 구성되어 있음
- 파란 선은 GND(접지선)으로 접지선과 연결시 사용하고, 빨간 선은 VCC(전압)으로 전원선과 연결시 사용됨. 두 영역을 '버스영역(전원의 +, -를 연결하는 부분)' 이라고 부름
- 녹색 선은 전자 소자들을 연결하는 부분으로, 'IC영역' 이라고 부름. 녹색의 세로 5칸은 회로에서의 한 노드임
- 테스터기로 쇼트 테스트 하는 법
- Ex) 테스터기의 프로브 하나를 3번 외부 핀(VBAT)에 꽂고, 반대편 프로브를 외부 17번 핀에 연결
- 쇼트 테스트를 했을 때 -삐 소리가 나면 회로도 대로 연결이 되어있음을 확인 가능 (두 핀 사이에는 저항이 없다)
- 회로도 보는 법
- VCC : 전원에 연결. 3V3부분과 연결되어야 함
- SCLK : PB15와 연결
- RCLK : PB13과 연결
- DIO : PB14와 연결
- GND : 1번 핀(GND)와 연결
위와 같은 방식으로 회로도를 실물과 비교해가며 각 핀을 어디에 연결해야 하는지 알 수 있음
위 내용의 모든 출처는 유튜버 '[오제이 튜브]OJ Tube' 님께 있습니다.
https://www.youtube.com/watch?v=1YpiCnHQb3k&t=2259s
'Study_Embedded > [오제이 튜브의 임베디드 실전 강의]' 카테고리의 다른 글
[오제이 튜브의 임베디드 실전 강의] 10강 데이터 시트 보는 꼼수 (0) | 2022.03.26 |
---|---|
[오제이 튜브의 임베디드 실전 강의] 9강 회로도 딱 필요한 만큼만 배우자! (0) | 2022.03.03 |
[오제이 튜브의 임베디드 실전 강의] 7강 GPIO제어 고아 먹기 (0) | 2022.02.11 |
[오제이 튜브의 임베디드 실전 강의] 6강 GPIO제어 뿌셔 먹기 (0) | 2022.02.08 |
[오제이 튜브의 임베디드 실전 강의] 5강 혼자서 임베디드 고수 되는 법 (0) | 2022.01.24 |