본문 바로가기

분류 전체보기841

한글 ] 표 다음 페이지에 이어서 표시하는 방법 표 선택 후 우클릭 - 표/셀 속성 기본 탭 - 글자처럼 취급 해제 표 탭 - 나눔 또는 셀 단위로 나눔 선택, 제목 줄 자동 반복 체크 [ 제목 행 반복하기 ] 제목 셀 블락 지정 후 우클릭 - 표/셀 속성 셀 탭 - 제목 셀 체크 2022. 12. 7.
TMS320F28388D ] CPU2에서 SCI, SPI 사용하기 위한 설정방법 cpu1은 cpu2 또는 cm을 부트 시켜줄 수 있다. 또한 부트 전 pin mux 세팅을 하고 peripheral을 할당해 줄 수 있는 것도 cpu1 뿐이다. CPU1 코드 #include "driverlib.h" #include "device.h" void Board_init(); void SCI_config(); void SPI_config(); void main(void) { Device_init(); Device_initGPIO(); Interrupt_initModule(); Interrupt_initVectorTable(); // syscfg툴로 생성된 Board.c의 함수가 아니라 생성되는 코드를 참고해 직접 작성한 함수이다. 이 편이 직관성이 높아서 좋은 것 같다. Board_init();.. 2022. 12. 6.
TMS320F28388D ] 타이머, Timer Interrupt 사용하기 TMS320F28388D 모델에는 32bit Timer가 CPU당 각 3개씩 총 6개가 있다. 특이한 것은 Timer1,2 인터럽트는 각각 INT13, INT14에 연결되어 있고 Timer0는 PIE Interrupt Group 1의 7번째로 자리잡고 있다. 매뉴얼 153페이지 벡터 테이블 CPU0 TIMER가 higher priority를 가지고 그 다음이 CPU1 TIMER 그리고 CPU2 TIMER 이다. CPU 타이머 레지스터는 다음과 같다. 먼저 카운터 레지스터의 설명을 살펴보자. TIM 레지스터는 SYSCLOCK 을 Prescaler값(TDDR+1)으로 분주한 clock cycle 에 따라 감소하고 그러다 0에 도달하면 Period 레지스터(PRD)에 있는 값으로 reload 되며 타이머 인터.. 2022. 12. 5.
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.
한글 ] 목차 만들기 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.
Windows ] 송수신 테스트용 더미파일 만들기 파일 만들 위치에서 cmd . 혹은 파일명에 경로도 같이 쓴다. fsutil file createnew 파일 사이즈는 byte 단위 > fsutil file createnew test.txt 1024 1KB의 더미 txt파일 만들기 한글 더미 텍스트 생성기 : https://hangul.thefron.me/ 영어 더미 텍스트 생성기 : https://www.lipsum.com/ test000 부터 test999 까지 반복해 생성하는 윈도우 배치파일 @echo off setlocal enabledelayedexpansion set file_prefix=test REM set file_extension=.txt set file_size=1048576 set num_files=1000 for /l %%i in.. 2022. 11. 15.
부팅 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.
개발규격서 SS, PIDS, CIDS 체계규격서(System Specification) 부체계개발규격서(PIDS, Prime Item Development Specification) 구성품개발규격서 (CIDS, Critical Item Development Specification) 를 하향식으로 순차적 개발한다. 체계설계(SRR), 기본설계(PDR), 상세설계(CDR) 단계에 따라 초안작성과 확정시기가 다르다. 2022. 11. 14.
CDRL 과 SDRL In United States military contracts, Contract Data Requirements List (CDRL, pronounced SEE-drill) is a list of authorized data requirements for a specific rocurement that forms a part of the contract. The CDRL is a register of the deliverable data items. Subcontract Data Requirements List (SDRL) is a prime contractor flow-down of the CDRL requirements to a subcontractor. Generally the prime will.. 2022. 11. 14.
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.
Wireshark ] 종료 전/새 캡쳐 시작 전 이전 캡쳐 저장할 지 묻는 창 안뜨게 하기 이 창 안뜨게 하기 Edit - Preference Apperance, Confirm unsaved capture files 체크 해제 2022. 11. 6.
한글 ] 문단번호 단축키 문단번호 적용하기 : Alt + Shift + Insert 문단번호 1번부터 시작하기 : Alt + Shift + Insert 위의 단축키와 똑같다. 문단번호 잇기 만약 아래 상황에서 '라'를 4번으로 하고 싶다면 3번 문단에 커서를 두고 Alt + C, 번호를 이을 문단('라')를 블록설정한 다음 Alt + C 하면 된다. 1. 가 2. 나 3. 다 표/그림 1. 라 2022. 11. 4.
Windows 10 ] 윈도우 시작 프로그램으로 등록하기 바로가기를 만들어 아래 경로에 가져다 둔다. 개별 사용자용 : C:\Users\Users\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 전체 사용자용 : C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 혹은 레지스트리에 등록하는 방법 Window 키 + R, regedit 입력 후 확인 개별 사용자용 : HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 전체 사용자용 : HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 해당 경로로 먼저 이동한다. 오른.. 2022. 11. 3.
한글 ] 형상관리하기 (버전 비교) 한글 2014 기준 작성됨. 한글에도 형상관리 기능이 있다. 먼저 테스트용 한글 파일을 하나 만든다. 검토 - 문서 이력 관리 버전1로 설명을 남기고 새 버전을 만든다. 그 다음 한글 파일을 아래와 같이 수정해 보았다. 다시 문서 이력 관리를 눌러 현재파일과 비교할 버전을 선택하고 버전 비교를 누른다. 상단의 메모로 보기를 클릭한다. 마치 소스코드 비교툴과 비슷하게 수정된 사항을 확인할 수 있다. 만약 현재문서와 예전버전을 비교하는게 아니라 예전버전과 또 다른 예전버전을 비교하고 싶다면, 문서 이력 관리에서 해당 버전을 더블클릭해 읽기전용으로 연 다음 저장하고 문서 이력 관리 옆의 문서 비교 기능을 사용하면 된다. 2022. 10. 26.