mcu란?마이크로 프로세서, 메모리, 프로그램 가능한 입출력 모듈을 하나의 칩으로 만든 것프로그래밍을 통해 제어나 연산이 가능세탁기, tv, 냉장고 등 대부분의 가전제품에 mcu가 들어가며 그 기능은 프로그래밍을 통해서 구현됨mcu의 핀mcu를 살펴보면 사방에 있는 '
os란?operating system<os 이전>os라는게 없을때 user가 모든 기능을 software가 처리하도록 처음부터 끝까지 작성했다. (힘듦)<진화>편하게 하기 위해 이러한 software를 hardware에 자동으로 Loading해주고 실행해주는
개발자는 ARM Core의 관계가 깨지지 않도록 해주어야 한다.ARM Core는 메모리에 있는 코드를 읽어오고, 해석하고, 실행한다.(Fetch - Decode - Execute)이러한 단계가 연속적으로 흘러가게 하면, ARM Core의 성능이 좋아진다.<위의 (
stm32를 사용하는 이유10달러 내외의 저렴한 stm32누클레오 보드(NUCLEO board)를 사용할 수 있으며, 마이크로 컨트롤러 개발 툴을 무료로 제공함으로써 누구나 임베디드 설계 및 개발을 손쉽게 진행할 수 있도록 만들었다.누클레오 보드는 다양한 프로토타입 (
배치 다이어그램이란?UML에서 배치 다이어그램은 시스템의 물리 아키텍처를 모델링배치 다이어그램은 시스템의 소프트웨어와 하드웨어 컴포넌트 간 관계 및 처리의 물리적 분배를 표시여기서 말하는 배치는 Batch가 아닌 Deployment 이다. 시스템의 물리적인 구조를 보여
RDH8020S 12V 팬모터
데이터시트 보는 요령많이 보는 사람이 더 잘할 수 밖에 없다.데이터시트는 한글로된 시트는 거의 존재하지 않는다. 영어로 되어있으니, 영어를 잘 하는것이 유리하다. (전문영어, 논리영어)<1\_ 목적을 세우자>내가 해야되는 정확한 목표를 세우고, 그 목표애 맞는 지
펌프모터에 건전지(6V)를 인가하여 모터를 작동시킵니다.<다음 목표>STM32 보드의 GPIO를 이용하여 원하는 상황에서 특정 전압이 펌프모터에 인가될 수 있도록 만든다.모터 드라이버 모듈을 이용하여 2개의 펌프모터를 동작시킬 수 있도록 만든다.
GPIO란?입력과 출력을 마음대로 선택할 수 있고, 0과 1의 출력 신호를 임의로 만들어줄 수 있는 구조를 가진다.
팬모터를 모터 드라이버에 연결시켜서 작동시키기 위해 아래와 같이 연결을 해두었습니다.STM32 보드의 PA8, PA9에 각각 PWM 신호를 주었습니다.Timers의 TIM1을 사용했으며, Channel1과 Channel2를 사용했습니다.clock은 72로 맞춰주었습니다
OS포팅을 진행하며처음 OS포팅을 진행하면서 기존에 가지고있는 stm32 보드로 포팅이 되지 않는것을 확인했다.이유를 분석해보니 리눅스를 어딘가에 저장하려면 RAM이 존재해야하는데, RAM이 없어서였다.마이크로 프로세서란?위와 같이 OS포팅을 진행하지 못 하고 단일침으
참고 자료https://www.youtube.com/watch?v=YBO4sqGm8L8
우리가 어댑터를 구매할때는 전압(V)이 몇인지 확인하고 구입을 진행한다.그런데, 그와 함께 옆에 쓰여있는 것이 있다. 바로 전류(A)이다.보통 판매를 할때 전압에 따라 전류를 다르게하여 판매한다.이렇게되면 한가지 궁금증이 생긴다.내가 사용하고자하는 기기의 전류보다 낮은
UART란?직렬로 한 번에 한 비트씩 비동기적으로 데이터를 교환하는 통신 방식을 제공하는 가장 기본적인 입출력 장치로, 시스템 콘솔 또는 디버깅 용도로 많이 사용된다.디버깅할 때 pc로 값을 출력하도록하거나 센서의 값을 읽기 위해 UART 통신을 사용UART는 직렬로
I2C란?칩간의 통신을 의미한다.I2C 통신은 2개의 선을 이용하는 통신 방식하나의 마스터와 여러개의 슬레이브 기기가 물려 통신이 가능클럭 신호를 사용하는 동기식 통신 방식이라 시간에 자유로움슬레이브 선택을 위해 항상 주소 데이터가 붙기에 긴 데이터를 전송 하기엔 부적
SPI란?동기식(Synchronous) 시리얼 통신 방식 데이터 수신의 타이밍을 위하여 Clock 라인을 사용SPI와 I2C의 차이I2C는 무전기와 비슷한 개념이라면, SPI는 전화와 비슷한 개념이다.즉, SPI는 전이중 통신 (양방향 통신이 가능한 것)이고 전화(내가
시리얼 통신이란?병렬 데이터의 형태를 직렬 방식으로 전환하여 데이터를 전송하는 컴퓨터 하드웨어의 일종이다.시리얼(Serial)이라는 것은 직렬이라는 뜻으로, 패러럴(Parallel)과 반대되는 단어이다.<직렬통신과 병렬통신>통신에는 직렬 통신과 병렬 통신의 2가지
PWM이란?통신에서 사용하는 변조 방식 중의 하나이다. 즉, 정보에 따라 펄스의 폭을 변화시켜 전달하는 방식이다.예를 들어 신호의 크기가 크면 펄스 폭을 크게 하고 신호의 크기가 작으면 펄스 폭을 작게 하여 정보를 전달한다.하지만, 마이크로 프로세서 응용분야에서는 PW
syscalss.c파일printf()함수를 처리하기 위해서는 syscalss.c파일이 필요하다.Embedded에서의 printf()Embedded에서는 그냥 출력하는 것이 아니라, STM의 경우 Low-Level에서printf -> putchar -> fput -> \
링버퍼란?링버퍼는 원형 큐 이다.큐(Queue)라는 것은 FIFO(First in First out)의 능력을 가졌다.FIFO는 선입선출이라는 능력을 가졌으므로 첫번째에 들어간 Data가 가장 처음으로 출력된다.원형 큐(Ringbuffer)는 이 선형큐에서 n+1시킨
다른곳에서 장치를 쓰고 있을때, 주소를 잘못 할당했을때 등 오류가 발생한다고 합니다.(현재 내가 이 오류를 겪고 있는 중.. 어서 빨리 해결하기를..)
인터럽트와 폴링은 이벤트를 처리하는 방법입니다.폴링은 이벤트를 수행하라는 신호를 받았는지 안받았는지를 주기적으로 검사하면서 그 신호를 받았을때 이벤트를 실행하는 방식이고,인터럽트는 이벤트를 수행하라는 신호를 받으면 핸들러를 통해서 바로 이벤트를 수행하는 방식입니다.한
소개HAL_I2C_Mem_Write()함수를 사용하여 EEPROM에 값을 적으려고 했다. 리턴값도 HAL_OK로 제대로 출력되는 모습을 확인할 수 있었다.읽어오는 것은 제대로 읽어오지만 적어줄때 무슨 문제가 있는건지 적은 값이 들어가지 않는다.Delay문제일까 싶어서
소개I2C 통신 방식을 이용하여 외부 EEPROM에 데이터를 적고, 읽어오는 것을 진행합니다.사용중인 ST 보드는 STM32F429입니다. 해당 ST보드에는 내부 EEPROM이 없으므로 외부 EEPROM을 사용해야 합니다.현재 외부 EEPROM으로 24LC08B-I/O
naming의 중요성개발을 진행할때 누가 봐도 알아볼 수 있는 이름을 사용하는 것은 매우 중요하다.만약 알아보기 힘든 이름을 사용하게 된다면, 그 이름에 대해서 찾아보는 시간이 오래걸리게 될 것이고 그것은 곧 전체적인 프로그래밍 시간을 길게 만들 것이다.pin nami
외부 인터럽트의 핀을 설정해준 뒤에, Callback함수 내용을 수정해준다.기존의 Callback 함수임의로 만들어준 Callback 함수인터럽트가 발생하여 printf()로 찍어준 모습
절전모드에 대해서Stm32에서는 sleep, stop, standby 3가지의 절전모드를 지원한다.각각 sleep, stop, standby 로 점차 전력소모가 더 줄어들게 된다. (sleep이 전력소모가 가장 많다.)sleep modeSleep mode는 WFI 또는
위 코드는 sleep mode에 들어갈때 입니다.먼저, pin reset을 해주고 난 뒤에 sleep mode로 들어갑니다.sleep mode를 실행할때 먼저 SysTick을 중단합니다.그 뒤에 clock설정을 해주고나서 sleep 모드로 들어갑니다.<Systic
위 코드는 stop mode에 들어갈때 입니다.먼저, pin reset을 해주고 난 뒤에 stop mode로 들어갑니다.stop mode로 들어갈때의 코드는 sleep mode와 비슷합니다.stop mode에서 빠져나올때는 sleep mode와 다르게 clock과 전압
위 코드는 standby mode에 들어갈때 입니다.pin reset을 해주고 난 뒤에 stop mode로 들어갑니다.5초를 대기한 뒤에 standby mode에 들어갑니다.그 뒤에 clock 설정을 해주고 standby mode로 진입합니다.wakeupstandby
push pull에 대해서push-pull 출력 포트는 2개의 TR로 구성된다.아래쪽의 NPN TR(N-MOS)이 pull을 담당하고, 위쪽의 PNP TR(P-MOS)이 push를 담당한다. 단어의 의미를 생각해 보면 쉽게 이해할 수 있다.NPN TR은 GND쪽으로 끌
open drain에 대해서이름 그대로 collector 혹은 drain 핀이 외부로 노출(open)되어 있다.Push-pull 출력단과 달리 밀어올려주는(PUSH) 위쪽 절반이 없다. 더군다나 VCC나 VDD와도 전혀 연결되어 있지 않다. 반쪽짜리 미완성 회로인 것이
새 프로젝트 생성create new project 창이 뜨면 Empty project를 클릭하고 ok를 누른다.소스파일 생성File -> New -> File 를 선택하면 새로운 텍스트 문서창이 열리며 Untitled1, Untitled2… 등으로 기본 파일이 생성된다
위와 같이 코드를 작성하여 디버그를 진행해보았습니다.<참고 단축키> \- Download & Debug -> ctrl + D \- Stop Debugging -> ctrl + shift + D참고자료https://jwprogramming.tistor
<과거>MCU에 문제가 생기면 기계가 제대로 돌아가지 못할 수 있다. 이렇게 되면 위험한 상황이 생길 수 있기 때문에 MCU의 신뢰성은 굉장히 중요한 요소가 된다.그렇기에 많은 기업에서 신뢰성이 있는 STM32 보드를 사용한다.<문제>그러나, 최근 반도체 문
STM32 작성 방법먼저, Giga Device가 STM32보드와 매우 유사하니, STM32에서는 어떻게 코드를 작성 했었는지 살펴보겠다.옛날에는 IAR에서 Project를 만들어서 impor를 하고 진행했다. (STM HAL Library 이용)요즘에는 STM32 C
online programmingPC를 연결해서 PC에서 파일을 열어서 Writing하는 것(보통의 방식이며, ST Link 사용해서 ST Programmer로 Writing한 방식)Offline programming PC 없이 장치에 download 해두면 장치만 꽂
문제 원인위와 같은 오류가 발생하는 이유는 라이선스 확인에 실패한 경우이다.IAR 라이센스 관리자를 사용하여 문제를 해결하라고 하는데보통은 동글이 없는 경우, 혹은 용량제한버젼이나 30일 사용버젼을 사용하는 중 라이센스코드 등록을 안한 경우가 이에 해당한다.해결Help
문제 상황PC에 GD를 연결하고 IAR에서 Project/Download and Debug 버튼 클릭을 하면 에러창이 뜨게 된다.현재의 IAR option 상태<Debugger의 상태><General Options의 상태>참고로 현재 GD는 GD32F450Z
문제상황\_1STM32CubeMX 에서 Code Generation 를 진행하는데 아래와 같은 오류가 발생했다.<해결>STM32CubeMX를 다운그레이드 함으로써 문제를 해결했다.참고로 이때 Java Runtime Environment 1.7.0_45를 요구한다.
GD를 프로그래밍 하는 과정1) STM32CubeMX 를 이용.ioc 파일 생성Code Generation을 한다.2) IAR Embedded Workbench IDE를 실행한다.앞서 STM32CubeMX를 이용해서 만든 파일의 Project를 실행시킨다.옵션을 Gig
먼저 Visual Studio Code를 설치해줍니다.File>Open Folder로 이동하고 IAR Embedded Workbench 프로젝트가 포함된 폴더를 선택합니다.VS Code에서 코드를 변경하고 IAR Embedded Workbench IDE로 가서 확인해보
아래와 같은 오류가 발생했을 경우, 먼저 문자열 종류에 대해서 알고 있어야 합니다.크게 두가지로 나뉘는데 const char \* 의 형태를 가지는 Strinjg literals와 char의 형태를 가지는 Character literals가 있습니다.Strinjg li
소개STM32CubeIDE에서는 잘 돌아가던 I2C가 IAR에서 진행할때는 아무런 동작도 하지 않는 이슈가 발생했다.해결문제 원인은 STM32CubeMX에서 IAR로 Code generation 하면서 일부 코드가 사라짐에 따라서 발생한 문제이다.위처럼 처음 Code
소개IAR 디버그를 진행하다보니 아래와 같은 오류가 발생했다.계속해서 오류가 발생하는 구간을 따라가보니 USART2 핸들러 부분이였다.원래 저 부분에는 따로 코드가 아래 사진처럼 들어가야했는데, 삭제가 된 모습이 보였다.중간중간 본인 스스로 삭제가 되어서 발생한 모양이
최근 STM 라이브러리에서는 아래와 같은 함수들을 제공해준다.Write&hi2c2 -> I2C 핸들러의 주소AT24C256C_addr -> I2C Slave의 주소0X0001-> I2C Slave에서 쓰기 할 레지스터의 주소2 -> 주소의 바이트 수 (1byte ->
TransmitHAL_SPI_Transmit()함수는 slave장치로 전송하는 역할을 한다.(uint8_t\*) &transmitDatas -> Data 버퍼의 포인터ReceiveHAL_SPI_Receive()함수는 데이터를 받는 역할을 한다.추가적으로 SPI통신을 진
모듈모듈이란 프로그램을 구성하는 시스템을 기능 단위로 독립적인 부분으로 분리한 것이다.모듈화모듈화 프로그래밍이란 이런 기능적인 분리를 통해서 다른 프로그램을 개발할 때에도 유지보수와 코드 재사용성을 높여 소프트웨어를 설계하는 기법을 일컫는다.모듈화 프로그래밍하나의 소스
위 사진처럼 stm32f4xx_it.c 파일에서 설정을 해주어야 한다.if ((HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE) != RESET) && (HAL_UART_GET_IT_SOURCE(&huart2, UART_IT_RXNE) !
소스코드를 보다보면, 아래처럼 \_\_init형태로 되어있는 함수를 확인할 수 있습니다.함수 이름 앞에 init이라고 되어있거나, 변수 이름 뒤에 initdata라고 적힌 것은 해당하는 함수나 변수가 운영체제의 초기화 과정에만 사용된다는 것을 의미합니다.
Malloc이란 동적 메모리 할당 이다.프로그램은 실행될때 메모리의 일정 영역을 사용한다.동적 메모리가 할당되는 기억 공간은 힙(heap)에 있다.힙메모리의 생존 기간은 프로그램이 종료될때까지 이므로 특정 함수에 구속받지 않고 어디서나 참조하여 사용할 수 있다.즉, 힙
Byte Write로 값을 보내줄때HAL_I2C_Mem_Write()를 사용하여 진행위의 사진은 HAL_I2C_Mem_Write()을 이용해서 0X39 데이터를 보낼때 오실로스코프 파형을 관찰한 모습이다. (타 블로그에서 가져옴)Byte Read로 값을 읽어올때HAL_
관련 HAL 함수 소개Master I2C 모드에서 인터럽트와 함께 non-blocking mode에서 데이터 양을 순차적으로 전송해당 인터페이스는 통신 전송중에 방향이 바뀔때 repeated start를 사용할 수 있다.I2C handl의 상태를 리턴한다.통신 전송중에
Restart가 어디에 사용되는가?Restart는 I2C Master에서 명령을 보낸 뒤에 I2C의 Stop 없이 I2C Slave로부터 데이터를 읽는데 사용된다.Restart를 사용하는 이유Restart를 사용하는 것은 I2C 통신에서 I2C Master가 2개 이상
소개포팅 작업을 진행하다가 아래와 같은 오류가 발생했습니다.원인문제의 원인은 내가 그 함수를 선언하기 전에 해당 함수를 사용했기 때문에 발생한 오류<문제 상황><해결>위처럼 함수의 선언 위치를 바꿔줌으로써 문제를 해결했습니다.
"Options / Load Configuration..."을 클릭한다.해당 부분에 내가 적용할 다크모드 파일을 넣는다. (다크모드 파일은 인터넷에 검색하면 많이 나온다.)"Options / Preferences..."를 클릭한다.Window Background를 클릭
보통의 물리KEY의 회로는 아래 사진과 같은 형태로 되어있다.전압 인가는 보통 5V 혹은 3.3V인데, 내가 보는 회로도는 3.3V로 되어있다.스위치가 하나하나 눌릴때마다 전압 분배로 계산하면 아래 사진에 적힌 식과 같은 형태로 전압값이 구해지게 된다.
CAN(Controller Area Network)이란, 차량 내에서 호스트 컴퓨터 없이 마이크로 컨트롤러나 장치들이 서로 통신하기 위해 설계된 표준 통신 규격차량 내 \*ECU(Electronic control unit)들은 CAN 프로토콜을 사용하여 통신<CA
MCU, CAN Transeiver 종류MCU (2개) -> STMF46RECAN Transeiver -> MCP2551회로 연결 형태TXD : MCU의 TX와 연결 (MCU의 TX pin : PD0)RXD : MCU의 RX와 연결 (MCU의 RX pin : PD1)
CAN 버스에 연결된 통신 장치들은 모두 같은 속도여야 통신이 된다.그렇기에, CAN 통신에 있어서 통신 속도는 매우 중요하다.(CAN 통신에 있어서 가장 고려해야 하는 것은 ID와 통신 속도이다.)CAN 통신은 1비트 타임에 대한 설정을 하는 방식으로 통신 속도를 결
[CAN Remote Frame_Standard Frame] 메시지 ID 11 Bit (과거에는 충분한 크기의 범위였지만 자동차가 보다 전장화됨에 따라 메시지가 더 많이 필요해져서 더 넓은 메시지 ID의 범위를 가진 프레임이 필요하게 되었다. 이와 같은 이유
CAN은 하드웨어 레벨에서 원하는 ID의 데이터만 수신할 수 있는 Filter 기능이 있다.CAN은 다수의 장치가 하나의 통신 라인에 연결되기 때문에 각 장치마다 고유의 ID를 부여해야 한다.다수의 장치의 데이터를 수신하는 ECU나 어떤 장치는 설정된 ID가 보내는 데
pin map 링크 : https://os.mbed.com/platforms/ST-Nucleo-F446RE/TXD -> MCU의 CAN1_TX와 연결RXD -> MCU의 CAN1_RX와 연결CANH -> 다른 CANH와 연결CANL -> 다른 CANL와 연결&
STM32CubeIDE에 접속하여 프로젝트를 생성한 뒤에 가지고 있는 stm 보드를 입력하여 선택합니다.이때 필자의 경우 STM32F446RE를 사용하였기에, 아래 사진처럼 설정을 해줍니다.CAN Pin 설정PB8 -> CAN1_RXPB9 -> CAN1_TXClock
teraterm 로그에 시간이 필요한 경우에는 아래와 같이 따른다."C:\\Program Files\\teraterm" 경로에 있는 "TERATERM.INI"파일을 연다.아래의 내용처럼 "LogTimestamp"을 "on"으로 코드 수정한다.메뉴 탭에서 setup >
맥북 coolterm 다운로드“options/serial port/”에서 port와 baudrate 설정(화자의 경우 아래와 같이 설정)“options/receive/”, “options/File Capture/”에서 아래와 같이 설정(해당 방식은 두 가지 방식이 있다
이름이 같은 파일 여러개를 실행시킬 때, 간혹 내가 언제 만들었던 것인지 헷갈릴 때가 있다. (.bin 파일과 같은)이럴 때, md5파일을 통해 해쉬값을 확인하면 정확하게 파악할 수 있다.md5를 생성하고싶은 파일 위치로 이동해당 파일에서 터미널 오픈아래와 같이 입력해
gsensor에 대해서 :gsensor을 통해서 얻는 data : 가속도값계산 방식에 대해서 :출력한 gsensor 값의 단위를 바꾼다. (LSB/g → m/s^2)계산 공식 : $(gsensor data / 256) \* 9.81$ 가속도값을 2번 수치적분 하여
tera term을 사용해서 장치에 문자로된 명령을 보낼 수 있다."Control / Broadcast command" 클릭Realtime mode 체크해제, Send to this process only 체크내용 작성 및 "Submit" 클릭글 작성자가 운영 중인 홈
visual studio에서 "alt+right/left 키"를 클릭하면 이전 혹은 이후에 봤던 부분으로 이동해야 하는데, 이런 기능이 적용 안될 때가 있다."도구/옵션" 클릭"환경/키보드" 클릭, 추가 키보드 매핑 구성표에 "Visual Studio Code" 적용글