본문 바로가기

임베디드 개발/STM32 (ARM Cortex-M)91

STM32 ] UDP Server, lwIP Raw API 출처 : https://controllerstech.com/stm32-ethenret-2-udp-server/ 위 헤더파일과 소스파일을 추가하고 while 문 전에 udpServer_init(); 함수를 추가한다. 그밖에는 이전과 설정이 똑같다. /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "udpServerRAW.h" /* USER CODE END Includes */ //... /* USER CODE BEGIN PV */ extern struct netif gnetif; /* USER CODE END PV */ //... int m.. 2022. 9. 25.
STM32 ] LwIP 사용 초기설정 후 핑테스트 사용 보드 : STM32F429ZI 환경 : STM32CubeIDE 1.10.1 STM32Cube FW_F4 V1.27.1 without RTOS 먼저 클락 설정 ETH 설정 RMII 방식을 선택해준다. 이는 스키매틱을 보면 Nucleo-144 보드에는 LAN8742 라는 PHY 칩이 내장되어 있는데 이미 RMII 회로로 구성되어 있기 때문이다. Ethernet MAC 주소가 보이는데 앞의 3 byte는 생산자 코드이고 뒤의 3 byte는 시리얼 넘버이다. 디폴트로 내장된 PHY 칩을 사용할거기 때문에 Advanced Parameters 에도 건들 것이 없다. 다만 GPIO 핀 설정은 위의 스키매틱을 보면서 제대로 설정되었는지 확인해 줄 필요가 있다. 다음 Middleware에서 LwIP를 Enable .. 2022. 9. 24.
STM32 + MFC ] 델타 로봇 티칭 시스템 구현, 파일입출력 기능 사용 티칭 데이터 관리, 쓰레드 활용 반복작업 수행 로봇의 티칭 방법 로봇에게 가르칠 수 있는 행동의 종류는 MOVE, WAIT, PUMP 세가지가 있고 각각 속성값을 지정할 수 있다. 1. MOVE : TORQUE OFF 버튼을 누른 뒤 사람 손으로 원하는 위치로 엔드 이펙터를 이동시킨 후에 READ 버튼을 클릭하면 현재 좌표값이 입력된다. 물론 좌표값을 직접 입력하는 것도 가능하다. 2. WAIT : 직전행동 후 대기시간을 설정한다. ms 단위로 0-5000 사이의 값을 입력할 수 있다. 3. PUMP : ON 또는 OFF를 선택한다. 원하는 행동의 라디오버튼을 클릭하고 속성값이 지정되었으면 ">" 버튼을 눌러 해당 행동을 기억시킬 수 있다. 기억된 행동은 순서대로 번호가 부여되며 중간에 행동을 끼워넣거나 "" 버튼 눌렀을 때의 이벤트 처리 함수 vo.. 2022. 9. 19.
STM32 + MFC ] 델타 로봇, RTOS 구조 변경 + 슬라이더 컨트롤을 통한 좌표 이동 제어 먼저 STM32 부분 구조를 좀 바꿨다. Task 는 다음의 3개로 구성된다. 1. 각 조인트에 달린 모터의 각도를 읽고 정기구학을 통해 엔드이펙터의 좌표를 UART로 송신하는 Task (수행 중엔 다른 Task 보다 Priority 가 높을 필요가 있다) 2. 엔드이펙터의 좌표를 변경하라는 command 가 들어왔을 때 역기구학을 통해 모터의 각도를 제어하는 Task 3. UART 수신으로 command 가 들어오면 처리하는 Task 이렇게 3개가 있다. Queue는 엔드이펙터 좌표값을 넣는 SetQueue와 커맨드 문자열(cahr 배열 20byte)을 담든 cmdQueue가 있다. Semaphores는 1번 Task에 보내는 신호로 ReadPosSem을 하나 놔두고 다 지웠다. UART3 인터럽트 콜.. 2022. 9. 14.
STM32 ] 델타로봇, UART로 Command Line Interface 구현 + 기판에 다시 납땜 (5) 2022.08.25 - [프로그래밍/C] - C ] 명령 프롬프트 구현 (함수포인터 사용) C ] 명령 프롬프트 구현 (함수포인터 사용) #include #include /* for strcmp() strlen*/ //#include /* for usleep() */ #include #include #define MAX_CMD_NUM 10 #define BUF_LEN 128 int cmd_continue = 0; typedef int cmd_func(int argc, char* argv[.. eteo.tistory.com 이전에 콘솔에서 구현했었던 명령 프롬프트를 가져와 STM32에서 UART로 Command Line Interface를 구현하고 간단하게 델타로봇을 제어해봤다. cli.h /* * cli.. 2022. 9. 4.
STM32 ] 델타로봇과 MFC 연동 + 컨베이어 벨트 추가 (4) 컨베이어 벨트 추가 컨베이어 벨트에 달린 모터는 델타 로봇에 쓰인 것과 동일한 모델인 AX-12A 모터이다. Daisy Chain으로 연결하고 ID를 3으로 지정하고, Baudrate를 115200으로 맞춰줬다. 처음엔 모터 혼이 저 큰 구멍에 위치하게 배치되어 있었는데 테스트 구동을 해보니 장력 부족으로 벨트가 잘 돌아가지 않는 것 같아 뒤로 당겨서 배치해주었다. #define AX_CONVEYOR_ID3 dxl_control.c void setEndless(uint8_t ID, uint8_t State) { if ( State ) { uint8_t length = 9; uint8_t packet[length]; packet[0] = AX_HEADER; packet[1] = AX_HEADER; pack.. 2022. 8. 28.
STM32 ] USB CDC (Virtual Port Com) 사용하기 Clock Configuration USB 클럭이 PLL에서 나오는 48MHz로 설정되어 있어야 한다. Activate Clock Source Ethernet Disable USB_OTG_FS 설정. Device_only 모드로 Middleware - USB_DEVICE 에서 Class For FS IP 를 CDC (Communication Device 클래스)로 설정 Generation Code를 하면 프로젝트 안에 아래와 같이 폴더가 추가된 것을 볼 수 있다. 그 중에서도 usb 송수신 관련된 함수들은 usbd_cdc_if.c 파일 안에 있다. 소스코드 /* USER CODE BEGIN 0 */ #define BUF_SIZE 30 uint8_t usb_buf[BUF_SIZE]; uint32_t cou.. 2022. 8. 26.
STM32 ] 역기구학(Inverse kinematics)을 통한 델타로봇 제어 (3) 로봇은 관절(Joint)에 붙어있는 모터로 조인트 각도를 제어하여 움직인다. 그리고 실제 그리퍼가 붙어 주어진 작업을 수행하는 말단 장치(End Effector)의 위치는 조인트 각도로부터 결정된다. 조인트 각도와 엔드 이펙터의 위치, 이 둘 사이를 변환하는 계산 과정을 기구학 이라고 한다. 이 중 정기구학(Forward Kinematics)은 일련의 조인트 각도가 주어졌을 때 엔드 이펙터의 직교좌표상 위치를 구하는 과정이고 역기구학(Inverse Kinematics)은 엔드 이펙터의 직교좌표상 위치에 대응하는 조인트 각도를 구하는 과정이다. https://www.marginallyclever.com/other/samples/fk-ik-test.html Delta Robot Forward/Inverse .. 2022. 8. 22.
STM32 ] UART DMA, IDLE Line Interrupt 를 통한 데이터 수신 (Ring Buffer) 코드 출처 : https://controllerstech.com/uart-dma-with-idle-line-detection/ 이전에 UART로 원하는 형식의 데이터를 수신할 때는 패킷의 종료를 뜻하는 특정 문자를 끝에 넣거나 개행 문자를 넣어서 인터럽트 안에서 버퍼에 복사해 처리해야했는데 이 때는 수신될 데이터의 길이 또는 범위를 미리 알고 있어야 했다. 다음은 UART가 IDLE Line을 감지하고 발생시키는 Interrupt를 활용하여 사전에 길이를 알 수 없는 데이터를 효과적으로 수신하는 방법이다. CubeMX 설정 파라미터 세팅은 그대로 두고 DMA 세팅으로 가서 RX Request를 추가한다. Mode는 Normal으로 한다. Direction은 Peripheral To Memory 이고 By.. 2022. 8. 18.
STM32 ] Dynamixel AX-12 사용 - 델타로봇 제어하기 (2) 내가 프로젝트에서 사용하는 델타 로봇은 산업에서 많이쓰이는 병렬 로봇이며 3축 DOF (Degree of Freedom) 를 갖는다. 참고. 직렬로봇 : 1개의 직렬체인(다리)으로 구성되고, 모든 조인트에 구동기가 장착된다. 병렬로봇 : 엔드이펙터가 적어도 2개 이상의 다리에 의하여 지지되고, 각 다리당 1~2개의 구동기가 고정부 근처에 장착되며 나머지 조인트는 수동조인트로 구성된다. 일단 FreeRTOS를 사용했는데 현재는 하나의 Task만 쓰고 있다. Motor Init() 시점에서 속도를 미리 설정해서 지난번보다 부드럽게 움직이게끔 했고, UART Receive 인터럽트에서 세마포어 시그널을 보내서 시리얼 터미널로 PC에서 제어가 가능하게 끔 해놨다. 구현해놓은 커맨드는 우선 End Effector.. 2022. 8. 11.
STM32 ] Dynamixel AX-12A 모터 제어하기 (1) 다음 진행할 개인 프로젝트인 델타로봇의 제어를 위해 먼저 AX-12A 모터에 대해 파봤다. 다이나믹셀은 모터, 제어기, 드라이버, 센서, 감속기 밑 네트워크 기능을 하나의 모듈로 만든 로봇 전용 액추에이터로, 이전에 STM32보드로 모터를 다뤄본 적이 있지만 PWM 제어하던 그것과는 제어방식이 아주 많이 다르다. 스펙 핀맵 특이점은 여러 다이나믹셀 모터를 Daisy Chain 방식으로 연결해 하나의 버스에 패킷을 전송하면, 고유의 ID를 가지고 있는 각각의 모터들을 제어할 수 있다. 브로드캐스트 ID를 사용해 버스에 연결된 모터를 한번에 제어할 수도 있다. 그리고 위의 스펙을 보면 모터의 통신방식이 TTL레벨 Half Duplex 시리얼 통신인데 MCU의 RX, TX선과 연결하려면 아래와 같은 통신회로가.. 2022. 8. 11.
STM32 ] FreeRTOS + Semaphore ISR 사용 예제 추가설명 되지 않은 기타 설정은 이전 글과 동일하다. 2022.08.08 - [MCU/STM32 (ARM Cortex-M)] - STM32 ] FreeRTOS 사용해보기 STM32 ] FreeRTOS 사용해보기 정의 RTOS는 실시간 시스템을 위해 개발된 운영체제로, 멀티태스킹 환경에서 Task 처리시간을 일관되게 유지하기 위한 용도로 사용한다. RTOS는 시분할 시스템 하에서 우선순위 기반 스케줄링을 통 eteo.tistory.com 예제 코드 출처 : https://m.blog.naver.com/eziya76/220951244572 Mutex는 ISR(Interrupt Service Routine)에서 신호를 보내는게 불가능한데 세마포어는 ISR에서 신호를 보낼 수 있다. Task 중 세마포어를 대기.. 2022. 8. 8.
STM32 ] FreeRTOS 사용해보기 정의 RTOS는 실시간 시스템을 위해 개발된 운영체제로, 멀티태스킹 환경에서 Task 처리시간을 일관되게 유지하기 위한 용도로 사용한다. RTOS는 시분할 시스템 하에서 우선순위 기반 스케줄링을 통해 우선순위가 높은 task가 먼저 작업을 처리할 수 있게 함으로써 구현한다. 참고. 스케줄링 : 프로세스들에게 CPU 등 자원을 배정하는 것을 말함. 설정 Interface는 CMSIS_V2로 선택한다. CMSIS는 Cortex Microcontroller Software Interface Standard의 약자로 ARM Cortex 시리즈끼리의 호환성 및 이식성 증대를 위해 ARM사에서 정한 소프트웨어를 말한다. 그리고 CMSIS_RTOS 는 ARM사에서 RTOS의 API를 추상화해서 RTOS의 종류가 달라.. 2022. 8. 8.
STM32 ] Timer Input Capture 사용하여 PWM 신호 캡쳐하기 먼저 클락 설정 PWM 파형을 만들어 내기 위한 TIM1 설정 TIM1은 APB2에서 클락소스를 공급받는다. PSC와 ARR의 값을 위와 같이 설정해서 Frequency 를 50Hz로 맞춰줬다. 펄스폭은 소스코드 상에서 수정할거라 안건드렸다. 인풋캡처를 위한 TIM2 설정 TIM2은 APB1에서 클락소스를 공급받는다. PSC를 90-1로 해서 1us 업카운터로 설정한다. 인풋캡처 채널은 하나는 Rising Edge 하나는 Falling Edge로 설정한다. TIM2의 인터럽트 켜기 소스코드 /* USER CODE BEGIN PV */ int __io_putchar(int ch){ HAL_UART_Transmit(&huart3, &ch, 1, 1000); return ch; } /* USER CODE EN.. 2022. 7. 25.
STM32 ] 자율주행 코드 짜기 - 프로젝트 준비과정 (6) 먼저 GPS모듈을 통해 자동차의 위도, 경도를 확인하였고, 어플과의 블루투스 통신을 통해 사용자가 찍은 Waypoint(목적지)의 위도, 경도까지 확인할 수 있었다. 그리고 Waypoint의 위치에서 자동차의 위치를 빼주면 두 포인트 사이의 위도차, 경도차를 알 수 있고 직선거리로의 차이 c는 피타고라스의 정리에 의해 구할 수 있다. 다만 이건 평면 위에서의 거리이고 구 위에서의 거리는 하버사인공식(Haversine Formular)로 구할 수 있는데 어차피 우리는 블루투스 모듈의 통신거리 한계로 테스트 환경이 좁은 지역 안에서 해야하기 때문에 그냥 피타고라스의 정리를 사용하기로 하였다. 다음은 방위각. 지자기센서를 통해 자동차의 방위각은 알아낼 수 있다. Waypoint의 방위각이 문제인데 문과생으로서.. 2022. 7. 25.
STM32 ] SPI 통신 사용하기 SPI : Serial Peripheral Interface 동기식, 전이중 통신이며 마스터와 슬레이브 모드로 동작한다. 최대 클럭이 제한되어 있지 않아 속도 제한이 없어 I2C보다 훨씬 빠르다. 기본은 SCLK, MOSI, MISO, CS 4개의 선이 필요한데 많은 베리에이션이 있다. 1:1 통신시 SCLK (Serial Clock) : 마스터가 출력하는 동기용 Clock 라인 MOSI (Master Output Slave Input) : 마스터 출력, 슬레이브 입력. SDI 로도 표기 된다. MISO (Master Input Slave Output) : 슬레이브 출력, 마스터 입력. SDO 로도 표기 된다. CS (Chip Select) : 마스터가 어떤 슬레이브와 통신할 지 선택할 때 사용하는 선... 2022. 7. 24.
STM32 ] TIMER OC (Output Compare 단자 출력) 사용 예제 OC : 출력비교 모드는 카운터(CNT)의 값이 캡쳐/비교기에 설정된 (CCRx)값과 일치할 때 인터럽트 또는 해당 핀에 출력을 발생시키는 모드이다. 이전에 이어서 타이머 OC 모드에서 핀의 출력을 사용하는 버전이다. 핀 출력을 쓰는 모드로 설정했기 때문에 핀이 잡힌다. PSC를 9000-1로 해서 10KHz로 분주하고 ARR은 16비트 카운터 타이머의 최대값인 0xffff-1로 한다. 이렇게 하면 업데이트 인터럽트가 6.5535초 마다 발생할 거다 하지만 업데이트 인터럽트는 안쓴다. 모든채널을 OC 인터럽트 발생시 출력이 토글되게끔 설정하고 CCR값은 위와 같이 설정한다. 소스코드 /* USER CODE BEGIN 2 */ HAL_TIM_OC_Start_IT(&htim3, TIM_CHANNEL_1); .. 2022. 7. 21.
STM32 ] TIMER OC (Output Compare No Output) 사용 예제 OC : 출력비교 모드는 카운터(CNT)의 값이 캡쳐/비교기에 설정된 (CCRx)값과 일치할 때 인터럽트 또는 해당 핀에 출력을 발생시키는 모드이다. TIM4 의 업 카운터와 OC(출력비교) 모드를 이용하여 LED On/Off 하는 예제 1. 타이머의 Frequency를 1Hz로 맞춰서 업데이트 인터럽트를 발생 시 HAL_TIM_PeriodElapsedCallback 에서 LED를 On 시킴 2. OC 모드에서 CCR값과 CNT의 값이 일치할 때 출력비교 인터럽트(CCxI)가 발생하고 HAL_TIM_OC_DelayElapsedCallback 함수에서 LED를 Off 시킴 3. 스위치 1~4 의 EXTI 인터럽트 발생시 HAL_GPIO_EXTI_Callback 함수에서 CCR값을 변경시킴 호환보드에 대한 .. 2022. 7. 21.
STM32 ] 어플과 STM32간 블루투스 통신을 통한 데이터 송수신 - 프로젝트 준비과정 (5) 어플 화면 SCAN 버튼을 눌러 블루투스 페어링 합니다. Control을 누르면 아래 버튼을 사용해 수동제어를 할 수 있고, Waypoint 버튼을 누른 뒤 어플 지도상의 파란색 마커(Waypoint)를 찍으면 해당 위치로 자율주행을 시작합니다. bluetooth.c 중 일부 void BT_Init() { HAL_UART_Receive_IT(&huart7, &rx7_data, sizeof(rx7_data)); } void transmit_To_Phone(){ char buf[GPSBUFSIZE] = {0,}; sprintf(buf, "A,%.13f\n\r", GPS.dec_latitude); //HAL_UART_Transmit(&huart3, (unsigned char *)buf, strlen(buf),.. 2022. 7. 19.
STM32 ] BLDC 모터 제어 - 프로젝트 준비과정 (4) BLDC 모터 제어와 앱인벤터를 통한 앱개발은 팀 동료가 담당한 분야이긴 하나 프로젝트 전체 이해도 향상을 위해 개인적으로 정리한 내용과 동료의 자료를 첨부합니다. DC모터 Brushed DC 모터는 2개의 전선으로만 구성되어 있으며 전동기를 구동시키기 위한 드라이버의 설계 및 제어가 용이하다는 장점이 있지만, Brush의 접촉을 통해서 회전에 따라 전기자 전류의 극성이 바뀌게 되므로, 기계적 소음과 전기적 잡음이 심하며 내구성이 떨어진다. 반면, BLDC 모터는 Brush가 제거된 형태로, 3상 모터의 6단계 정류(모터 위상의 전류를 전환하여 동작을 생성하는 공정) 패턴을 생성하기 위해 3개의 전선이 필요하며, 모터 컨트롤러가 사용된다. 이러한 6단계 정류 위상이 전자기장을 움직이면 영구 자석(회전자).. 2022. 7. 19.
STM32 ] 초음파 센서로 거리재기 Timer Input Capture 사용 + 노이즈 (튀는 값) 제거 참고 사이트 : https://controllerstech.com/hcsr04-ultrasonic-sensor-and-stm32/ 참고 유튜브 : https://www.youtube.com/watch?v=ti_1ZwRolU4 배선 HC-SR04 VCC 5V GND GND Trig PA5 (GPIO Output) Echo PA6 (TIM3 CH1 Input Capture) Cube MX 설정 TIM3은 APB1 클락소스(90MHz)를 공급받는다. 그리고 Prescaler 값을 90-1 로 해주면 1us(마이크로초) 마다 CNT가 오른다. 그리고 TIM3은 16비트 카운터라서 ARR은 최대값인 0xffff-1로 해준다. + UART3 설정도 켠다 소스코드 /* USER CODE BEGIN PD */ #def.. 2022. 7. 18.
STM32 ] DAC 제어 (오실로스코프로 파형 확인) DAC : Digital to Analog Converter 디지털 신호를 아날로그 전압 신호로 변환하여 출력하는 장치를 말한다. STM32F429 보드는 2채널의 12비트 DAC 컨버터가 있고 DAC CHANNEL_1의 출력핀은 PA4 (DAC_OUT1) DAC CHANNEL_2의 출력핀은 PA5 (DAC_OUT2) 으로 정해져있다. 1.8v ~Vdda(3.3V) 사이의 별도의 Vref+ 기준전압을 따로 사용할 수도 있고 타이머의 TRGO (트리거 아웃풋)을 사용하는 것도 가능하다. DHR에 로드된 데이터는 ABP1 1클럭 사이클 후 DOR 레지스터로 전송되고 데이터가 DOR 레지스터에 로드되면 DAC변환이 시작되어, t(SETTING) 시간 후 DAC_OUT pin을 통해 아날로그 값이 출력된다. D.. 2022. 7. 18.
STM32 ] ADC + MFC + MySQL, 시리얼 통신 및 DB연동, 검색기능, 실시간 그래프 구현 (쓰레드 사용) 깃허브 주소 : https://github.com/joeteo/MfcDbAdc GitHub - joeteo/MfcDbAdc Contribute to joeteo/MfcDbAdc development by creating an account on GitHub. github.com https://github.com/joeteo/AdcMfcDb.git GitHub - joeteo/AdcMfcDb Contribute to joeteo/AdcMfcDb development by creating an account on GitHub. github.com 핀설정 가변저항의 VCC, GND는 보드의 +3.3v, GND 에 연결 OUT핀은 아래 ADC 핀에 연결 ADC 설정. DMA 모드를 사용하였다. STM32 whi.. 2022. 7. 17.
STM32 ] SysTick Timer Callback 함수 사용하기 이전에 분명 정리한 거 같은데 기록이 없어서 정리용도로 빠르게 테스트해봄 HAL_GetTick 함수를 따라가 보면 uwTick을 리턴하는 것으로 되어있다. 이 uwTick이 SysTick 타이머 클락 소스로 1밀리초마다 카운트되고 HAL_Delay 함수도 이 uwTick을 사용하고 있다. Drivers - STM32F4xx_HAL_Driver - Src - stm32f4xx_hal_cortex.c 파일에 가면 아래와 같이 있다. 그중에 HAL_SYSTICK_IRQHandler() 함수를 가져와 stm32f4xx_it.c 에 있는 SysTick_Handler() 함수 안에 넣는다. 그리고 아까 IRQHandler() 함수 바로 아래 있던 HAL_SYSTICK_Callback 함수를 가져와 전역구간에서 재정.. 2022. 7. 14.
STM32 ] 소프트웨어적으로 Chattering 채터링현상 Debounce 디바운스하기 채터링이란 스위치의 접점이 닫히거나 열리는 순간 기계적인 진동에 의해 매우 짧은 시간 안에 스위치가 붙었다 떨어지는 것을 반복하는 현상으로 Bounce 라고도 한다. 디바운스는 채터링 현상을 억제하는 해결법을 말한다. 커패시터를 추가하는 등 하드웨어적인 방법이 있고 소프트웨어적으로 해결하는 방법이 있다. 아래에선 소프트웨어적으로 해결하는방법을 소개한다. 버튼은 외부 풀다운저항을 달아놨고 EXTI Rising Edge에 트리거 되도록 했다. NVIC 설정도 켜고 각각 버튼이 눌렸을 때 LED가 토글되게 소스코드를 짰다. 디바운스 코드 추가하지 않았을 때 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin==GPIO_PIN_8){ HAL_GPIO_To.. 2022. 7. 13.
앱 인벤터 ] GPS 모듈, 지자기센서 디버깅용 간단 어플 만들기 - 프로젝트 준비과정 (3) 메카넘휠에 올라간 MCU와 통신하기 위한 어플의 블루투스 부분은 다른 팀원이 담당하고 센서의 정확도 확인용으로 개인적으로 간단히 만들어본 어플이다. 메뉴에서 연결 - AI 컴패니언을 통해 실시간으로 디버깅하며 어플을 만들 수 있다. 다 만들고 난 후 .apk 파일로 빌드한다. 스마트폰의 위치센서와 방향센서의 값을 확인한다. 방향센서의 값은 실시간으로 변하는데, 위도, 경도 값은 위성에서 받아오는거라 딜레이도 있고, 치명적으로 실외에서도 값이 계속 튀고 정확하지 않았다. 2022. 7. 6.
STM32 ] NEO-6M 모듈 사용 , GPS 데이터 파싱하는 법 - 프로젝트 준비과정 (1) NEO-6M, GPS 수신 모듈 GPS는 Global Positioning Sytem 의 약자로 미국이 개발 및 관리하는 위성항법 시스템이다. 그리고 GPS 수신 모듈은 지구 궤도를 돌고 있는 위성으로부터 나온 데이터의 분석을 통해 현재 위치의 위도, 경도, 시간 등을 시리얼 통신을 통해 받아 볼 수 있는 모듈이다. 여러 송출원에서 신호를 쏘고 이를 모듈에서 수신하여 자신의 현재 위치를 계산하여 알아내는데, 수신기의 위치를 특정하기 위해서는 최소 4개의 위성이 필요하다. 이 중 3개 이상의 위성이 정확한 시간과 변위를 측정한 뒤 삼각점의 위치를 구하는 삼변 측량기법으로 위치를 파악하고, 3개 위성이 각각 측정하는 세 개의 범위가 서로 교차되는 지점이 수신기의 위치가 된다. 나머지 1개의 위성은 시간 오차.. 2022. 7. 3.
STM32 ] 지자기 센서 HMC5883L 으로 방위각 측정하기 - 프로젝트 준비 과정 (2) HMC5883L 은 3축 마그네틱 감지센서 (Magnetometer) 로 나침반처럼 방위각을 알아낼 수 있어 Compass module 이라고 불린다. I2C 통신을 사용하여 데이터를 추출한다. 요즘에는 HMC5883L 모듈이 단종되어 QMC5883L 이라는 칩이 유통되고 있는데 QMC5883L 모듈은 I2C slave address 와 register address 가 달라서 다른 라이브러리를 써야 한다. 나는 HMC5883L 모듈을 사용하였다. Specification Datasheet 참고. 지자기장(Magnetic field of the Earth) 은 지구의 내부로부터 태양풍과 만나는 곳까지 뻗어있는 자기장인데, 태양풍은 태양으로부터 방사되는 하전입자들의 흐름이다. 지구 표면에서의 규모 범위는 .. 2022. 7. 2.
STM32 ] 힙 heap , 스택 Stack 메모리 사이즈 설정하는 법 MX툴에서 Project Manager - Project - Linker Settting 에서 설정할수 있다. byte 단위로 디폴트 값은 아래와 같다. Heap Size 512 byte Stack Size 1,024 byte Build Analyzer 를 통해 램 사용량은 확인하고 필요에 따라 조정해 주면 된다. 저 값을 조정하고 Code generate를 하면 STM32F429ZITX_FLASH.ld 파일의 아래 부분이 수정된다. 다만 여기서 수정하는 것은 Minimum Heap Size, Minimum Stack Size일 뿐이며 Heap과 Stack의 고정된 크기를 의미하지는 않는다. 알다시피 Heap은 램에서 .data와 .bss 영역 뒤에서부터 시작해 사용되면 위로 쌓이고 Stack은 램의 끝.. 2022. 6. 30.
STM32 ] 메모리 영역 구분 ( Code, Data, BSS, Heap, Stack ) 구분 내용 저장위치 사용 code = text 함수, 제어문, 상수 등 ROM 컴파일 시 크기가 결정되고 이후 변하지 않음 data 초기값이 있는 전역변수, 정적변수 ROM bss 초기값이 없는 전역변수, 정적변수 (0으로 초기화) RAM heap 동적할당된 지역변수 RAM 런타임에 사용되고 heap은 낮은주소에서 높은주소로 데이터가 쌓이고, stack은 높은주소에서 낮은주소로 데이터가 쌓인다. stack 정적할당된 지역변수 RAM 정적할당된 지역변수는 메모리의 Stack Segment에 저장되며 선언된 함수가 종료되면 메모리에서 사라진다. 그리고 초기화된 전역변수와 정적변수는 Data Segment에 저장되는데 Data Segment는 ROM(Read Only Memory)에 있어서 한번 선언되면 값을.. 2022. 6. 30.