STM32 11

[STM32] FREERTOS를 사용한 쓰레드와 뮤텍스

rtos를 활성화해서 쓰레드와 뮤텍스를 사용해보려고 한다 쓰레드 pin configuration -> Middleware -> FREERTOS에서 CMSIS_V2로 rtos를 활성화 하자 System Core -> SYS에 들어가보면 기본으로 사용하는 타이머가 SysTick인 것을 확인할 수 있다 해당 타이머는 우선 순위가 낮기 때문에 다른 타이머를 사용해야 한다 비활성화 된 타이머를 선택하자 다시 FREERTOS로 돌아와서 Newlib setting을 Enable 해주고 Tasks and Queues에서 쓰레드 함수 (= Tasks)를 추가해주자 저장을 하면 코드가 생성되는데, 이런 폴더와 코드들이 생성된다 main.c의 최하단을 보면 생성한 쓰레드 함수가 있는 것을 확인할 수 있다 쓰레드 함수를 생성..

[STM32] RTC

RTC (Real Time Clock)는 실시간 시간으로 시간을 유지해야할 필요가 있는 전자기기에 존재하는 것으로, NUCLEO-F429ZI 개발 보드같은 경우에는 ioc에서 활성화 해주면 사용할 수 있다 그러나 다른 전자기기들 처럼 전원이 다시 들어왔을 때 현재 시간으로 설정되는 것은 아니고 설정한 시간으로 시작된다 이번 장에서는 RTC를 활성화하고 LCD를 통해 날짜와 시간을 출력하는 방법을 알아보고자 한다 ioc에서 Timers의 RTC를 클릭하고, Clock Source와 Calendar를 활성화한다 그러면 밑에 파라미터를 수정할 수 있게되는데, Time과 Date를 원하는데로 맞춰준다 Year는 두자리만 적을 것 저장하고 코드를 생성하면 main.c에 rtc 구조체와 Init()함수가 생성된 것..

[STM32] PWM DCMotor 제어

이렇게 생긴게 DCMotor PWM이라는 제어 방법을 통해 모터를 구동해볼것이다 PWM (Pulse Width Modulation)은 펄스 폭 변조라고해서 0과 1을 반복하는 디지털 신호에서 한번 0에서 1로 갈때 그 0과 1의 비율을 조절하는 것이다 이렇게 펄스를 조절해서 모터에 힘들 다르게 준다 모터의 회전 속도나 LED의 밝기 조절 등에서 사용된다 PWM 제어를 사용하기 위해 ioc에서 TIM4의 Channel1 PWM Generation CH1로 활성화하자 그러면 자동으로 PD12번 핀이 TIM4_CH1으로 자동 활성화된다 이제 타이머 생성때와 마찬가지로 TIM4의 주파수를 조절해야한다 데이터시트에서 TIM4가 어느 버스에 연결되어 있는지 확인하자 TIM4는 APB1 버스에 연결되어 있고 Cloc..

[STM32] I2C LCD 출력

I2C (Inter-Integrated Circuit)는 2개의 선을 이용하여 하나의 마스터 기와 여러 슬레이브 기기들이 통신하는 방식으로 동기식 통신 방식이다 아이 투 씨 또는 아이 스퀘어 씨 이렇게 부른다 선은 SDA (Serial Data), SCL (Serial Clock) 이렇게 두 개가 있고, 각각 데이터를 주고 받기 위한 선, 타이밍을 동기화 하기 위한 클럭 선이다 사용할 LCD는 위처럼 생겼다 오른쪽 끝을보면 핀이 4개가 있는데, 위에서부터 GND, VCC, SDA ,SCL 핀이다 ioc에서 개발보드의 I2C를 활성화하자 표시한 부분을 I2C로 바꿔주면 된다 그러면 오른쪽 Pinout view에서 PB9번 핀이 I2C1_SDA 이름으로 활성화되는데 옆에 있는 PB8번 핀도 I2C1_SCL로..

[STM32] 초음파 측정기

요 외계인같은게 초음파 측정기다 이걸로 초음파를 쏘면 물체에 부딪히고 돌아온 초음파까지의 시간을 계산해 물체와의 거리를 계산한다 먼저 가운데 Trigger와 Echo를 연결할 핀과 타이머를 활성화해주자 Trigger는 PF12번 핀, Echo는 PA6번 핀을 사용할 것이다 ioc의 TIM3에서 Channel1을 Input Capture direct mode로 활성화하고 아래 설정을 변경해준다 그러면 위와 같이 PA6핀이 자동으로 활성화된다 PF12번 핀을 GPIO_Output으로 활성화하고 위처럼 라벨링해준뒤 저장하고 코드를 생성하자 main.c의 기존 TIM10 타이머에 초음파 측정기를 위한 변수를 추가해주고 #include "main.h" extern volatile int TIM10_10ms_ult..

[STM32] 타이머

