본문 바로가기

임베디드 개발307

STM32 ] Boot Configuration 이전글에서 Reset시 프로세서는 0x0000 0000 부터 시작하는 반면 실행할 instruction이 저장된 위치는 다른 곳이기 때문에 Memory Aliasing을 사용한다고 했었다. 그리고 Reference Manual의 Boot configuration을 보면 더 자세한 정보를 찾을 수 있다. Boot mode selection을 위해 BOOT1, BOOT0의 두가지 핀이 존재하고 reset시 해당핀들의 logic에 따라 boot mode가 달라진다. BOOT1은 don't care, BOOT0이 0일 때 Boot mode는 Main Flash memory 모드가 된다. 즉 0x0000 0000 번지가 main flash의 base address로 aliased 된다는 의미이다. BOOT1은 0.. 2023. 2. 6.
STM32 ] Reset Sequence 이해하기 모든 ARM Cortex-M based MCU는 reset 이후 다음과 같이 작동한다. 1. PC(Program Counter)는 0x0000 0000 값을 갖는다. 2. 프로세서는 0x0000 0000의 value를 읽어 MSP(Main Stack Pointer)에 넣는다.MSP = value@0x0000 0000즉, 프로세서가 가장 먼저 하는 일은 Stack pointer를 intialize 하는 일이다. 3. 프로세서는 0x0000 0004 의 value를 읽어 PC에 넣는다.그리고 해당 value는 Reset Handler의 주소이다. 4. PC는 Reset Handler로 점프한다.Reset Handler는 Application 실행을 위해 필요한 초기화를 하는 C/.. 2023. 2. 6.
STM32 ] 메모리 구조 STM32F429ZI 메모리 구조 Internal Flash Memory (Embedded Flash, On-Chip Flash) : 2MB Dual-Bank System Memory (ROM) : 30KB (Read Only, ST사의 native bootlader가 저장된다) OTP (One-Time Programmable) Memory : 528 bytes (Product No. Serial No. 저장 등에 사용된다) Option bytes Memory : 32 bytes (Flash Memory에 Access하기 위한 flag로 사용된다) Internal SRAM : 256KB Internal SRAM1 : 112KB Internal SRAM2 : 16KB Internal SRAM3 : 64KB.. 2023. 2. 6.
STM32CubeIDE 프로젝트의 debug 와 release 빌드 차이점 둘의 차이점은 GCC 컴파일러 세팅이다. Debug --> Optimization off -O0 Release --> Optimize for size -Os Release 모드는 최적화를 사용하므로 실행 속도가 빠르고 코드 크기가 줄어든다. 하지만 #ifdef _DEBUG 코드와 assertion macro 가 비활성화되고 디버그 심볼과 소스/라인 넘버 정보가 사라지므로 디버그를 수행하기 힘들어질 수 있다. 커뮤니티의 글들을 살펴보니 Debug 모드로 개발하다가도 종종 Release 모드로 테스트 해보는 것을 추천하고, 퍼포먼스가 크게 문제가 되는 상황이 아니라면 두가지 설정을 가지고 갈 필요 없이 Debug모드만 사용하는 것도 고려해볼 수 있을것 같다. 한편 Debug 모드로 실행 시 메모리가 부족하다.. 2023. 2. 6.
STM32 ] HSE bypass 설정 HSE에는 ON/OFF 그리고 BYPASS가 있는데 BYPASS란 무엇일까 아래 회로도를 보면 MCU에 OSC_IN, OSC_OUT 두 핀이 있고 거기에 External cyristal oscillator가 연결되면 사용할 수 있는데 현재 연결이 안된 것을 알 수 있다. [N/A] 그리고 reference manual에 HSE clock 파트를 보면 HSE를 사용하기 위한 두가지 옵션이 있다고 나와있다. 첫 번째는 위 회로도대로 OSC_IN과 OSC_OUT핀에 crystal oscillator를 연결하는 것이고 두 번째는 External Source를 사용하는 것이다. External Source는 다른 MCU가 될 수도 있고 다른 timer 나 RTC가 될수도 있다. 연결방법은 해당 소스를 OSC_IN.. 2023. 2. 5.
STM32 ] Clock 설정, HSI, HSE, PLL, LSI, LSE Clock Source 종류 일반적으로 Clock을 얘기할 때는 main system clock 을 말한다. 그리고 system clock(SYSCLK)은 다음의 세가지 clock sources 에서 나올 수 있다. HSI(High Speed Internal) oscillator clock HSE(High Speed External) oscillator clock Two main PLL(Phased Locked Loop) clock 또한 SYSCLK가 아니라 secondary 목적으로 사용되는 clock sources 가 2개 있다. 32kHz low-speed internal RC (LSI) : Watchdog에 사용되고, Stop/Standby Mode 에서의 RTC를 사용한 Auto-wakeup 용.. 2023. 2. 5.
Serial EEPROM 과 NAND Flash Memory(USB, SD) 의 비교 EEPROM Flash Memory Electrical Erasable Programmable Read Only Memory solid State Disk NOR cells NAND cells Less Write More Read Both Read Write More Expensive Less Expensive Faster Read Slower Read More Time For Programming Less Time For Programming Less Voltage More Voltage Less Erasing Time More Erasing Time Erase Byte Erase Block or Whole chip Smaller Faster Data Large Data EEPROM과 Flash의 가장.. 2023. 2. 3.
메모리 종류와 세부분류 ROM, RAM, FLASH HTML 삽입 미리보기할 수 없는 소스 1. ROM (Read Only Memory) 비휘발성(Non-volatile) 반도체 저장장치 한번 기록된 정보를 읽은 수만 읽고 수정할 수는 없는 고정 기억장치 다시 쓰고 지울 수 있는 방식에 따라 아래와 같이 구분됨. MASK ROM 부터 점차 발전되 현재 ROM이라고 하면 대부분 EEPROM을 말함 종류 설명 MASK ROM 가장 기본적인 ROM으로 제조과정에서 기록한 내용을 사용자가 수정 불가 PROM (Programmable ROM) 하용자가 한번만 기록 가능 EPROM (Erasable PROM) UV EPROM 강한 자외선으로 데이터 삭제 가능 EEPROM 전기적 기능으로 데이터 삭제 가능 2. RAM (Random Access Memory) 전원이 .. 2023. 2. 3.
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.
부트로더 Boot Loader 부트로더란? 부트로더(bootloader)는 부팅 시 처음으로 실행되는 프로그램으로 Application을 로드하고 실행하는데 필요한 초기 설정을 한다. 부트로더는 주로 ROM, flash 메모리 또는 EEPROM에 저장되어 있으며, 기본적으로는 기기를 켜면서부터 실행된다. Application 업데이트가 필요한 경우 사용될 수 있다. 부트로더를 이해하기 위한 예시 1. 아두이노 아두이노의 경우에도 flash memory 에 프로그램된 on chip bootloader 가 있다. 아두이노가 reset 되는 경우 bootloader 가 가장 먼저 실행된다. bootloader 는 아두이노 스케치를 보드에 다운로드하기 위한 목적으로 사용된다. (IAP, In Application Programming) 아두.. 2023. 2. 1.
LSB, MSB 출처 : https://blog.naver.com/ansdbtls4067/220886567257 LSB와 MSB란 무엇인가? 안녕하세요? 땜쓰 인사드립니다. 오늘은 LSB와 MSB에 대해서 함께 알아보도록 하겠습니다. 우선 이들... blog.naver.com LSB 와 MSB LSB는 Least Significant Bit의 약자로서 하나의 데이터 형에서의 가장 낮은 위치의 Bit를 의미한다. MSB는 Most Significant Bit의 약자로 어떠한 데이터 형의 최상위 비트를 의미한다. LSB 위치는 가장 값이 작은 비트인 2^0에 위치하고 있으므로 LSB의 값을 확인하면 숫자가 짝수인지 홀수인지 쉽게 알아낼 수 있다. 또한 LSB는 프로그래밍시 주로 난수발생 함수, 해시 함수, 검사합(Check.. 2023. 1. 31.
STM32 ] CAN Interrupt CAN 통신 송수신 이전글 : 2023.01.29 - [DSP, MCU/STM32 (ARM Cortex-M)] - STM32 ] CAN 송수신 STM32 ] CAN 송수신 CAN 통신 설정 이전글 : 2023.01.27 - [DSP, MCU/STM32 (ARM Cortex-M)] - STM32 ] CAN 통신 설정 (bxCAN peripheral) STM32 ] CAN 통신 설정 (bxCAN peripheral) HTML 삽입 미리보기할 수 없는 소스 STM32F4xx 시리즈에는 bxCAN이라고 eteo.tistory.com bxCAN 의 interrupt source 1. Transmit Request Completed 2. Frame is received in RX FIFO0 3. Frame is r.. 2023. 1. 31.
STM32 ] CAN 송수신 + Acceptance Filter CAN 통신 설정 이전글 : 2023.01.27 - [DSP, MCU/STM32 (ARM Cortex-M)] - STM32 ] CAN 통신 설정 (bxCAN peripheral) STM32 ] CAN 통신 설정 (bxCAN peripheral) HTML 삽입 미리보기할 수 없는 소스 STM32F4xx 시리즈에는 bxCAN이라고 불리는 CAN 모듈(컨트롤러)이 2개 있으며 특징은 다음과 같다. 2 CAN Controllers are avialable. CAN1 and CAN2 CAN1 is called Master bxCAN and CAN2 is c eteo.tistory.com HTML 삽입 미리보기할 수 없는 소스 내가 사용한건 SN65HVD230 CAN 트랜시버 모듈이다. CAN1과 CAN2 둘 다 .. 2023. 1. 29.
STM32 ] CAN 통신 설정 (bxCAN peripheral) HTML 삽입 미리보기할 수 없는 소스 STM32F4xx 시리즈에는 bxCAN이라고 불리는 CAN 모듈(컨트롤러)이 2개 있으며 특징은 다음과 같다. 2 CAN Controllers are avialable. CAN1 and CAN2 CAN1 is called Master bxCAN and CAN2 is called Slave Both supports CAN protocol version 2.0A and B Bit rates up to 1 Mbit/s Three transmit mailboxes Two receive FIFOs with three stages 28 filter banks shared between CAN1 and CAN2 Tx mailboxes 유저가 CAN 메시지를 구성해 담을 수 있는.. 2023. 1. 27.
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.
CAN 통신 - 메시지 타입과 구조 CAN 통신 이전글 : 2023.01.24 - [DSP, MCU/펌웨어공부] - CAN 통신 (Controller Area Network) CAN 통신 (Controller Area Network) HTML 삽입 미리보기할 수 없는 소스 CAN 통신(Controller Area Network)은 1980년대 Bosch사에 의해 개발된 메시지 기반 네트워크 프로토콜으로, 차량 내에서 호스트 컴퓨터 없이 마이크로 컨트롤러나 장치 eteo.tistory.com HTML 삽입 미리보기할 수 없는 소스 Data Frame Remote Frame Error Frame Overload Frame 이 중 Error Frame 과 Overload Frame 은 컨트롤러가 알아서 처리하므로 프로그래밍 할 때는 주로 Dat.. 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.
CAN 통신 (Controller Area Network) HTML 삽입 미리보기할 수 없는 소스 CAN 통신(Controller Area Network)은 1980년대 Bosch사에 의해 개발된 메시지 기반 네트워크 프로토콜으로, 차량 내에서 호스트 컴퓨터 없이 마이크로 컨트롤러나 장치들이 서로 통신하기 위해 설계된 표준 통신 규격이다. HTML 삽입 미리보기할 수 없는 소스 Multi-master serial communication bus. Broadcast type of Bus. (Not point-to-point) Low cost solution. Extreme robustness. (noise-immunity) High data transmission speeds. (up to 1 MBit/sec, High speed CAN 기준) Reliabilit.. 2023. 1. 24.
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.
unsigned int 형 tick 변수가 오버플로우 나는 날 unsigned type 4byte 자료형의 범위는 0 ~4,294,967,295 tick 변수가 s 를 표현하는 경우 대략 49,710일(136년)이 경과하면 오버플로우가 나고, tick 변수가 ms 를 표현하는 경우 대략 49.7일이 경과하면 오버플로우가 난다. 2023. 1. 7.
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.
링 버퍼 Circular Buffer 링 버퍼를 구현하기위해선 큐를 먼저 알아야 한다. 큐는 FIFO(First In First Out) 구조로 먼저들어온 데이터가 먼저 나가는 구조이다.  이와 비교되는 자료구조는 LIFO(Last In First Out) 구조인 스택이 있다. 스택은 나중에 들어온 데이터가 먼저 나오는 구조로 함수 호출을 생각하면 된다. 함수가 호출되면 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 스택에 넣어지고 함수에서 리턴 시 스택에서 반환 주소값을 POP하여 해당 함수가 호출되기 이전 상태로 되돌아 갈 수 있다.        다시 돌아와서 링버퍼란 고정 크기의 큐를 마치 처음과 끝이 연결된 것처럼 사용하는 구조를 말한다. 그리고 버퍼에 쓰고 읽을 위치를 알기 위한 head 와.. 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.
STM32 ] 인터럽트 처리 과정 인터럽트 처리과정 프로세스 수행 도중 인터럽트가 발생하면 하던일을 멈추고 인터럽트 벡터 테이블에 저장된 ISR을 호출하게 된다. ISR에서 수행되는 내용은 다음과 같다 . 1. 더 이상 인터럽트가 걸리지 않도록 인터럽트를 disable해둔다. 2. 현재의 레지스터 상태를 모두 stack 메모리에 저장해둔다. 3. 인터럽트를 처리한다. 4. stack 메모리에 저장해두었던 레지스터 값을 복구한다. 5. 다시 인터럽트가 걸릴 수 있도록 Interrupt Source 를 클리어한다. 다시 원래의 프로세스로 복귀한다. startup_stm32f429zitx.s 파일에 정의된 인터럽트 벡터 테이블. 인터럽트에 걸리면 벡터 테이블에 할당된 주소로 뛰게 되는데 Code generation 을 통해 stm32f4xx_.. 2022. 12. 22.
STM32 ] 무료 다이어그램 툴 draw.io 로 SW 설계해보기 UML 다이어그램의 종류 동작 다이어그램 구조 다이어그램 인터랙션 다이어그램 유스케이스 클래스 다이어그램 시퀀스 다이어그램 액티비티 다이어그램 객체 다이어그램 커뮤니케이션 다이어그램 상태 다이어그램 컴포넌트 다이어그램 인터랙션 오버뷰션 다이어그램 배치 다이어그램 타이밍 다이어그램 패키지 다이어그램 컴포넌트구조 다이어그램 참고 : STM32Fx Cortex ARM 프로그래밍 그중에서도 다음은 Activity 다이어그램의 심볼이다. 일반적으로 우리가 알고 있는 플로우차트와 유사하다. 예시. 버튼을 2초 이상 누른 상태로 손을 떼지 않으면 LED가 500ms 간격으로 토글되고 손울 떼는 순간 IDLE로 돌아간다. while (1) { LEDBTN(); /* USER CODE END WHILE */ /* USE.. 2022. 12. 22.
CAN 통신 ] PCAN 사용하기 PCAN-USB 를 사용하면 PC에서 USB를 통해 CAN 네트워크에 연결할 수 있다. 홈페이지 : https://www.peak-system.com/   드라이버 다운로드       PCAN-View 다운로드    매뉴얼    결선 2, 7, 3, 6번 핀만 연결해주면 된다.3은필수이고, 6은 optional ground 이다.   종단저항 관련JP1, JP2를 쇼트시키면 내부 120옴 저항을 활성화할 수 있다.   최대 버스 길이     PCAN-View 설정 먼저 Bit rate를 맞춘다.    수신 녹화 버튼을 눌러 Trace 를 시작할 수 있다.      Trace 탭에서 실시간 수신되는 메시지를 확인할 수 있다.       송신 메시지모양 아이콘을 누르거나 또는 Transmit 메뉴의 New .. 2022. 12. 22.
정수 리터럴 뒤에 접미사 UL을 붙이는 이유 변수는 선언할 때 자료형의 크기를 정할 수 있지만 리터럴(상수)는 그러지 못하기 때문에 접미사(suffix)를 활용해 크기를 명시적으로 표시한다. 접미사를 붙이지 않은 경우 정수 상수의 타입은 int 이기 때문에 강제로 unsigned long int 로 만들어 주기위해 뒤에 UL을 붙이는 것이다. unsigned type으로 바꾸는 것은 연산 도중 혹시나 overflow가 일어나서 의도하지 않은 결과가 나오는 것을 막기 위함이다. 정수 리터럴 접미사 자료형 생략시 int L long U unsigned int UL unsigned long LL long long ULL unsigned long long 10진수 뿐만 아니라 16진수에도 접미사를 붙일 수 있다. 실수 리터럴 접미사 자료형 생략시 doub.. 2022. 12. 14.
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.