본문 바로가기

임베디드 개발287

부팅 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.
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.
Ethernet, MAC, MII, RMII, PHY MCU에서 이더넷을 하기 위해 필요한 MAC과 PHY 그리고 MII, RMII에 대해 알아보자 아래 사진은 S/W Block과 H/W Block으로 구성된 OSI 7 Layer 이다. 그 중에 MAC과 PHY는 H/W Block에 위치해 있다. MAC은 데이터 링크 계층, PHY는 물리 계층이다. TCP/UDP 와 IP 까지는 S/W 에서 Packet을 만든 다음 전송은 MAC 과 PHY 을 통해서 하게 된다. 이때 MAC 에서 PHY로 DATA가 전송하는 통신 방법으로 MII 와 RMII 등이 있다. 전체적인 흐름은 S/W에서 TCP/IP 또는 UDP/IP Packet을 만든 다음 MAC 으로 전달하고, MAC 에서는 추가로 헤더를 붙여 MII 방식을 통해서 PHY 로 전송하면 PHY 는 디지털 데이터.. 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.
TMS320F28388D ] 멀티 코어 사용하기 TMS320F28388D 모듈은 C28x 듀얼 코어에 CM(Connectivity Manager) 이라고 Arm Cortex-M4 까지붙어있다. TI에서 기본 제공하는 예제는 보면 듀얼 코어를 사용하는 예제와 CM을 사용하는 예제들이 많다. 그 중에 CM이 led blink 하는 예제를 실행해보겠다. 듀얼코어를 사용하는 방법도 다르지 않다. Import 하면 다음과 같이 프로젝트 두 개가 생성된다. 아래가 CPU1이 CM을 위해 pin mux 세팅을 해주는 부분, 위가 CM이 led blink 하는 부분으로 구성되어 있다. // // Included Files // #include "driverlib.h" #include "device.h" // // Main // void main(void) { // .. 2022. 9. 16.
TI ] CCS 에서 다른 Compiler 버전 사용하기 Help - Install New Software 사이트를 선택하고 원하는 버전의 컴파일러를 찾아 설치한다. 참고로 TI 사에서 제공하는 컴파일러는 CGT(Code Generation Tools) 라고 부른다. 만역 여기 목록에 원하는 버전이 없다면 TI 공홈에서 직접 다운받아도 된다. C2000 과 ARM core 컴파일러 다운로드 사이트 : https://www.ti.com/tool/C2000-CGT https://www.ti.com/tool/download/ARM-CGT 설치후 Window - Preference Refresh를 누르고 원하는 컴파일러 버전을 선택 후 Apply를 누른다. Project 우클릭 - Properties - General 에서 Compiler version을 선택할 수 .. 2022. 9. 16.
TMS320F28388D ] 멀티 코어 환경에서 디버깅하기 examples/cm 의 uart 예제를 찾아보면 CPU1(c28x) 코어가 uart config 하는 예제와 CM(ARM Cortex-M4) 코어가 uart echoback 을 수행하는 예제 두 개 가 보인다. 둘 다 import 한다. 첫 번째 예제는 CPU1이 CM의 UART 기능을 쓰기 위한 GPIO 핀 설정을 해주고 공유 주변장치를 할당해준다. // // Included Files // #include "driverlib.h" #include "device.h" void main(void) { // // Initialize device clock and peripherals // Device_init(); // // Boot CM core // #ifdef _FLASH Device_bootCM(.. 2022. 9. 14.
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.
TMS320F28388D ] ADC (ePWM 타이머를 사용한 Interrupt 방식) //// Included Files//#include "driverlib.h"#include "device.h"#include "board.h"//// Defines//#define RESULTS_BUFFER_SIZE 256//// Globals//uint16_t myADC0Results[RESULTS_BUFFER_SIZE]; // Buffer for resultsuint16_t index; // Index into result buffervolatile uint16_t bufferFull; // Flag to indicate buffer is full//// Function Pr.. 2022. 9. 13.
TI ] SysConfig 와 CCS 의 유용한 기능 1. pinmux.csv .syscfg 파일이 있는 프로젝트를 빌드하면 실행파일이 나오는 폴더 안의 syscfg 폴더 안 pinmux.csv 파일이 있다. 열어보면 아래와 같이 pinMux 세팅을 한눈에 볼수 있다. 해당 핀으로 사용가능한 기능, 현재 사용중인 모드 등을 볼 수 있고 엑셀의 필터기능을 사용하면 더 유용하게 쓸 수 있다. 2. Compare 소스파일을 누르고 오른쪽클릭 Compare With Local History 를 선택하면 아래와 같이 Revision History가 나오고 해당 시간을 클릭하면 어떤걸 수정했는지 확인할 수 있다. 파일 두 개를 선택하고 Compare Each Other 하는 것도 가능하다. 3. Outline CCS에서 Outline이 뜨지 않을때, 해당부분을 체크 .. 2022. 9. 12.
TMS320F28388D ] Watch Expressions (Continuous Refresh) STM32에서 Live Expression 과 같이 전역변수를 디버깅하며 실시간으로 관찰할 수 있는 기능이다. 첫번째 방법 보려고 하는 변수를 Expression 에 추가 Continuous Refresh 클릭 점 세개 누르고 Continuous Refresh Interval 클릭 최소 100ms 간격으로 refresh 되게 할 수 있다. 두번째 방법 Continuous Refresh 는 해제하고 해당 변수의 데이터가 변한 뒤 부분에 Breakpoint를 건다. (오른쪽 클릭 또는 파란 라인을 더블클릭해서 토글시킬 수 있다) 참고. Hardware Breakpoint는 CPU의 디버그 레지스터를 이용하는 방법으로 INT1을 사용한다. 속도는 빠르지만 설정할 수 있는 브레이크 포인트 개수에 한계가 있다. .. 2022. 9. 10.
CPU, MCU, MPU, DSP, FPGA 구분 On chip / SoC On chip은 하나의 IC에 제어, 연산, 입출력, 저장장치가 다 들어 있는 Stand alone 형태를 의미한다. SoC(System on Chip)과 같은 의미로 볼 수 있지만, 보통 SoC를 말하면 On chip + 특수기능을 하나의 칩에 구현하는 것을 의미한다. CPU (Central Processing Unit) CPU는 산술 및 논리 연산 유닛인 ALU(Arithmetic and Logical Unit)와 명령어를 읽어오고 해석해서 각 유닛을 제어하는 CU(Control Unit) 그리고 연산을 수행할 때 필요한 데이터를 빠르게 접근하고 처리하기 위해 사용되는 Register를 묶은 형태이다. CPU는 실행할 프로그램과 데이터, 입출력을 제어하는 역할을 하지만 I/O.. 2022. 9. 10.
TMS320F28388D ] External Interrupt 외부 인터럽트 데이터 시트 116페이지에 나와있듯이 외부 인터럽트는 5개 까지 지원된다. syscfg 설정 LED GPIO Output 설정 버튼 GPIO Input 설정 참고로 Qualification Mode는 디폴트가 Synchronization to SYSCLKOUT Only 이다. 그냥 단순히 SYSCLK에 동기화해서 들어오는 신호를 입력받겠다는 것이다. 여기서 Input Qualification 이란 (Technical Reference Guide 1639페이지 부터) 디지털 신호는 일반적으로 아날로그 신호보다 노이즈에 대한 내성이 더 강하므로 왜곡이 거의 없다고 볼 수 있는데 위의 그림처럼 (A)와 같은 노이즈가 발생하면 매우 곤란하다. 이런 경우에 Input Qualification 이 쓰일 수 있다. .. 2022. 9. 8.
TMS320F28388D ] SCI (UART) 통신하기 - 수신 인터럽트를 통한 에코백 설정은 이전 글에서 이어진다. 2022.09.07 - [DSP, MCU/TMS320F2838x (C28x)] - TMS320F28388D ] SCI (UART) 통신하기 - 송신 TMS320F28388D ] SCI (UART) 통신하기 - 송신 SCI : Serial Commnucation Interface 직렬 통신 인터페이스로 UART보다 광범위한 개념으로 쓰이지만 주로 UART 용도로 쓴다. 새 프로젝트를 만드는 것보다 .syscfg 가 있는 예제파일을 불러와 시작하는 것이 eteo.tistory.com interrupt를 수행하는 함수를 Interrupt Handler 또는 ISR (Interrupt Service Routine) 이라고 표현한다. 그리고 핸들러 함수를 만들때는 앞에 __inter.. 2022. 9. 8.
TMS320F28388D ] SCI (UART) 통신하기 - 송신 SCI : Serial Commnucation Interface 직렬 통신 인터페이스로 UART보다 광범위한 개념으로 쓰이지만 그중에 주로 UART 용도로 쓴다. 새 프로젝트를 만드는 것보다 .syscfg 가 있는 예제파일을 불러와 시작하는 것이 좋다. 프로젝트를 복붙해 sci_test 라는 프로젝트를 하나 만들고 .syscfg 파일을 더블클릭해 sysconfig tool 로 들어간다. 형관펜으로 표시한 버튼을 누르면 데이터시트 11페이지에도 있는 핀 다이어그램을 볼 수 있다. F2838x는 176-pin QFP 와 337-pin BGA 패키지가 있는데 내가 사용하는 모델은 337-pin BGA이다. 그리고 그 옆의 Show Generated Files 를 누르고 File name 을 클릭하면 sysco.. 2022. 9. 7.
TMS320F28388D ] 프로젝트 복사하기 Copy와 Paste로 복붙한다. 프로젝트명을 적어 복사한다. F2키를 눌러 .c 파일과 .syscfg 파일도 프로젝트명과 동일하게 바꾼다. 이전 빌드로 생긴 CPUx_RAM 또는 CPUx_FLASH 폴더는 지워준다. 링커 설정에 아래와 같이 되어 있기 때문에 빌드하면 생성되는 실행파일(.out)포함 출력물도 프로젝트명으로 생긴다. 참고로 STM32에선 .elf 로 생성됐었다. 필요한 경우 Debug Configuration 을 수정하고 디버그한다. 2022. 9. 7.
TMS320F2838x ] PIE Vector Table TI 의 PIE Vector table 행이 그룹이고 열이 채널이며 숫자가 낮을수록 더 높은 우선순위를 갖는다. 즉 여러 인터럽트가 펜딩 상태일 때 낮은 숫자 그룹의 낮은 채널 인터럽트가 먼저 실행된다. 테크니컬 레퍼런스 매뉴얼 153-158 페이지 더 자세한 내용을 확인할 수 있다. https://www.ti.com/lit/ug/spruii0d/spruii0d.pdf?ts=1662539879473 2022. 9. 7.
CMD 파일 (linker command files) 작성 팁 공식 홈페이지의 작성 팁 : https://software-dl.ti.com/ccs/esd/documents/sdto_cgt_Linker-Command-File-Primer.html#barely-beyond-basics TI Linker Command File Primer software-dl.ti.com 하기 자료 출처 : http://mcublog.co.kr/ (timcu) TI MCU 카페 mcublog.co.kr TI DSP 개발에 관련하여 CMD 파일의 작성법에 대해 아는 사람은 알고 모르는 사람은 모르는 몇 가지 간단한 팁을 알려드리겠습니다. CMD 파일은 보통 아래와 같이 MEMORY{}에서 사용하는 DSP의 메모리 영역을 정의하고, SECTION{}에서 섹션들을 MEMORY{}에서 정의된 .. 2022. 9. 7.
DSP ] C28x 계열 Data Types 출처 : https://www.ti.com/lit/ug/spru514p/spru514p.pdf 이 코어는 고속연산과 자료 저장의 효율성을 위해서 기본 word단위를 16비트로 사용하고 있기 때문에 자료형 선정 시 주의가 필요하다. char 가 16비트, int 가 16비트, long이 32비트 실수 자료형은 float 와 double 둘다 32비트이다 리틀엔디안 방식이라 예를들어 0x12345678 을 저장하면 메모리에 0x56781234 로 저장된다. 2022. 9. 6.