본문 바로가기

임베디드 개발304

STM32 ] 28BYJ-48 스텝모터 제어하기 사진과 같은 스텝모터를 구입하면 보면 ULN2003 IC칩과 같이 온다. MCU가 모터에 충분한 전류를 제공하지 못하기 때문에 모터를 작동시키기 위해 이런 모터 드라이버가 필요하다. 스텝모터의 기본적인 구동원리는 고정자 각 극에 교대로 전류를 흘려 회전자를 회전하는 방법이다. 스펙 감속비는 1/64 이고 스텝당 각도가 5.625°/64=0.087890625° 이다. 즉, 이 모터를 한바퀴 돌리기 위해(하프스텝모드 기준) 4096(=64*64) 스텝이 필요하다. 0.087890625° * 64 * 64 = 360° 풀 스텝모드 기준으로는 1회전을 위해 2048 스텝이 필요하고 스텝당 각도는 0.17578125°이다. 스텝모터의 구동방식 Wave Drive Full Drive Half Drive Wave D.. 2022. 12. 4.
TMS320F28388D ] Watchdog Timer 사용하기 Watchdog Timer 는 그 단어에서 유추할 수 있는 그대로 CPU를 감시하면서 시간을 계수하는 회로로, 프로그램이 의도치 않게 비정상적으로 중단되거나 무한루프(Infinite Loop)에 빠지는 등 시스템 통제가 불가능한 상황에서 자동으로 시스템을 리셋하는 하드웨어 기능이다. 내부에 있는 8비트 Watchdog 업 카운터가 최대 값인 0xFF을 넘어 overflow 되면 리셋(또는 인터럽트)이 일어나는데 Watchdog Timer에 의한 CPU리셋을 원하지 않는다면 타이머의 카운터가 최대 값에 도달하기 전에 카운터 값을 0으로 초기화(Clear)하는 코드가 실행되어야 한다. 즉, 칩이 실행하는 프로그램이 안정적이고 연속적으로 동작하려면, 프로그램 상에서 Watchdog Timer에 설정된 시간주기.. 2022. 12. 3.
ELF 파일 포맷 ELF 포맷의 Section 구성 ​ ​ ​ ​ ​ 1. Text Segment(=Code Segment) ELF Header : Zero Offset에서 시작하며 파일에 대한 정보를 포함한다. .init : 프로그램 진입 포인트(Entry Point) 실행 이전에 먼저 실행되는 코드가 있는 섹션. main 함수 이전에 프로세스 초기화를 진행하는 코드가 있는 공간이다. .text : 기계어로 변환된 프로그램 코드가 존재하는 공간이다. .rodata : Read-Only 데이터를 의미하며, const, printf, switch case 문에 의한 Jump Table 등이 존재한다. 2. Data Segment .data : 초기값이 있는 전역변수와 static 변수들이 있는 공간이다. .bss : 초기값.. 2022. 12. 2.
심볼 SYMBOL Linker가 알아볼 수 있는 기본 단위이며 Link를 한 후에는 자신만의 주소를 갖게 되는 특별한 단위 Symbol의 이름은 그 Symbol이 갖는 메모리 영역의 시작 주소를 가리키는 Linker만의 pointer같은 존재 Debugging시 Symbol의 이름이 사용됨 Linker만이 이 Symbol을 참조하며, Linker가 Symbol들을 주소로 모두 변환해서 binary로 만듬 (실제로 메모리에 적재되는 것은 아님) 출처 : http://recipes.egloos.com/5009181 2022. 12. 2.
오브젝트 파일 .o .obj 오브젝트 파일(Object File) 어셈블러를 통해 변환된 어셈블리 코드는 이제 더 이상 사람이 알아볼 수 없는 기계어로 변환되는데 이를 오브젝트 코드(목적코드)라 부르고, 오브젝트 코드로 구성된 파일을 오브젝트 파일(Object File)이라 부른다. 이 오브젝트 파일은 특정한 파일 포맷을 가진다. (Windows의 경우 PE(Portable Executable), Linux의 경우 ELF(Executable and Linking Format)) 오브젝트 파일 포맷 Object File Header : 오브젝트 파일의 기초 정보를 가지고 있는 헤더 Text Section : 기계어로 변환된 코드가 들어 있는 부분 Data Section : 데이터(전역 변수, 정적 변수)가 들어 있는 부분 Symbol.. 2022. 12. 2.
컴파일 과정 컴파일 과정 1. Pre-processing 2. Compile 3. Assemble 4. Link 1. Pre-processing 전처리기(Preprocessor)를 통해 소스 코드 파일(*.c)을 전처리된 소스 코드 파일(*.i)로 변환하는 과정 주석 제거 : 소스 코드에서 주석을 전부 제거한다. 헤더 파일 삽입 : #include 지시문을 만나면 해당하는 헤더 파일을 찾아 헤더 파일에 있는 모든 내용을 복사해서 소스 코드에 삽입한다. 즉, 헤더 파일은 컴파일에 사용되지 않고 소스 코드 파일 내에 전부 복사된다. 헤더 파일에 선언된 함수 원형은 후에 링킹 과정을 통해 실제로 함수가 정의되어 있는 오브젝트 파일(컴파일된 소스 코드 파일)과 결합한다. 매크로 치환 및 적용 : #define 지시문에 정의.. 2022. 12. 2.
STM32 ] HAL_GetTick() 오버플로우에 대한 의문 Non Blocking 코드를 작성할 때 아래와 같은 구문을 많이 작성한다. 100ms 간격으로 무언가 실행하는 코드이다. 이때 의문이 들 수 있다. 오버플로우가되면 어떡하지, 그래도 100ms 간격으로 실행될까? uint32_t start_tick= HAL_GetTick(); while (1) { if (HAL_GetTick() - start_tick >= 100) { start_tick = HAL_GetTick(); // do something } } 결론은 그렇다이다. 다음의 쉬운 예제를 보자. start_tick(b)이 255이고 current_tick(a)이 오버플로우가 되서 0이 되었다면 차이(c)는 1이어야 맞을 것이다. uint8_t a, b, c; a = 0; b = 255; c = a .. 2022. 12. 2.
TMS320F28388D ] FLASH Build 와 RAM Build 같이 사용하는 .cmd 파일 만들기 메모리 맵을 보며 .cmd 파일을 재작성하였다. 지금보니 CLA 또는 DMA Access가 되는 램 블록이 있고 안되는 블록이 있네. 그래서 만약 DMA를 사용한다면 buffer를 GSRAM에 배치한다고 #pragma 를 통해 지시해주어야 한다. // Place buffers in GSRAM #pragma DATA_SECTION(sData, "ramgs0"); #pragma DATA_SECTION(rData, "ramgs1"); 아무튼.. 램빌드와 플래시빌드 시 실행구문은 #if defined(_FLASH)를 통해 구분해 두었고, 메모리 정의 부분에는 블록/섹터 별로 나누어져 있는게 보기 어지러워서 합쳐서 정의하였다. 물론 메모리 정의 부분에서 이렇게 합치지 않아도, 섹션 배치 부분에서 꺽쇠와 OR 연산.. 2022. 12. 1.
CCS ] 링커 커맨드(.cmd) 파일에 ALIGN(x) directive를 넣는 이유 Why do you use align directive (ALIGN(x)) in the linker cmd files provided in the C2000Ware examples? Answer. Fapi_AutoEccGeneration mode (one of the Flash API programming modes) programs the supplied data portion in Flash along with automatically generated ECC. The ECC is calculated for 64-bit aligned address and the corresponding 64-bit data. Any data not supplied (within a given 64-bit aligne.. 2022. 12. 1.
RS232 등 시리얼 케이블 고장 유무 확인법 사진은 ttl to USB 모듈이긴 하나 사진과 같이 rx, tx 를 쇼트시켜 물리적으로 루프백 환경을 만들고 테스트를 한다. 전압레벨이나 baudrate를 신경쓸 필요는 없다. 시리얼 터미널에서 타이핑(tx)을했을 때 글자가 출력(rx)되야 정상이다. 2022. 12. 1.
EABI 먼저 ABI란 응용 프로그램 이진 인터페이스(Application Binary Interface, ABI)의 약자로 응용 프로그램과 운영 체제 또는 응용 프로그램과 해당 라이브러리 그리고 응용 프로그램의 구성요소 간에서 사용되는 낮은 수준의 인터페이스이다. API가 소스 코드에서 사용된다면 ABI는 바이너리에서 호환이 가능하다는 점이 다르다. 그리고 EABI(임베디드 응용 프로그램 이진 인터페이스, Embedded-Application Binary Interface)는 임베디드 소프트웨어 프로그램을 수행하는 파일 형식, 자료형, 레지스터 사용, 스택 프레임 조직, 명령 변수를 위한 표준 변환을 정의하고 있다. EABI를 지원하는 컴파일러는 이를 지원하는 또 다른 컴파일러가 만든 코드와 호환되는 목적 코드.. 2022. 11. 30.
TMS320F28388D ] printf 사용하기 위한 설정 c표준 입출력함수 전부 해당한다. 먼저 stdio.h 를 include 하고 project properties - Build - Linker - Basic Option 에 가서 Heap size를 늘린다. Heap Size가 공백인 경우 default 값은 0x400 이다. Stack size 도 늘린 후 cmd 파일에 가서 메모리맵을 보며 .stack 과 .sysmem(=.heap)을 적절히 할당한다. Compiler - Advanced Options - Language Options 에 가서 --printf_support를 체크한다. 기존에 설정 됐더라도 다시 눌러줘야 summary of flags set 에 뜨는 것 같다. --printf_support의 옵션인 minimal/full/nofloat.. 2022. 11. 30.
CCS, Code Composer Studio ] 재사용 용이한 Portable Project 만들기 (device_support 와 driverlib 모두 사용) STM32CubeIDE 와 달리 CCS를 사용해보니 프로젝트 하나 생성해 쓰는 것도 쉽지가 않다. 예제 프로젝트에서 변경과 추가를 시작하는게 쉽기는 하지만 그렇게만 하다보면 프로젝트가 어떻게 구성되어 있는지도 모르고 사용을 하게 된다. 다음의 세가지로 나누어 설명할텐데 개인적으로 초보인 입장에서 라이브러리를 포함시키고 폴더나 파일을 링크해서 사용하는 것보다는 프로젝트 안에 복사해서 쓰는 것을 선호한다. (나중에 안쓰는 파일은 삭제해 코드크기를 줄이면 된다.) 1. driverlib 사용 프로젝트 2. device_support 사용 프로젝트 3. driverlib 와 device_support 모두 사용하는 프로젝트 공통과정 1. File - New - CCS Project 2. Target에서 MCU를.. 2022. 11. 27.
TMS320F28388D ] SD카드 읽기/쓰기 // FILE: sd_fat32.c // // TITLE: SD FATFS Library Example // //! \addtogroup driver_example_list //! SD FATFS Library Example //! //! This example demonstrates how to use the FATFS library. //! //! \b External \b Connections \n //! - Connect the SPI signals identifed in the SysConfig to an SD CARD. //! //! \b Watch \b Variables \n //! - None. //! // // Included Files // #include "driverlib.h" #i.. 2022. 11. 24.
DSP ] EALLOW / EDIS / DINT / EINT/ ERTM / DRTM / ESTOP0 MMR(Memory Mapped Register : Address를 부여받은 레지스터) 영역은 일반적으로 Protect가 걸려있다. 해당 protected 영역에 접근하려면 이 보호막을 제거했다가 다시 걸어줘야 하는데 그 때 쓰이는 명령어가 EALLOW와 EDIS 이다. 어셈블리 명령이기 때문에 원래는 asm("EALLOW"); asm("EDIS"); 라고 써야하지만 어딘가 다음과 같이 인라인으로 정의되어 있기 때문에 그냥 EALLOW, EDIS 라고 쓰면 된다. 이외에 다른 인라인 어셈블리 명령어들도 있다. #define EINT __asm(" clrc INTM")// 전역 인터럽트 on #define DINT __asm(" setc INTM") // 전역 인터럽트 off #define ERTM __a.. 2022. 11. 17.
CCS ] 코드 수행시간 계산하기 Perspective Debug view 상태에서 Run - Clock - Enable 클릭 그럼 CCS 하단에 시계모양 아이콘이 보인다. 수행시간을 계산할 코드 앞뒤로 중단점을 잡아준다. 첫번째 중단점에서 걸렸을 때 Run - Clock - Rest을 누른다. 혹은 Clock Setup 에서 Rest Option Auto를 선택해 줄 수도 있다. 다시 F8을 눌러 실행시키고 두번째 중단점에서 걸렸을 때 Clock Cycle을 알 수 있다. 이 값은 CPU의 동작 Cycle Count로 System Clock 이 200Mhz로 설정되어 있다면 (1/200,000,000)인 5ns * 1,871,256 해서 코드 수행시간은 9.3ms 정도로 측정된다. 간단히 측정하려면 이 방법을 쓰고 보통은 tick값을 .. 2022. 11. 16.
부팅 SD카드 포맷하기 1. diskpart 2. list disk 3. sel disk * 3. list part 4. clean 혹은 각각 파티션을 sel part * 후 delete partition override 5. create partition primary 6. list part 7. sel part 1 8. active 9. format fs=fat32 quick 파일시스템 지정해 빠른포맷 10. assign 드라이브 문자 할당 11. exit 2022. 11. 15.
STM32 ] lwIP 통계와 디버그 기능 활성화하기 (LWIP_STATS, LWIP_DEBUG) lwipopts.h 파일 수정 및 추가 /*----- Value in opt.h for LWIP_STATS: 1 -----*/ #define LWIP_STATS 1 //... /* USER CODE BEGIN 1 */ #define LWIP_DEBUG 1 #define NETIF_DEBUG LWIP_DBG_ON #define DHCP_DEBUG LWIP_DBG_ON #define UDP_DEBUG LWIP_DBG_ON #define MEMP_DEBUG LWIP_DBG_ON #define MEM_DEBUG LWIP_DBG_ON #define ICMP_DEBUG LWIP_DBG_ON /* USER CODE END 1 */ arch.h 파일에 다음과 같이 정의되어 있기 때문에 printf를 redirectio.. 2022. 11. 11.
LwIP 메모리 옵션 설정 lwIP stack 사용 시 메모리 옵션 설정이 매우 중요하며 lwipopts.h 에서 사용자가 재정의 할 수 있다. lwIP Wiki 에서 소개하는 메모리 관리 팁 https://lwip.fandom.com/wiki/Lwipopts.h#Memory_management_(RAM_usage) Lwipopts.h lwipopts.h is a user file that you can use to fully configure lwIP and all of its modules. You do not need to define every option that lwIP provides; if you do not define an option, a default value will be used. Therefore, y.. 2022. 11. 11.
CCS ] C2000ware 다른 버전 선택하기 공식 홈페이지에 원하는 버전 다운로드 후 설치 https://www.ti.com/tool/download/C2000WARE Window - Preferences CCS - Products - Refresh 누르고 추가를 원하는 버전 선택 후 Apply 적용할 프로젝트 오른쪽 클릭하고 Properties General - Products 탭 - C2000Ware 선택 - Edit 버전 바꾸고 Apply and close 혹은 굳이 다운을 받지 않더라도 import한 프로젝트가 예전 버전 C2000Ware를 사용하고 상위 버전이 내 PC에 깔려있으면 같은 방식으로 Compatiable 버전으로 선택이 가능하다. 2022. 10. 19.
부동소수점 표현 IEEE 754 부동소수점부동소수점(Floating point) 방식은 실수를 컴퓨터상에서 근사하여 표현할 때(원래 이진법으로는 십진법 소수를 정확하게 표현할 수 없다.) 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 것으로 유효숫자를 나타내는 가수와 소수점의 위치를 풀이하는 지수로 나누어 표현한다.컴퓨터에서는 고정소수점 방식보다 넓은 범위의 수를 나타낼 수 있지만 연산 속도고 비교적 느리기 때문에 별도의 전용 연산장치(FPU)를 두는 경우가 많다. 고정 소수점과 달리 정수 부분과 소수 부분의 자릿수가 일정하지 않으나 유효숫자의 자리수는 정해져 있다.  IEEE 754IEEE 754 는 컴퓨터에서 부동소수점을 표현하는 데 가장 널리 쓰이는 표준이다. IEEE 754의 부동 소수점 표현은 크게 세 부분.. 2022. 10. 13.
ADC (Analog-to-digital converter) https://microcontrollerslab.com/analog-to-digital-adc-converter-working/ 정의 표본화(Sampling) → 양자화(Quantization) → 부호화(Encoding) 총 3단계를 통해 아날로그(Analog) 신호를 디지털(Digital) 신호로 변환 (A/D 변환)하는 것. 즉 연속적인 analog 신호를 0과 1로 구성된 digital 신호로 변환하는 IC칩이다. 변환과정 1. 샘플링(Sampling) 시간축 방향에서 연속된 아날로그 신호의 진폭치를 일정 간격(샘플링 주기 Ts)으로 샘플을 추출하여 이산신호(discrete signal)로 변환시키는 과정 2. 양자화(Quantization) 샘플 추출한 연속적인 진폭의 신호를 특정 이산진폭값으.. 2022. 10. 12.
STM32 ] UDP Client, lwIP Raw API 2022.10.03 - [DSP, MCU/STM32 (ARM Cortex-M)] - STM32 ] TCP Client STM32 ] TCP ClientCubeMX 설정 클라이언트가 서버에게 1초마다 한번씩 데이터를 전송하게끔 하기 위해 TIM1을 쓸 예정이다. TIM1은 APB2에서 클락소스를 공급받는다. 아래 헤더파일과 소스파일을 포함한다. main.c /* Privaeteo.tistory.com이전 글과 CubeMx 설정은 같다.   아래 헤더파일과 소스파일을 포함시킨다.출처 : https://www.youtube.com/watch?v=Kc7OHc7JfRg&list=PLfIJKC1ud8ggZKVtytWAlOS63vifF5iJC&index=4   main.c/* Private includes -----.. 2022. 10. 3.
STM32 ] TCP Client, lwIP Raw API CubeMX 설정 클라이언트가 서버에게 1초마다 한번씩 데이터를 전송하게끔 하기 위해 TIM1을 쓸 예정이다. TIM1은 APB2에서 클락소스를 공급받는다. TIM1의 update interrupt를 enable한다. 아래 헤더파일과 소스파일을 포함한다. main.c /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "tcpClientRAW.h" /* USER CODE END Includes */ // ... /* USER CODE BEGIN PV */ extern struct netif gnetif; /* USER CODE END PV *.. 2022. 10. 3.
STM32 ] TCP Server, lwIP Raw API 아래 헤더파일과 소스파일을 프로젝트에 포함시킨다. STM324x9I_EVAL 공식 LwIP 예제에 포함된 파일로 tcp echo server 는 tcp client 에서 보낸걸 tcp server 가 그대로 다시 보내는 예제이다. 자세한 설명은 주석처리해두었다. main.c /* USER CODE BEGIN Includes */ #include "tcp_echoserver.h" /* USER CODE END Includes */ //... /* USER CODE BEGIN 2 */ tcp_echoserver_init(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { MX_LWIP_Process(); /*.. 2022. 10. 2.
CCS ] Cannot determine URI for [project-name]/[file-path]/[file-name] 오류 해결하기 Project Explorer 에서 작업하던 프로젝트가 사라졌을 때 해결 법 Project Explorer 에서 import CCS Project 클릭 Browse - 프로젝트의 루트 디렉토리 선택 이렇게 다시 import 하면 해결 된다. 2022. 9. 29.
STM32 ] lwIP UDP Echo Sever, 속도 테스트 위 헤더파일과 소스파일을 추가하고 while 문 전에 udp_echoserver_init(); 함수를 추가한다. 그밖에는 이전과 설정이 똑같다. 이건 STM사 공식 LwIP_UDP_Echo_Server 예제에 포함된 파일이다. /* USER CODE BEGIN Includes */ #include "udp_echoserver.h" /* USER CODE END Includes */ //... int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initia.. 2022. 9. 25.
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.
LwIP TCP/IP 스택 살펴보기 Developing applications on STM32Cube with LwIP TCP/IP stack LwIP (Lightweight IP)는 임베디드 시스템에서 널리 사용되는 오픈 소스 TCP/IP 스택이다. LwIP TCP/IP stack에서 지원하는 프로토콜 : IPv4, IPv6, ICMP, IGMP, UDP, TCP, DNS, SNMP, DHCP, PPP, ARP LwIP는 아래 3가지 API를 제공한다. Raw API : Native LwIP 로 event callback 형식으로 동작되며 최고의 성능을 제공하지만 사용하기 조금 복잡하다. Netconn API : Raw API 보다 High Level API로 RTOS 환경이 고려된 API이다. Socket API : 리눅스, 윈도우 등.. 2022. 9. 24.
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.