이번장에서는 DHT11과 초음파 측정기를 제어할때 사용할 클락을 이용한 타이머를 생성해보고자 한다 먼저 TIM10을 이용해 10msec 단위의 타이머를 생성해볼건데, 데이터시트에서 TIM10이 어느 버스를 사용하는지 확인해봐야 한다 TIM10은 APB2 버스를 통해서 클락을 공급한다 그럼 이제 ioc 파일에서 Clock Configuration으로 가서 APB2 버스의 주파수를 확인해야한다 APB2 타이머 클락의 주파수가 168MHz인 것을 확인했다 168MHz는 1초에 168000000번 진동한다는 것을 의미하는데, 우리는 해당 주파수를 분주해서 감소시키고 분주된 주파수를 카운트해 타이머로 사용한다 이제 TIM10을 활성화하고 위와같이 값을 설정해준 뒤 저장해서 코드를 생성한다 Prescaler는 분주..

[STM32] BUTTON 제어

이게 버튼이다 결선 방법은 아래와 같다 버튼 코드 작성 전에 채터링과 디바운스에 대해서 먼저 알아보고자 한다 채터링이란 버튼을 눌렀을 때 버튼의 물리적 특성으로 인하여 일시적으로 값이 불안정한 것을 의미한다 MCU는 이러한 불안정한 값도 입력으로 받아들이기 때문에 채터링을 바로잡지 않고 버튼을 사용하면 원하지 않는 결과를 얻을 수도 있다 버튼을 안전하게 사용하기 위해서는 이러한 채터링을 잡아야 하는데, 이렇게 채터링을 잡는 방법을 디바운스이라고 하고 하드웨어적 또는 소프트웨어적으로 잡을 수 있다 우리는 여기서 소프트웨어적으로 디바운스하는 법을 먼저 알아볼 것이다 소프트웨어적으로 디바운스한다고 하면 딜레이를 주는 방법으로 디바운스를 진행한다 먼저 버튼을 사용하기 위해 ioc에서 버튼에 사용할 핀을 GPIO..

[STM32] 기존 프로젝트 그대로 복사해서 프로젝트 생성하기

기존 프로젝트에서 작성한 내용을 그대로 가지고와서 코드를 추가해야 하는 경우가 있을 수도 있다 그럴때 프로젝트를 어떻게 생성해야 하는지 알아보고자 한다 먼저 워크 스페이스에 들어가자 기존에 있는 복사할 프로젝트를 워크 스페이스에서 복붙 복사된 폴더를 새로운 프로젝트 이름으로 변경하자 02.LED_BAR로 변경했다 이제 해당 폴더로 들어가서 디버그 폴더와 파일을 삭제하자 선택한 파일 두개를 삭제하면 된다 확장자가 .ioc인 파일의 이름을 변경한 프로젝트 이름으로 변경한다 .project 파일을 메모장으로 연 뒤 해당 부분을 변경한 프로젝트 이름으로 변경하고 저장한다 .project 파일을 더블 클릭하여 CubeIDE를 실행하면 위와 같은 알림이 뜨며 이전 프로젝트 내용 그대로 새로운 프로젝트를 생성할 수 있다

[STM32] ERROR : NO ST-LINK detected!

프로젝트를 생성하고 빌드 후 다운로드하는데 다음과 같은 에러가 발생했다 인터넷을 찾아보니 펌웨어 문제인 것 같아 CubeIDE에서 Debug Configuration도 해보고 ST-LINK Utility도 사용해 봤지만 ST-LINK S/N이 검색조차 되지 않았다 보드 문제가 아닌건 확실하고, 계속 어떤 점이 문제인지 찾아봐도 검색 자체가 되지 않는 경우는 없었다 결국 문제는 연결 선 문제였던 걸로,, 선 바꾸니까 다운로드가 잘 되더라 그래도 일단 연결이 되어 있다는 가정하에 해당 오류 잡는 법을 정리해보려고 한다 방법은 두가지이다 CubeIDE를 사용한 방법 디버그 버튼 옆에 화살표에서 Debub Configuration을 누른다 Debugger에서 아래 ST-LINK S/N를 체크한 후 스캔 버튼을 ..

[STM32] 개발 보드 LED 제어

사용하는 개발 보드는 NUCLEO-F429ZI이다 만약 보드가 다르더라도 포트와 핀 넘버가 다를 뿐, 맥락은 비슷하지 않을까 싶다 개발 보드 내에 LED를 제어하는 방법을 알아볼건데, 제어할 LED들은 빨간 네모 안에 있는 것들이다 먼저 프로젝트 내의 ioc 파일을 클릭해서 LED가 어디 핀에 연결되어 있는지 확인해보자 LD1, LD2, LD3 각각 Port B 0, 7, 14에 연결되어 있는 것을 확인할 수 있다 이렇게 활성화 되어 있는 핀은 main.h에 정의되어 있는데 위와 같이 정의되어 있고 다이렉트로 포트와 핀 번호를 사용해도 되지만, 라벨링한 이름으로 사용해도 상관없다 main.c로 와서 main의 while (1) 내부에 아래와 같은 코드를 작성하자 while (1) { /* USER COD..