stm32 11

ST-LINK V3 절연 보드 설치 방법

ST-LINK V3은 모듈형으로 조립 가능한 디버거로 절연 가능한 모듈을 별도로 판매한다. 구성 모듈과 오더링 명은 아래와 같다. 모듈을 구성하는 방법은 크게 2가지가 있는데 하나는 본체의 1.27mm IDC케이블만을 사용하는 방법이고 다른 하나는 확장 모듈을 사용하는 방법이다. 절연 모듈을 구성하기 위해서는 아래와 같이 구성하는 것이 권장된다. 절연 모듈을 추가로 조립 시에 점퍼 설정이 달라지는데 아래와 같이 점퍼를 변경하여야 한다. 메인 모듈의 JP1 제거 절연 모듈의 JP2 연결 추가로 전압 역 삽입 시 브리징 회로가 소손되는 경우를 방지하기 위해서는 확장보드(MB1440)의 5V 전원 점퍼를 제거해 주는 것이 좋다.

MCU 2021.04.22

엔코더 카운터 오버플로우, 언더플로우(Rollover, Rollunder) 대응 코드

일반적으로 HW에서 지원하는 엔코더 카운터는 [0 max] 값의 범위에서 작동한다. 모터를 단방향으로 제어할 때에는 새 값에서 이전 값을 빼는 방식으로(만약 현재 값이 이전값보다 작다면 max만큼을 더하고..) 차이를 구할 수 있다. 이 때 결과값은 [0 max-1]이 된다. 하지만, 양방향으로 제어할 때에는 결과값이 [-max/2 max/2]범위로 구해져야 하며, 이 때 타이머가 오버플로우되거나 언더플로우 되는 것에 대한 대응 코드가 필요하다. 해당 코드를 만들기 위한 참고 코드는 아래와 같다. int32_t NumOp_GetDiff(uint32_t curr, uint32_t prev, uint32_t max){ int32_t diff = 0; const uint32_t half_max = max/2;..

DIY/Motor 2021.02.11

VS Code에서 uint32_t 타입 오류로 표시되는 경우(임베디드, stm32)

임베디드 코드 프로젝트를 VScode로 열어서 볼 때 uint32_t 타입 오류가 표시되어 꽤나 거슬릴 때가 있다. 특히, 해당 타입 때문에 아래 있는 다른 구문들이 정상적으로 읽어지지 않을 때가 있는데, 해당 이슈는 사실 오류가 아니라, VScode가 특정 컴파일러에 기반하지 않는 시스템이기에 생기는 문제이다. cmsis에서는 여러 컴파일러에 맞추어 여러 매크로를 선언하고 있는데, 어떠한 컴파일러도 감지되지 않았을 때 오류를 선언하기 때문에 uint32_t 타입이 에러로 표시되는 듯 하다. 해당 이슈를 해결하기 위해서는 아래와 같은 방식으로 해결할 수 있다. - VSCode에서 Ctrl+Shift+P 를 입력한 뒤 C/C++: Edit Configuration(JSON)을 클릭 - c_cpp_prope..

프로그램/C,C++ 2021.02.02

STM32 Ethernet(MAC) 구조

STM32 MCU의 일부 제품군은 이더넷 통신이 가능한 Peripheral을 가지고 있다. Ethernet 주변장치는 OSI 7계층에서 Data link Layer 부분의 역할을 수행한다. Ethernet 블록 다이어그램을 보면 위와 같은 구조로 되어 있는 것을 알 수 있으며, 크게 좌측의 DMA블록, 중간의 MAC블록, 우측의 PHY블록 3가지 부분으로 이루어져 있음을 알 수 있다. 이더넷의 경우 고속으로 동작하기 때문에 CPU가 데이터를 받는 동작을 수행하면 데이터를 송수신하면서 처리하기 어려워 송수신 부분은 DMA로 처리하는 것으로 보인다. STM32 MCU는 PHY인터페이스로 MII와 RMII 통신을 지원하며, PHY 설정을 위해서 MDC/MDIO 인터페이스를 지원한다. 일반적으로 MII인터페이스..

MCU 2020.10.20

STM32 LwIP 구조 - 3

> STM32CubeMX 프로젝트에서 LwIP를 이용한 이더넷은 여러 단계의 초기화 과정을 거친다. 위 그림과 같이 5가지의 과정으로 나눌 수 있다. 먼저 위의 4가지 부분은 CubeMX에서 생성하는 자동생성 코드이며 HAL_ETH_MspInit함수와 HAL_ETH_Init, 두 함수는 configurable하다. HAL_ETH_MspInit함수는 ETH 주변장치를 사용하기 위한 핀 설정을 초기화하며, HAL_ETH_Init은 MII/RMII 인터페이스 선택 및 PHY 설정을 초기화한다. 여기서 주의할 점 중 하나는 STM32의 MAC설정의 경우 ETH_MACDMAConfig에서 수행하는데 해당 부분에 대한 설정은 비교적 자유롭지 않다는 점이다. 예를 들어, MACDMA 설정의 멀티캐스트 필터링의 기본값..

MCU 2020.10.18

STM32 LwIP 구조 - 2

> 간단한 UDP 수신 플로우는 아래와 같다. 실제로 코드를 보면 Ethernet Interrupt --> Ethernetif Thread(Realtime thread) --> low_level_input --> netif->input --> [PROTOCOL]->input 과 같은 형태로 실행된다. Tx의 경우 상위 udp_send와 같은 레이어에서 pbuf_alloc을 호출한 뒤 각 레이어에서 헤더를 추가해가며 패킷을 전송하며, 최종적으로 netif->output에서 MAC peripheral을 통하여 전송을 수행한다. (ETH_TransmitFrame()) > LwIP의 성능에 영향을 미치는 요소는 크게 기능활성화, 통계, 메모리 정도이나, 나머지의 경우 꼭 필요한 기능만 활성화 시키기 때문에 조절..

MCU 2020.10.18

STM32 LwIP 구조 - 1

(OSI 구조와 유사하게)LwIP 구조는 크게 4가지 부분으로 나눌 수 있다. OSI 7계층의 Physical 레이어와 Data Link 레이어와 매핑되는 Network Interface 레이어(PPPoE, PPPoS와 같은 기능을 담당하는 PPP모듈이 해당 레이어에 속한다고 볼 수 있다.) OSI 7계층의 Network레이어와 매핑되어 라우팅과 네트워크 관리를 수행하는 Internet Layer 전송 및 세션레이어와 매핑되어 연결을 수행하는 Transport 레이어 그 위에 유저 응용에 따른 프로토콜이 있는 Application 레이어가 있다. LwIP에서는 각 레이어 레벨에서 제공되어야 하는 프로토콜의 종류를 모듈별로 나누어 놓았다. 파일 매핑은 아래와 같이 수행된다. > 네트워크 인터페이스는 실제 ..

MCU 2020.10.18

STM32F4 온도 센서 코드

STM32F4에서는 내부에 보정되어 어느정도 쓸만한 온도를 출력하는 ADC채널이 있다. 해당 값에 대한 정보는 Datasheet와 Reference Manual을 뒤져보면 알 수 있는데, 해당 채널을 이용하여 온도를 측정하는 코드는 대략 아래와 같다. 1234567891011121314151617181920212223242526272829303132333435363738394041uint16_t adc_buffer[3] = {0,};uint32_t adc_busy = 0; uint16_t *temperature_adc = &adc_buffer[0]; float temperature; uint16_t const *TS_CAL_30 = (uint16_t const *)0x1FFF7A2C;uint16_t co..

MCU 2020.03.15

STM32 + FreeRTOS 이용시 printf를 수행하면 hardfault가 생기는 경우

STM32를 사용하여 펌웨어를 작성할 때에 태스크 코드에서 printf를 수행할 때 특정 경우에 오류가 발생하는 것을 볼 수 있다. 또는 malloc을 사용하여 큰 용량의 데이터를 Heap에서 확보하고자 할때 오류가 발생한다. malloc에서 보았다시피 이 문제는 FreeRTOS 때문에 생기는 문제다.(정확히는 FreeRTOS와 STM32에서 기본적으로 제공하는 newlib의 Heap이 충돌하는 문제이다. 둘 모두 ST마이크로에서 제공하는 코드인 것은 함정) 자세히 내용을 설명하자면 newlib에서는 printf를 수행하거나 malloc을 수행할 때 특정 경우에 한하여 더 큰 메모리를 요구하여 메모리 영역을 확보하는 코드인 _sbrk함수를 호출한다. 기본적인 펌웨어에서는 힙이 스택을 침해하는 것을 막기 ..

MCU 2020.02.15

STM32F429-DISC1 디스커버리 보드 BSP와 CubeMX 연동하여 사용하기

디스커버리 보드의 BSP는 사용자에게 여러 기능들을 편리하게 사용할 수 있는 기능들을 제공하지만, 예제 프로젝트가 CubeMX기반이 아니다 보니 유저가 설정을 추가하거나 바꾸기 힘든 부분이 있습니다. 때문에 CubeMX로 생성하고 BSP설정을 추가하는 노가다를 해야하는데, 이 부분의 수고를 덜기 위해 CubeMX프로젝트에 BSP을 추가하여 연동하는 방법을 이 포스트에서 소개합니다. 전체 프로젝트를 올리면 편하겠지만, 용량 문제로 필요한 파일만 업로드 합니다. 1. CubeMX를 설치합니다. 2. 첨부된 파일을 이용하여 프로젝트 코드를 생성합니다. (프로젝트 생성 디렉토리 변경 필요)3. 생성된 프로젝트를 엽니다. 4. BSP 관련 파일을 추가합니다. C:\Users\${UserName}\STM32Cube..

MCU 2017.11.11