본문 바로가기

DSP, MCU/STM32 (ARM Cortex-M)91

STM32 ] GY-61(ADXL335) 3축 가속도센서 보드 : STM32F429ZI STM32보드에서 GY-61(ADXL335) 3축 가속도센서 값을 측정해봤다.  GY-61(ADXL335) 보통 아두이노랑 많이 쓰이는 MPU6050 같은 모듈은 안에 ADC가 내장되어 있어서 디지털 인터페이스로 값을 읽는데 이 모듈 같은 경우 각 축의 가속도 값을 아날로그로 출력한다. 데이터시트를 확인해보면 작동 전압 3V~5V이고 아날로그 출력 전압의 센터 값은 1.65V이다. Full scale 센싱 범위가 +/-3g이고 Sensitivity는 300mv/g니까 아날로그 출력은 0.75V에서 2.55V 사이로 스윙할 것이다. Sensitivity of accuracy +/-10%이다.  핀 아웃은 다음과 같다.       ADC다음은 STM32 보드의 데이터시트와 매뉴.. 2024. 6. 18.
STM32CubeIDE 1.15.0에서 Build Analyzer가 동작하지 않을 때 원래 ${ProjName}.elf 파일과 같은 폴더 내에 ${ProjName}.map 파일이 있으면 Build Analyzer에 메모리 사용량이 나타나야 하는데 안나타는 경우 빌드 후 새로고침 버튼을 누르면 동작한다. 아마 STM32CubeIDE 1.15.0 버전부터 바뀐 것 같다.    자동으로 새로고침하게 하려면 아래의 Refresh 설정을 On request가 아니라 Auto로 해두면 된다. Window > Preferences > STM32Cube > Build Views settings > Build Views Resfres Mode : Auto 2024. 6. 13.
STM32 ] microseconds 딜레이 함수 만들기 사용보드 : STM32F429ZI  먼저 타이머를 사용할건데 16-bit 타이머 중에 고르면 충분하다. 65.535ms까지 제어가 되는데 그 이상의 지연이 필요하면 HAL_Delay() 함수를 쓰면 되니까 말이다.여기선 TIM1을 쓴다.          TIM1는 APB2에서 클락을 공급받는다.  APB2 timer clock은 180MHz로 설정되어있다.     Prescaler 값은 180-1로 해서 1MHz(주기 1us) 클락을 얻고 Counter Period는 최대값으로 설정한다.    다음과 같이 코드를 작성한다. /* USER CODE BEGIN 0 */void delay_us(uint16_t us){ htim1.Instance->CNT = 0; while(htim1.Instance->CNT .. 2024. 6. 4.
STM32 ] TouchGFX, 하드웨어와 상호작용하기 1. TouchGFX Designer에서 사용보드를 선택하고 New Project를 생성한다. 2. Designer 툴에서 GUI를 만들고 Generate Code를 한다. 3. 프로젝트 경로에 들어가면 .ioc 파일과 STM32CubeIDE 프로젝트 파일이 있다. 4. STM32CubeMX로 .ioc 파일을 편집하고 STM32CubeIDE로 .cproject를 열어 편집할 수 있다. 5. 하드웨어 상호작용 코드 작성 아래 경로에서 main.c와 gui관련 .cpp 파일을 수정할 수 있다. TouchGFX는 OS없이도 실행할 수는 있지만 그렇게 하면 다른 Task와 TouchGFX 함께 실행하기 어렵기 때문에 FreeRTOS 환경에서 테스트하며 개발되었고 자동생성 코드도 FreeRTOS와 같이 제공된다... 2023. 7. 18.
STM32 ] TouchGFX 설치하고 여러 Widget과 Interaction 사용 해보기 TouchGFX 설치하고 사용해보기 HTML 삽입 미리보기할 수 없는 소스 1. 공식 웹사이트에서 TOUCHGFX를 다운받아 설치한다. https://www.st.com/en/embedded-software/x-cube-touchgfx.html X-CUBE-TOUCHGFX - STMicroelectronics X-CUBE-TOUCHGFX - TouchGFX advanced and free of charge graphical framework optimized for STM32 microcontrollers, X-CUBE-TOUCHGFX, STMicroelectronics www.st.com 압축 해제 후 아래 경로에 .msi 설치파일이 있다. Utilities\PC_Software\TouchGFXDesi.. 2023. 7. 17.
STM32 ] TFTP Bootloader Board : STM32F429ZI (Nucleo 144) STM32CubeIDE : version 1.10.1 Firmware Package : FW_F4 V1.27.1 아래 예제 기반 C:\Users\J\STM32Cube\Repository\STM32Cube_FW_F4_V1.27.1\Projects\STM324x9I_EVAL\Applications\LwIP\LwIP_IAP 일단 위 경로에서 flash_if.h, flash_if.c tftpserver.h, tftpserver.c 파일을 가져온다. main.h에는 다음과 같이 USER APPLICATION 에서 사용하는 플래시 주소가 선언되 었다. 용어를 어디에선 Page라고 쓰고 어디선 Sector라고 하는데 둘은 같은말이다. #define USER_.. 2023. 4. 16.
STM32 ] TFTP Server 파일 송수신 + USB Host MSC int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART3_UART_Init(); MX_FATFS_Init(); MX_USB_HOST_Init(); MX_LWIP_Init(); tftpd_init(); while (1) { MX_LWIP_Process(); MX_USB_HOST_Process(); } } USB와 랜케이블 연결 아래경로에서 tftpd64 를 다운받아 설치한다. https://bitbucket.org/phjounin/tftpd64/downloads/ phjounin / tftpd64 / Downloads — Bitbucket For large uploads, we recommend using the API. Ge.. 2023. 4. 15.
STM32 ] TFTP Server Board : STM32F429ZI (Nucleo 144) STM32CubeIDE : version 1.10.1 Firmware Package : FW_F4 V1.27.1 아래 경로 예제의 tftpserver.h, tftpserver.c 참조 C:\Users\jo\STM32Cube\Repository\STM32Cube_FW_F4_V1.27.1\Projects\STM324x9I_EVAL\Applications\LwIP\LwIP_TFTP_Server STM32보드를 TFTP 서버로 운용하며 클라이언트의 요청을 받아서, 클라이언트로부터 이더넷을 통해 파일을 수신해 보드에 연결된 USB MSC에 저장 또는 USB에 저장된 파일을 이더넷을 통해 클라이언트에게 송신 순서대로 살펴보자. void tftpd_init(.. 2023. 4. 14.
STM32 ] USB Host MSC Board : STM32F429ZI (Nucleo 144) STM32CubeIDE : version 1.10.1 Firmware Package : FW_F4 V1.27.1 Clock Configuration USB 48MHz 클락을 설정하기 위해 HSE를 사용했다. USB_OTG_FS 설정 보드가 Host 모드로 동작하게 설정해준다. USB Flash Drive는 자체전원이 없으니 VBUS를 통해 전원을 공급해주어야 한다. 그래서 USB_ID핀과, USB_SOF핀은 비활성화 됐는데, USB에서 ID핀은 On-The-Go (OTG) 기능을 지원하기 위해 사용되므로 호스트 또는 디바이스 기능만 가진 USB장치를 사용하는 경우 ID핀은 필요하지 않다. 그리고 SOF 타이밍 동기화에 물리적인 SOF핀을 사용하는.. 2023. 4. 13.
STM32 ] 유저 버튼 고장 수리하기 보드의 유저 버튼이 고장나서 집에 돌아다니는 스위치로 교체해보았다. 기존에 남아있던 버튼 틀은 니퍼로 짤라주고 납땜이 잘되게 하기 위해 단자 접촉부위에 사포질을 하거나 칼집을 내준다. 미리 납을 녹여서 덮어두고 그 위에 솔더링 페이스트 묻힌 버튼을 올려놓고 다시 납땝한다. 예상대로 잘 작동한다. 2023. 4. 9.
STM32 ] 커스텀 부트로더 (IAP) 부트로더 Code Placement 이전 글에서 언급했지만 ST사에서 만든 내장 부트로더는 System memory에 있고 그걸 지울 수 는 없다. 이글에서는 예제에서 제공하는 커스텀 부트로더(IAP)를 사용해볼건데 IAP는 Sector 0 ~ Sector 1을 사용하고, Sector 2 ~ Sector 11 에는 User Application을 위치시킬 것이다. 즉, 커스텀 부트로더의 Base Address는 0x0800 0000 이 되고, User Application의 base address 는 0x0800 8000이 된다. 보통 부트로더에서 지원하는 커맨드들 부트로더에 구현할 것들은 예를들면 다음과 같을 수 있다. 부트로더에서 사용가능한 커맨드 확인 부트로더의 버전 확인 MCU 칩의 ID 확인 메.. 2023. 2. 15.
STM32 ] 내장 부트로더와 Flash Loader 사용하기 Boot Pin 설정 내장 부트로더는 System memory에 저장되어 있고 이를 실행시키기 위해선 BOOT1핀을 0, BOOT0핀을 1로 한 상태에서 reset 해야 한다. 이를 위해 보드매뉴얼을 살펴본다. BOOT1핀은 default로 Solder Bridge가 Open된 상태이고 이 때 BOOT1 function은 사용되지 않는다고 한다. 그치만 PB2핀이 CN10을 통해 나와있으니 이 핀을 GND랑 연결해주면된다. BOOT0 핀의 default state는 0이고 Morpho connector CN11을 통해 나와있으니 5번, 7번핀을 쇼트시키면 1로 만들 수 있다. AN2606 System memory boot mode Application note 확인 여기서 나온 communication .. 2023. 2. 7.
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.
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.
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.
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.
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.
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.
STM32 ] UDP Client, lwIP Raw API 2022.10.03 - [DSP, MCU/STM32 (ARM Cortex-M)] - STM32 ] TCP Client STM32 ] TCP Client CubeMX 설정 클라이언트가 서버에게 1초마다 한번씩 데이터를 전송하게끔 하기 위해 TIM1을 쓸 예정이다. TIM1은 APB2에서 클락소스를 공급받는다. 아래 헤더파일과 소스파일을 포함한다. main.c /* Priva eteo.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.
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.