본문 바로가기

stm3288

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 ] 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 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.
Eclipse 기반 IDE에서 Code Formatter 설정하기 STM32CubeIDE 자동생성 코드의 tabsize는 2칸인데 디폴트 Formatter의 tabsize는 4칸이라 안맞아서 수정해 줄 필요가 있다. Window > Preferences > C/C++ > Code Style > Formatter New를 클릭해 built-in profile을 base로 해서 커스텀 profile을 생성할 수 있다. 가장 많이 사용하는게 K&R 아니면 BSD인 것 같은데 둘의 대표적 차이는 K&R은 중괄호를 same line에서 시작하고 BSD는 next line에서 시작한다는 점이다. // K&R if (isRunning) { // do something } // BSD if (isRunning) { // do something } 지금은 BSD에서 tab size를 .. 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.
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.
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 ] 메모리 구조 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.
링 버퍼 Circular Buffer 링 버퍼를 구현하기위해선 큐를 먼저 알아야 한다. 큐는 FIFO(First In First Out) 구조로 먼저들어온 데이터가 먼저 나가는 구조이다. 이와 비교되는 자료구조는 LIFO(Last In First Out) 구조인 스택이 있다. 스택은 나중에 들어온 데이터가 먼저 나오는 구조로 함수 호출을 생각하면 된다. 함수가 호출되면 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반환 주소값, 함수에서 선언된 지역 변수 등이 스택에 넣어지고 함수에서 리턴 시 스택에서 반환 주소값을 POP하여 해당 함수가 호출되기 이전 상태로 되돌아 갈 수 있다. 다시 돌아와서 링버퍼란 고정 크기의 큐를 마치 처음과 끝이 연결된 것처럼 사용하는 구조를 말한다. 그리고 버퍼에 쓰고 읽을 위치를 알기 위한 head 와 tail 포인.. 2022. 12. 30.
STM32 ] 인터럽트 처리 과정 인터럽트 처리과정 프로세스 수행 도중 인터럽트가 발생하면 하던일을 멈추고 인터럽트 벡터 테이블에 저장된 ISR을 호출하게 된다. ISR에서 수행되는 내용은 다음과 같다 . 1. 더 이상 인터럽트가 걸리지 않도록 인터럽트를 disable해둔다. 2. 현재의 레지스터 상태를 모두 stack 메모리에 저장해둔다. 3. 인터럽트를 처리한다. 4. stack 메모리에 저장해두었던 레지스터 값을 복구한다. 5. 다시 인터럽트가 걸릴 수 있도록 Interrupt Source 를 클리어한다. 다시 원래의 프로세스로 복귀한다. startup_stm32f429zitx.s 파일에 정의된 인터럽트 벡터 테이블. 인터럽트에 걸리면 벡터 테이블에 할당된 주소로 뛰게 되는데 Code generation 을 통해 stm32f4xx_.. 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 ] 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.
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.
STM32 + MFC ] 델타 로봇 티칭 시스템 구현, 파일입출력 기능 사용 티칭 데이터 관리, 쓰레드 활용 반복작업 수행 로봇의 티칭 방법 로봇에게 가르칠 수 있는 행동의 종류는 MOVE, WAIT, PUMP 세가지가 있고 각각 속성값을 지정할 수 있다. 1. MOVE : TORQUE OFF 버튼을 누른 뒤 사람 손으로 원하는 위치로 엔드 이펙터를 이동시킨 후에 READ 버튼을 클릭하면 현재 좌표값이 입력된다. 물론 좌표값을 직접 입력하는 것도 가능하다. 2. WAIT : 직전행동 후 대기시간을 설정한다. ms 단위로 0-5000 사이의 값을 입력할 수 있다. 3. PUMP : ON 또는 OFF를 선택한다. 원하는 행동의 라디오버튼을 클릭하고 속성값이 지정되었으면 ">" 버튼을 눌러 해당 행동을 기억시킬 수 있다. 기억된 행동은 순서대로 번호가 부여되며 중간에 행동을 끼워넣거나 "" 버튼 눌렀을 때의 이벤트 처리 함수 vo.. 2022. 9. 19.