본문 바로가기

Study_Embedded/[오제이 튜브의 임베디드 실전 강의]

[오제이 튜브의 임베디드 실전 강의] 8강 지금까지 배운 것을 큰 그림에 저장하기

728x90

- GPIO 제어 과정

  • Power On -> Startup Code -> main()
  • GPIO 제어 과정. 출처 : 강의 영상
  • 예전에는 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로 전환해줌
      • 3.3V 아답터가 잘 없어서 위처럼 USB에서 입력받은 5V를 3.3V로 변환해서 MCU에 공급함

2) Startup Code

  • main 함수로 가기 전에 해야 할 최소한의 기능들을 적어놓음
  • CPU가 바뀌면 (지금은 ARM Core Cortex M3용. 같은 M3여도 Flash Memory 용량이 바뀐다 등의 변화가 생기면) startup 코드가 바뀜
  • STM32 IDE에서는 칩 설정만 하면 자동으로 startup code를 생성해줌

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 발생시 해당 함수 호출
  • stm32f1xx_it.c에 위처럼 자동으로 해당 Interrupt에 해당하는 함수의 코드 생성
  • ex 2) I2C interrupt 활성화 시
  • IOC에서 Interrupt를 활성화 시키면 stm32f1xx_it.c에 관련된 함수가 자동으로 생성됨. 여기에 내가 하고싶은 기능을 적으면 됨

 

- 코드 실행 순서

  1. Startup Code의 Reset_Handler 함수 실행
    • Reset_Hadler 함수는 STM32F103C8TX_FLASH.ld에 정의되어 있음
    • ld 파일 : 프로그램이 어떻게 구성되어있는지 적혀있음
  2. b LoopCopyDataInit : LoopCopyDataInit으로 jump
    • branch : jump를 한다는 뜻
  3. CopyDataInit
  4. LoopFillZerobss
  5. FillZerobss
  6. SystemInit 
    • SystemInit도 ld 파일에 정의되어 있음
    •  
  7. __libc_init_array 
  8. main 함수
  9. HAL_Init 함수
    • 주변 장치 Reset, Flash 관련 인터페이스 초기화, Systick (시스템의 시간을 결정하는 기준점)
    • 전원이 켜질 때마다 위의 동작을 함
  10. SystemClock_Config()
    • System Clock 설정
  11.  MX_GPIO_Init()
    • 현재 GPIOC 사용중
    • GPIO Ports Clock Enable, Pin의 output level 설정, pin의 번호를 샘
    • RCC_APB2ENR
    • GPIOC 사용을 위해서는 RCC Register의 Bit4를 1로 설정해 clock을 enable 시켜야 함. GPIOC의 Clock은 APB2  
    • __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 설정 

 

Register boundary addresses
GPIOx, 즉 GPIO 포트 하나에 해당하는 register들

 

- 회로도 분석

 

 

회로도 중 일부

  • 위 회로도에서의 선은 전류가 흐르는 전선을 뜻하고, PCB판에 인쇄된 전선이거나, 점퍼선을 이용해서 구성한다.
    • 점퍼선 : 떨어져 있는 두 소자들을 연결해주는 선으로, 실제로 납땜을 하기 전에 임시적으로 사용한다.
    • 점퍼선에는 F, M의 두가지 type이 있다

출처 : https://www.notion.so/e2badc0d44234360a994d25aca32d32c

 

  • 브레드보드(별칭 빵판) : 납땜 없이 전자 회로를 구성할 수 있는 판. 판의 모양이 빵을 닮아 이름이 브레드보드가 됨
  • 아래의 그림처럼 내부가 구성되어 있음
    • 파란 선은 GND(접지선)으로 접지선과 연결시 사용하고, 빨간 선은 VCC(전압)으로 전원선과 연결시 사용됨. 두 영역을 '버스영역(전원의 +, -를 연결하는 부분)' 이라고 부름
    • 녹색 선은 전자 소자들을 연결하는 부분으로, 'IC영역' 이라고 부름. 녹색의 세로 5칸은 회로에서의 한 노드임

출처 : https://m.blog.naver.com/codingbird/221743000332

 

우리가 현재 사용하는 칩의 형태

- 테스터기로 쇼트 테스트 하는 법

  • Ex) 테스터기의 프로브 하나를 3번 외부 핀(VBAT)에 꽂고, 반대편 프로브를 외부 17번 핀에 연결
  • 쇼트 테스트를 했을 때 -삐 소리가 나면 회로도 대로 연결이 되어있음을 확인 가능 (두 핀 사이에는 저항이 없다)

PB15(28번 핀)는 17번의 외부 핀에 연결되어 있다

 

- 회로도 보는 법

FND Module의 회로도와 실물

  1. VCC : 전원에 연결. 3V3부분과 연결되어야 함
  2. SCLK : PB15와 연결
  3. RCLK : PB13과 연결
  4. DIO : PB14와 연결
  5. GND : 1번 핀(GND)와 연결

위와 같은 방식으로 회로도를 실물과 비교해가며 각 핀을 어디에 연결해야 하는지 알 수 있음

 

 

 

 

 

 

 


위 내용의 모든 출처는 유튜버 '[오제이 튜브]OJ Tube' 님께 있습니다.

https://www.youtube.com/watch?v=1YpiCnHQb3k&t=2259s