[STM32] CAN2.0 통신 구현 시 주의사항
·
Embedded SW/STM32
해당 피드는 STM32 환경에서 CAN 통신을 구현하며 신경 썼던 부분들을 정리한 것이다.STM32F103RB 보드를 바탕으로 진행하였으며, reference manual의 bxCAN 내용을 바탕으로 작성하였다.- bxCAN은 CAN2.0 버전임CAN 통신은 GND 연결이 필요 없다.Tx는 Tx끼리, Rx는 Rx끼리 연결해야 한다. (UART의 Tx Rx 개념이랑 다르다)CAN Tx : CAN 송신 (MCU ↔ 트랜시버 간)CAN Rx : CAN 수신 (MCU ↔ 트랜시버 간)CAN_H : CAN 차동 신호 High (다른 장치 간)CAN_L : CAN 차동 신호 Low (다른 장치 간)양 끝 MCU의 CAN 통신에는 종단 저항을 무조건 달아주어야 한다.종단 저항 사이에 다른 CAN 기기들이 연결될 수 ..
[STM32] FW와 부트로더 분리하기
·
Embedded SW/STM32
STM32F103xx 시리즈에서는 BOOT 모드를 제공한다따라서, DFU 기능을 활용해 펌웨어와 부트로더를 분리할 것이다.FLASH 메모리로 128K를 사용할 수 있으니 펌웨어의 128K 중 20K를 부트로더 메모리로 사용할 것이다. 사전 준비1. 이전의 프로젝트를 복사한 뒤, 새로운 경로에 부트로더 이름으로 복사한다.2. 이전에 lib에 ioc 파일을 복사했었는데, 해당 폴더에 들어가보면 .mxproject 폴더가 있다. 여기를 확인해보면 이전에 fw_pjt에서 사용했던 헤더들이 복사되어 있는데, _boot 프로젝트에서 .mxproject를 삭제하지 않으면, fw_pjt에 영향을 주게 된다. 따라서, .mxproject를 삭제한다.펌웨어(fw_pjt) 측1. 인터럽트 벡터 주소와 링커 스크립트를 변경해..
[STM32] LED API 생성하기
·
Embedded SW/STM32
제조사의 보드에 맞게 LED를 제어할 수 있는 API를 만들어보자. 첫번째 스텝우선, common/ 폴더에 hw/include/ 폴더 아래에 led.h 헤더파일을 생성하자.까먹지 말고, include path에 추가해주어야 한다. 이후, 제어 함수를 헤더 파일에 정의해주자.하드웨어 관련 API를 다룰 땐, `#include "hw_def.h"`를 꼭 해주자. 왜냐하면, hw_def.h에다가 bsp.h와 def.h를 정의해줬기 때문임여러 LED 제어를 위해 구분을 지어주자. MAX_LED_MAX_CH는 hw_def.h에서 정의해준다.이후, `hw_def.h`에서 HW_LED_MAX_CH를 정의해준다. 이렇게 함으로써 led 개수를 수정하고 싶을 땐, led.h는 건들 필요 없이 hw_def.h에서 해당 변..
[STM32] CubeMX를 이용해서 HAL 라이브러리 적용하기
·
Embedded SW/STM32
※ 생성되는 HAL 파일들은 이전에 생성된 lib 폴더 아래에 들어간다. CubeMX란 : 자동화된 코드를 생성해주는 툴 여기서 본인이 사용하는 패키지 버전을 다운로드 할 수 있다.프로젝트를 생성한 다음, 먼저 저장을 해 줄 건데 .. 이전에 생성했던 프로젝트의 lib 폴더 아래에 저장을 해주자ex) .\stm32f103xx_fw_pjt\src\lib/cube_f103xxProject Manager에서 IDE를 변경해준다. 우리는 STM32CubeIDE를 사용하기 때문이다.Code Generator에서 Generated files의 Generate peripheral 박스를 체크해주자. 이유는 페리페럴을 설정하는 모든 코드가 main에 들어가기 때문에 참조가 어렵다.이렇게 Generate를 완료한다면, ..
[STM32] 프로젝트 개발 환경 세팅하기
·
Embedded SW/STM32
STM32 프로젝트 생성 방법에 대해서 알아보려고 한다. 필자는 STM32F103RB 보드를 사용했다.프로젝트 생성STM32CubeIDE를 사용하여 새로운 프로젝트를 생성해 볼 것이다.Project Explorer -> 마우스 우클릭 -> New -> STM32 Project 선택이후, 본인이 사용하는 보드를 검색하여 찾은 다음, 프로젝트를 생성한다.프로젝트 이름을 설정하고, 옵션을 세팅해주면 된다. Cube에서 제공해주는 타입을 사용할 것이라면 STM32Cube에 체크하자. (본인은 사용하지 않을 것이라 Empty 체크) 프로젝트 폴더 재구성초기에 프로젝트 생성하면 Inc, Src, StartUp, 링커 파일이 생성될텐데 폴더 구조를 바꿀 것이다.1. 모든 파일을 외부로 빼주고 폴더 삭제해준다.2. 폴..
[ 프로그래머스 / 2020 KAKAO BLIND RECRUITMENT ] 자물쇠와 열쇠 (C++)
·
PS/프로그래머스
프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 난이도 : Level 3 알고리즘 유형 : 완전탐색, 슬라이딩 윈도우 풀이 시간 : 44분 문제 풀이 "튜브"는 자물쇠로 잠긴 비밀의 문을 열쇠로 열려고 한다. 열쇠와 자물쇠는 돌기(1)와 홈(0)이 있고, 열쇠는 회전과 이동이 가능하다. 자물쇠를 열 수 있다면 true, 열지 못한다면 false를 출력하자. 문제를 풀기 전, 조건을 먼저 확인해보면 $key ≤ 20$, $lock ≤ 20$인 것을 확인할 수 있다. 이를 토대로 완전탐색 기준의 시간복잡도를 계산해본다면, $O(4 * 2 * 400 * 400)$으로 제한시간 내에 문제를 해결할 수 있을 것이..
[ 프로그래머스 / 2021 카카오 채용연계형 인턴십 ] 거리두기 확인하기 (C++)
·
PS/프로그래머스
프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 난이도 : Level 2 알고리즘 유형 : BFS, 우선순위 큐풀이 시간 : 22분 문제 풀이 코로나 바이러스 감염 예방을 위해 모든 응시자들은 대기실에서 거리를 두고 앉아야 한다.1. 대기실은 총 5개이며, 각 대기실은 5 x 5 크기입니다.2. 응시자들끼리는 맨해튼거리가 2 이하로 앉으면 안된다.3. 응시자의 자리 사이 파티션이 존재한다면 앉을 수 있다.각 대기실별로 거리두기를 지키고 있는지 여부를 출력하자. 문제의 풀이는 간단하게 BFS로 풀어낼 수 있다. 칸의 수가 5 x 5 x 5이기 때문에 각 칸마다 BFS를 수행해도 시간초과가 발생하지 않는다...
[ 백준 / 14718 ] 용감한 용사 진수 (C++)
·
PS/백준
https://www.acmicpc.net/problem/14718 난이도 : 골드 4 알고리즘 유형 : 브루트포스 풀이 시간 : 39분 문제 풀이 N명의 적 병사가 있다. 적 병사는 힘, 민첩, 지능 세가지 스텟을 보유하고 있고 진수가 적의 세가지 스텟보다 높은 스텟을 갖고있다면 그 적 병사를 이길 수 있다.적어도 K명의 병사를 이길 수 있게 하는 최소한의 스탯 포인트를 구하여라. 먼저, 해당 문제를 재귀함수로 접근하게 된다면 $O(100^{100})$으로 시간초과가 발생하게 된다. 그러면 어떻게 완전탐색으로 문제를 풀어낼 수 있을까 ?? 정답은 세가지 스탯에 대한 모든 조합을 기준으로 판별하면 된다. $병사의 수 ≤ 100$이기 때문에 병사의 모든 스탯 조합을 짜게 된다면 3중 for문으로 $O(10..
[ 프로그래머스 ] 아이템 줍기 (C++)
·
PS/프로그래머스
프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr 난이도 : Level 3 알고리즘 유형 : BFS 풀이 시간 : 39분 문제 풀이 다각형 모양 지형에서 아이템을 줍기 위해 이동하려 한다. 겹쳐진 다각형의 둘레를 따라 이동할 수 있으며, 바깥쪽 테두리로만 이동이 가능하다. 아이템을 줍기 위한 최단 경로를 출력하자. 먼저 문제의 조건을 확인해보면, 입력 좌표는 최대 50까지 들어온다. 그렇기 때문에 다음과 같은 풀이 순서로 간단하게 풀어나갈 수 있다.1. 입력 직사각형을 grid에 입력하기2. BFS 진행하면서 다른 직사각형인 경우, 이동하기 여기서 문제가 되는 부분은 2번 조건을 어떻게 해결할 것인가 ? ..
[ 백준 / 17136 ] 색종이 붙이기 (C++)
·
PS/백준
https://www.acmicpc.net/problem/17136 난이도 : 골드 2 알고리즘 유형 : 백트래킹  풀이 시간 : 47분 문제 풀이 색종이는 1 ~ 5 사이즈의 정사각형 크기를 갖고 있고, 크기마다 5장씩 보유하고 있다. 10 x 10 격자에 1이 적힌 모든 칸을 붙이는데 필요한 색종이 최소 개수를 구하자. 해당 문제는 큰 부분부터 가리면 될 것이다라는 그리디 사고 + 백트래킹 알고리즘을 사용하면 된다.시간복잡도를 계산해 보았을 때, 이론적으로는 최대 1의 개수는 100개이기 때문에 최악의 경우 $O(5^100)$이지만, 실제로는 문제 내에서 가지치기가 많이 일어나기 때문에 결과론적으로는 시간 내에 수행이 가능하다. (시간복잡도 정확한 계산을 아시는 분이 있으시다면 .. 도움을 ....)..