임베디드 개발/TMS320F2838x (C28x)73 CAN [공개] Bit Timing 계산 : http://www.bittiming.can-wiki.info/ CAN Bit Time Calculation The following calculation sheet is mostly useful for classic CAN as defined in ISO-11898 before 2015. For the new CAN FD as defined in ISO-11898:2015 work is in Progress. CiA provides the document CiA 601-3 CAN FD bit-timing recommendations. By providing t www.bittiming.can-wiki.info Receive/Transmit Priority, Frame Ide.. 2023. 2. 25. lwIP UDP 예제 [공개] CPU1 예제 위치 CM 예제위치 sys_check_timeouts() : LwIP function is called to handle certain LwIP internal periodic tasks (protocol timers, retransmission of TCP packets...). 2023. 2. 25. TMS320F28388D ] getTick 구현 ISR에서 사용할 volatile msTick변수와 getTick함수는 모든 HW드라이버파일이 사용할 수 있는 헤더 extern 해둠 volatile uint32_t msTick; uint32_t getTick(void) { return msTick; } main.c 사용 예 timerOpen(TIMER_CH1, 1000, &timer0ISR); //... for(;;) { if(getTick()-timeBefore > 1000) { timeBefore = getTick(); print("\r\nHello World!"); } } timerOpen함수는 함수포인터로 받아서 콜백함수 등록 __interrupt void timer0ISR(void) { msTick++; // Acknowledge this i.. 2023. 2. 21. CCS ] Breakpoint 사용법 링크 :https://software-dl.ti.com/ccs/esd/documents/ccs_breakpoint_watchpoint_c2000.html Hardware Breakpoints and Watchpoints in CCS for C2000 devices software-dl.ti.com Breakpoint 탭에 들어가면 다음과 같은 세부 기능을 사용할 수 있다. Breakpoint : Software BreakpointHardware breakpoint : halt execution of the processor at a pre-defined place in the code.Hardware watchpoint : allow execution to halt when a read or writ.. 2023. 2. 12. TMS320F28388D ] eCAN, DCAN, MCAN bit Timing Calculator TI에서 제공하는 Bit Timing 계산용 엑셀파일 eCAN, DCAN bit Timing Calculator MCAN bit Timing Calculator 관련문서 2023. 2. 10. TMS320F28388D ] Hardware Access 매크로 hw_type.h 파일에 레지스터에 접근에 데이터를 읽고 쓸 때 사용되는 매크로 함수들이 있다. HWREG(x) (*((volatile uint32_t *)((uintptr_t)(x)))) // 32 bit Access 에 사용된다. HWREG_BP(x) __byte_peripheral_32((uint32_t *)(x)) // 32 bit Access 에 사용되는데 컴파일러 내장함수를 사용한다. 이 매크로함수는 CAN, USB 같은 byte Access의 특수 주소지정체계를 쓰는 페리페럴에 사용하기 위해 만들어졌다. HWREGH(x) (*((volatile uint16_t *)((uintptr_t)(x)))) // 16 bit Access 에 사용된다. 16 bit 레지스터나 32bit 레지스터의 상위 .. 2023. 2. 1. 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 ] RAM에 NOINIT 변수 두기 불가 Reset으로 초기화 되지 않는 램 영역에 변수를 둬서 리셋 카운트값을 저장하려고했다. 링커커맨드파일에 type=NOINIT 으로 섹션 타입을 지정할 수 있어 그렇게 했는데도 여전히 0으로 초기화된다. 찾아보니 ECC(Error Correction Code)/Parity 가 적용된 RAM 영역(M0, M1, LSx, GSx, MSGRAM 등)은 부트 과정에서 부트 롬에 마스킹된 부트코드에 의해 0으로 초기화(Clear) 된다고한다. TRM p.699 power-on reset 말고 디버거 리셋시에는 intialized 되지 않는 듯하다. 2023. 1. 25. TMS320F28388D ] USB 라이브러리 USBHCDPipeRead()에서 무한루프 빠지는 문제 usbhostenum.c uint32_t USBHCDPipeRead(uint32_t ui32Pipe, uint8_t *pui8Data, uint32_t ui32Size) { // ... while(ui32RemainingBytes != 0) { // ... while(1) { // ... // If any error event occurs then exit out of the loop. if(g_sUSBHCD.ui32IntEvents & (INT_EVENT_DISCONNECT | INT_EVENT_VBUS_ERR | INT_EVENT_POWER_FAULT)) { // // Set the pipe state to error. // g_sUSBHCD.psUSBINPipes[ui32PipeIdx].iState.. 2023. 1. 25. TMS320F28388D ] 터미널 모니터와 메모리 덤프 터미널 모니터란 시스템의 상황을 모니터하고 터미널에 명령어를 쳐서 여러가지 일을 수행하게끔 하기 위해 윈도우의 명령프롬프트 처럼 MCU에 Command Line Interface를 구현 것을 말한다. 내가 직접 구현한건 아니고 유튜버 baram 님의 영상을 보고 공부하려고 아래 출처 stm32 코드를 가져와 이식했다. 출처 : https://github.com/chcbaram/stm32f411 GitHub - chcbaram/stm32f411 Contribute to chcbaram/stm32f411 development by creating an account on GitHub. github.com C28x 코어는 데이터 타입이 STM32와 달라서 주의할 부분이 있다. char 가 2 byte, int.. 2023. 1. 10. 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 ] DMA 예제 gsram에서 DMA를 사용해 데이터를 이동시키는 예제 //// Included Files//#include "driverlib.h"#include "device.h"#include "board.h"//// DMA data sections// 이전글에 썼지만 DMA에 접근 가능한 메모리 영역이 정해져 있고 그 중 하나가 RAMGS이다.// 따라서 source 와 destination으로 사용할 버퍼를 RAMGS 영역에 배치하는 전처리 지시 코드가 필요하다.#pragma DATA_SECTION(sData, "ramgs0"); // map the TX data to memory#pragma DATA_SECTION(rData, "ramgs1"); // map the RX data to memory//.. 2022. 12. 11. TMS320F28388D ] DMA 파악하기 DMA CPU의 관여 없이 하드웨어적으로 메모리간 또는 메모리와 페리페럴간 데이터를 이동시킬 수 있는 컨트롤러이다. DMA의 특징DMA 모듈이 데이터 이동을 시작하기 위해서는 페리퍼럴 또는 소프트웨어 트리거가 필요하다.6개의 독립적인 DMA 채널이 있고, 각각의 채널은 PIE interrupt를 가지고 CPU에게 데이터 전송 시작시점 또는 완료시점을 알릴 수 있다.DMA 채널1은 다른 채널보다 우선순위를 가질 수 있게 설정할 수 있다. DMA Block Diagram DMA 가 접근가능한 페리페럴과 메모리 영역에 대해 나와있다. 특히 메모리쪽을 보면 RAMGS는 접근가능하지만 RAMM 이나 RAMLS는 접근을 못한다. DMA를 사용하기 위해 필요한 설정 1. 데이터를.. 2022. 12. 11. 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. TMS320F28388D ] Watchdog Timer 사용하기 Watchdog Timer 는 그 단어에서 유추할 수 있는 그대로 CPU를 감시하면서 시간을 계수하는 회로로, 프로그램이 의도치 않게 비정상적으로 중단되거나 무한루프(Infinite Loop)에 빠지는 등 시스템 통제가 불가능한 상황에서 자동으로 시스템을 리셋하는 하드웨어 기능이다. 내부에 있는 8비트 Watchdog 업 카운터가 최대 값인 0xFF을 넘어 overflow 되면 리셋(또는 인터럽트)이 일어나는데 Watchdog Timer에 의한 CPU리셋을 원하지 않는다면 타이머의 카운터가 최대 값에 도달하기 전에 카운터 값을 0으로 초기화(Clear)하는 코드가 실행되어야 한다. 즉, 칩이 실행하는 프로그램이 안정적이고 연속적으로 동작하려면, 프로그램 상에서 Watchdog Timer에 설정된 시간주기.. 2022. 12. 3. 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. 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. 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. 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. 이전 1 2 3 다음