본문 바로가기

TI36

ccs 프로젝트 빌드 과정 CCS에서 프로젝트를 Build하거나 Rebuild 할 때 다음의 절차를 수행한다. 1. makefiles 자동생성 프로젝트의 활성 빌드 구성 폴더(디폴트로는 Debug 폴더)에 하나의 makefile과 여러 *.mk파일을 생성한다. makefile: 자동 생성된 *mk file들을 포함하는 메인 makefile 빌드에 참여하는 모든 소스파일은 아래 *.mk 파일에 정의되어 있다. objects.mk subdir.mk subdir_vars.mk 2. gmake를 사용하여 clean (optional) Rebuild Project 또는 Clean Project 선택시 gmake clean 명령을 사용하여 활성 빌드 구성 폴더의 .obj, .pp, .out 파일을 삭제하고, makefile 및 .map 파일.. 2024. 6. 12.
TMS320F28388D ] 다중 ADC 사용시 변환 순서와 동기 다중 ADC 사용시 변환 순서와 동기에 대해 알아보는데 의식의 흐름순으로 작성되었다.  먼저 사전 설명을 하자면 TMS320F28388D 337-Ball ZWT 패키지는 Temp Sensor를 제외하고 총 24채널의 ADC 입력을 처리할 수 있다. 근데 그중에 3개(ADCINA0, ADCINA1, ADCINB1) 채널은 DAC 용도로도 사용된다. 예를 들어 DAC 3채널을 쓰면 ADC는 21채널만 쓸 수 있는거다. DSP의 ADC 모듈은 총 4개가 있다. ADC-A, ADC-B, ADC-C, ADC-D. 그리고 Temp Sensor는 DSP에 내장되어 있고 ADC-A 모듈과 이미 연결되어 있다. TI가 제공한 예제를 사용하면 쉽게 칩의 온도를 읽을 수 있다.      아래 그림은 ADC 모듈 블럭이다. .. 2024. 5. 1.
TMS320F28388D ] SPI high-speed mode TMS320F2838x에서 지원하는 최대 SPI Clock speed는 기본적으론 12.5MHz인데 High-speed mode를 사용하면 50MHz까지 가능하다. High-speed mode를 사용하기 위한 제약사항과 사용 방법을 알아보자. 먼저 연결 시 특정 핀 구성을 따라야만한다. 칩에 SPI 모듈이 4개있는데 각 SPI는 아래 GPIO핀 먹스 옵션을 사용해야만 High-speed SPI를 사용할 수 있다. 그리고 capacitive load 때문에 High-speed mode는 single master에 single slave 연결만 지원한다. Reference : https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c.. 2023. 11. 8.
UniFlash 사용 방법 UniFlash 설치파일 링크 : https://www.ti.com/tool/UNIFLASH UNIFLASH Software programming tool | TI.com 20 MHz MCU with 128KB Flash, 10KB SRAM, 16-bit Sigma-Delta ADC, dual DAC, DMA, 2 OpAmp, 160 seg L MSP430FR2000 — 16 MHz MCU with 0.5KB FRAM, 0.5KB SRAM, comparator, UART/SPI, timer MSP430FR2032 — 16 MHz MCU with 8KB FRAM, 1KB SRAM, 10-bit ADC, UART/SPI www.ti.com CCS에서 빌드하면 기본 출력물이 .out인데 UniFlash 툴을 .. 2023. 9. 15.
TMS320F28388D ] 부트 과정 Reset이 일어나면 먼저 PC(Program Counter)는 Reset Vector가 fetch되어있는 0x3FFFC0으로 설정된다. Reset Vector의 내용은 Boot ROM 영역에 있는 InitBoot 코드로 점프하는 것이다. Boot ROM은 한번만 프로그래밍 가능한 영역으로 공장 출하시 TI사가 부트로더 Software를 마스킹해둔 곳인데, 여기에 부트로더 역할을 하는 InitBoot 함수가 있다. InitBoot 코드가 실행되면 부트로딩을 위한 루틴을 수행하고 I/O 핀 상태에 따라 BootMode를 결정한 뒤 BootMode에 따라 온칩 메모리의 특정 Entry Point를 실행하게 된다. 참고로 Boot ROM에 마스킹된 Boot Code는 아래 경로에서 살펴볼 수 있다. C:\ti.. 2023. 8. 16.
TMS320F28388D ] Reset Sources 유저매뉴얼의 Reset Sources 테이블 첫번째 열이 Reset Source 목록이고 첫번째 행이 각 Reset이 발생했을 때 초기화되는 여부를 표시한다. Yes인 것은 해당 회로가 리셋 된다는 뜻이고, - 는 해당회로 기존 상태로 남는다는 뜻이며, Hi-z는 하이 임피던스 상태라는 뜻이다. Power-On Reset (POR) POR 회로는 칩에 전원이 인가되고 안정된 상태에 이르기까지 칩을 계속 리셋 상태로 묶어두는 회로로, GPIO 핀들의 글리치를 억제하고, 칩이 깨끗하게 시동 될 수 있게한다. POR이 발생하면 칩의 모든 회로는 리셋상태가 되고, IO핀은 Hi-Z 상태가 되며, /XRS 핀은 Low 신호를 출력하게 된다. 이때 /XRS 핀의 출력 신호는 칩과 연결된 다른 IC 소자들을 리셋 시.. 2023. 8. 14.
TMS320F28388D ] SPI Clocking Schemes / CPOL, CPHA 설정 TMS320F2838x칩 Clock Phase 설정에는 주의할 점이있다. 우선 SPI 통신을 하려면 CPOL(Clock Polarity)과 CPHA(Clock Phase)라는 두 가지 파라미터를 설정하는데 이 설정 조합에 따라 다음의 4가지 SPI 모드가 있다. 그리고 TMS320F2838x driverlib에도 Mode 설정이 존재하는데 CPOL은 동일하지만, CPHA를 설정할 때 주의가 필요하다. 보통은 CPOL, CPHA 설정에 따라 클럭과 데이터를 동기화하는 방법은 다음과 같다. CPOL = 0: IDLE 일 때 클럭이 LOW 레벨이다. CPHA = 0 : 데이터가 클럭의 first edge에서 캡쳐(샘플링)되고, 그 다음 edge에서 전파(출력)된다. CPHA = 1 : 데이터가 클럭의 seco.. 2023. 8. 14.
TMS320F28388D ] CM, C28x 코어 진입점으로 점프 CM 먼저 CM코어의 경우는 Application 실행을 위한 Entry Point는 0x200001 이고 해당 주소로 점프하면 된다. https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/923512/tms320f28388d-cm-core-code-jump-to-execution-giving-meets-error-asking-for-how-to-do TMS320F28388D: CM core code jump to execution giving meets error, asking for how to do - C2000 microcontrollers forum - .. 2023. 5. 7.
TMS320F28388D ] CSS에서 bin 파일 생성하는 법, filling a hole with 0xFF not 0x00 프로젝트를 빌드하면 기본적으로 .out 실행파일이 나오는데 바이너리 파일을 생성하기 위해서는 TI에서 제공하는 유틸을 사용하면 된다. 아래 경로에 있는 툴이고, 이걸 ccs의 post build step 기능으로 빌드와 동시에 bin 파일이 생성되게 할 수 있다. C:\ti\ccs[Version No]\ccs\utils\tiobj2bin 프로젝트 우클릭 - Build - Steps - Post-build steps 해당 부분에 아래 문구를 적는다. C28x 코어 "${CCS_INSTALL_ROOT}/utils/tiobj2bin/tiobj2bin" "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin" "${CG_TOOL_ROOT}/bin/ofd200.. 2023. 4. 23.
TMS320F28388D ] Flash API 사용 일단 아래 경로에 있는 FlashAPI 라이브러리를 복사해 프로젝트 안에 가져온다. C:\ti\c2000\C2000Ware_[Version No]\libraries\flash_api\f2838x\cm\lib 그리고 아래 경로의 FlashAPI를 사용하기 위한 헤더가 모여있는 폴더도 복사해서 프로젝트에 가져온다. C:\ti\c2000\C2000Ware_[Version No]\libraries\flash_api\f2838x\cm\include\FlashAPI 그리고 Include search path에 추가해준다. 복사해서 가져오지 않아도 c2000ware 폴더 내 경로를 추가하면 되긴하지만 선호하지 않는방법이다. 이제 아래 헤더를 include하면 FlashAPI를 가져다 쓸 수 있다. #include ".. 2023. 4. 20.
TMS320F28388D ] TI 제공 부트로더 사용해서 CPU2, CM application 다운로드하기 사용방법은 README.txt 파일에서 찾을 수 있다. When the application starts, the serial connection is with the SCI module which is owned by CPU1. Only commands designated for CPU1 are acceptable at this point before booting CPU2.  If a CPU2 command is selected, the application asks the user for a different option.  After booting to CPU2, either with "Run CPU1 Boot CPU2" or "Reset CPU1 Boot CPU2," CPU.. 2023. 4. 19.
TMS320F28388D ] TI 제공 부트로더 & Flash programmer 툴 사용하기 관련 문서   TI가 ROM에 마스킹 해둔 부트로더 중 SCI boot와 Flash programmer를 사용해 어플리케이션을 program 해보자.   전체 Flow 요약해보면 Boot Mode를 SCI Boot로 바꾸고 SCI ROM bootloader를 사용해 flash kernel 코드를 통째로 램에 복사해 올힌다. 그리고 RAM에 올린 flash kernel을 실행하여 User Application을 Flash에 Program한다.     먼저 내장 SCI bootloader를 사용하기 위해 bootmode를 SCI/Wait Boot로 변경해야 한다.   만약 컨트롤 카드를 쓰고 있다면 S2 스위치로 bootmode를 변경하면 되고, 아닌 경우 해당 b.. 2023. 4. 18.
TMS320F28388D ] phy 레지스터 읽어 link status 감지하기 lwiplib.c 파일에서 bmsr을검색하면 link status를 감지하는 방법을 알 수있다. 먼저 이더넷 initialization 를 하면 Ethernet_getHandle() 함수 안에서 phy 설정을 하고 있긴한데, 그렇게 그냥 써도 이더넷통신은 되지만 phy 칩을 직접 다루려면 바깥에서 올바른 설정값으로 다시 설정해줄 필요가 있다. #define EPHY_BMSR 0x00000001 // Ethernet PHY Basic Mode Status#define EPHY_BMSR_LINKSTAT 0x00000004 // Link Status//MDIO ConfigurationsEthernet_configureMDIO(Ethernet_device_struct.bas.. 2023. 3. 12.
변수를 특정 메모리 영역(섹션 또는 주소)에 배치하기 [공개] 특정 영역에 배치하기 MEMORY { // ... CPU1TOCPU2RAM : origin = 0x03A000, length = 0x000800 CPU2TOCPU1RAM : origin = 0x03B000, length = 0x000800 // ... } SECTIONS { // ... MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM, type=NOINIT MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM, type=NOINIT // ... } #pragma DATA_SECTION(readData, "MSGRAM_CPU1_TO_CPU2") typedef struct { uint32_t u16; float f; } test_t; test_t readData; 특정 주소.. 2023. 2. 28.
Interrupt Nesting & SW Priorization [공개] 관련문서 https://software-dl.ti.com/C2000/docs/c28x_interrupt_nesting/html/index.html C28x Interrupt Nesting In most cases a system will only require one or two interrupts to be nested. This is easily handled by the example shown previously. There is, however, an example provided by which covers possibilities for every single interrupt in the group. This example software-dl.ti.com PIE 그룹과 채널 디폴트 우선순.. 2023. 2. 25.
CANFD (MCAN) [공개] 메시지램 통해 CPU1에서 사용가능 CPU2에선 불가. MCAN이 사용하는 메시지램은 CPU1_TO_CM, CM_TO_CPU1 MSGRAM 과는 별개 송신 수신 FIFO사용해 수신시 Loss 없음 2023. 2. 25.
STM32CubeIDE, CCS, 이클립스 ] 한글 주석 깨짐 해결 워크스페이스에 여러 프로젝트를 import 해서 쓸 때 한글 주석이 깨지는 일이 종종 발생한다. 인코딩이 맞지 않아서 발생하는 일로, 예를 들어 EUC-KR 인코딩으로 작성한 프로젝트를 UTF-8 방식으로 읽고 있다면 인코딩이 깨질 수 있다. 개별 프로젝트 인코딩 바꾸기 프로젝트 우클릭 - Resource - Text file encoding 변경 UTF-8 또는 EUC-KR 로 변경한다. 워크스페이스의 인코딩 바꾸기 Window - Preferences General - Workspace - Text file encoding 을 변경 General - Content Types - Text 선택, Default encoding을 입력하고 Update 누름 참조 : https://coding-factory.. 2023. 2. 8.
TMS320F28388D ] IPC 사용하여 CPU1과 CPU2 타이머 Tick 값 Synchronization CPU1 코드 // ... IPC_clearFlagLtoR(IPC_CPU1_L_CPU2_R, IPC_FLAG_ALL); IPC_sync(IPC_CPU1_L_CPU2_R, IPC_FLAG31); msTick = 0; CPUTimer_startTimer(CPUTIMER0_BASE); // ... CPU2 코드 // ... IPC_clearFlagLtoR(IPC_CPU2_L_CPU1_R, IPC_FLAG_ALL); IPC_sync(IPC_CPU2_L_CPU1_R, IPC_FLAG31); msTick = 0; CPUTimer_startTimer(CPUTIMER0_BASE); // ... 두 코어간 동기화를 위한 API인 IPC_Sync() 함수 내부는 다음과 같다. //! Synchronises the two .. 2023. 1. 26.
TMS320F28388D ] 링버퍼 사용 SCI 에코백 이전글 : 2022.12.30 - [DSP, MCU/TMS320F2838x (C28x)] - 링 버퍼 Circular Buffer 링 버퍼 Circular Buffer 링 버퍼를 구현하기위해선 큐를 먼저 알아야 한다. 큐는 FIFO(First In First Out) 구조로 먼저들어온 데이터가 먼저 나가는 구조이다. 이와 비교되는 자료구조는 LIFO(Last In First Out) 구조인 스택이 있다 eteo.tistory.com 먼저 링버퍼를 사용하지 않는 코드는 다음과 같다. main loop에서 Blocking 방식으로 에코백하는 버전 #include "driverlib.h" #include "device.h" void main(void) { uint16_t receivedChar; Device_.. 2022. 12. 30.
TMS320F28388D ] CM에서 USB MSC 사용 개인 기록용 정리글 CPU1 설정 // Set up the auxiliary PLL so a 60 MHz output clock is provided to the USB module. // This fixed frequency is required for all USB operations. SysCtl_setAuxClock(SYSCTL_AUXPLL_OSCSRC_XTAL | SYSCTL_AUXPLL_IMULT(48) | SYSCTL_REFDIV(2U) | SYSCTL_ODIV(5U) | SYSCTL_AUXPLL_DIV_2 | SYSCTL_AUXPLL_ENABLE | SYSCTL_DCC_BASE_0); // Allocate Shared Peripheral USB to the CM Side. SysCtl_al.. 2022. 12. 28.
TMS320F28388D ] CPU2에서 SD카드 사용 + 속도 테스트 개인 기록용 정리글 CPU1 설정 // 핀먹스 세팅 // GPIO103 -> SDCardCS Pinmux GPIO_setPinConfig(GPIO_103_GPIO103); // SPIC -> mySPI0 Pinmux GPIO_setPinConfig(GPIO_100_SPIC_SIMO); GPIO_setPinConfig(GPIO_101_SPIC_SOMI); GPIO_setPinConfig(GPIO_102_SPIC_CLK); // 칩셀렉트핀 init //SDCardCS initialization GPIO_setDirectionMode(SDCardCS, GPIO_DIR_MODE_OUT); GPIO_setPadConfig(SDCardCS, GPIO_PIN_TYPE_STD); // CS핀 마스터코어 CPU2로 설정.. 2022. 12. 28.
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.
TMS320F28388D ] Watchdog Timer 사용하기 Watchdog Timer 는 그 단어에서 유추할 수 있는 그대로 CPU를 감시하면서 시간을 계수하는 회로로, 프로그램이 의도치 않게 비정상적으로 중단되거나 무한루프(Infinite Loop)에 빠지는 등 시스템 통제가 불가능한 상황에서 자동으로 시스템을 리셋하는 하드웨어 기능이다. 내부에 있는 8비트 Watchdog 업 카운터가 최대 값인 0xFF을 넘어 overflow 되면 리셋(또는 인터럽트)이 일어나는데 Watchdog Timer에 의한 CPU리셋을 원하지 않는다면 타이머의 카운터가 최대 값에 도달하기 전에 카운터 값을 0으로 초기화(Clear)하는 코드가 실행되어야 한다. 즉, 칩이 실행하는 프로그램이 안정적이고 연속적으로 동작하려면, 프로그램 상에서 Watchdog Timer에 설정된 시간주기.. 2022. 12. 3.
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.
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.
CCS ] Cannot determine URI for [project-name]/[file-path]/[file-name] 오류 해결하기 Project Explorer 에서 작업하던 프로젝트가 사라졌을 때 해결 법 Project Explorer 에서 import CCS Project 클릭 Browse - 프로젝트의 루트 디렉토리 선택 이렇게 다시 import 하면 해결 된다. 2022. 9. 29.
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.
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.