제 강의가 도움이 되었으면 좋겠습니다~ 현재 오프라인 강의 모집중이니 관심있으시면 엠하이브 네이버카페 cafe.naver.com/mhiveacademy 에서 확인부탁드립니다! :)
@영인박-l4i Жыл бұрын
항상열심히보고 배우는 유트버 입니다 항상 정확한 정보와 데이터로 많은걸 배우고 있으며 감사드립니다 혹시 STM32 RTOS(FREERTOS) 관련되서도 강의 영상 부탁드리고 싶습니다
@ChrisWonyeobPark Жыл бұрын
안녕하세요! 좋은 말씀 감사합니다. 아쉽지만 저도 freeRTOS를 다뤄본 것이 아니어서 강의계획에는 없습니다. 단, 유튜브 검색을 조금 해보시면 괜찮은 freertos 강의가 있으므로, 해당 영상들을 찾아보시는 것을 추천드립니다. 특히 ST 공식 영상을 따라해보시는 것도 좋을 것 같습니다. 음성은 영어이지만 한글 자막이 지원되는 버전도 있는 걸로 알고있습니다.
@@영인박-l4i 아이고 감사합니다~!! 근데 아쉽지만 freertos 강의를 만들려면 저도 공부를 해야하는지라, 쉽진 않을 것 같습니다ㅠ 저도 공부해보고 싶긴 하네요!
@memol0515 Жыл бұрын
이번에 맡게된 프로젝트가 STM32 보드를 이용하여 CAN통신 구현하는 프로젝트인데 2주동안 꽁꽁 머리 싸매다 덕분에 해결했습니다 정말 감사합니다. 복 많이 받으세요!
@ChrisWonyeobPark Жыл бұрын
와 제 강의가 도움이 되었다니 다행입니다~ 앞으로도 즐거운 STM32 개발 되시기 바라며 더 도움이 되길 바라겠습니다!
@bluemakerlee3 жыл бұрын
고생하셨습니다. 일부러 시간 쪼개서 하는 작업이실텐데.. 덕분에 많은 도움 되었습니다.
@ChrisWonyeobPark3 жыл бұрын
매번 좋은 말씀 감사합니다! 처음 시작할때 도움이 될 수 있도록 강의를 구성했는데 어려움 없이 진행하실 수 있기 바라겠습니다~
@엄마얘또흙머거3 жыл бұрын
can에대해 정말 공부가 많이 되었습니다. 정말 감사합니다.
@ChrisWonyeobPark3 жыл бұрын
안녕하세요! 도움이 되었다니 다행입니다~ 즐거운 STM32 개발되세요!
@leesohaeng3 жыл бұрын
정말 많은 도움이 되었습니다. 감사합니다.
@ChrisWonyeobPark3 жыл бұрын
도움이 되었다니 다행입니다~ 즐거운 STM32 개발 되세요!
@seonhohwang50262 жыл бұрын
감사합니다. 모든 강의를 시청만 했는데, 노트필기와 Coding하면서 여러번 복습해야 하겠습니다. 다시 한번 감사드립니다
@ChrisWonyeobPark2 жыл бұрын
안녕하세요! 제 강의가 도움이 되었으면 좋겠네요~ 좋게 봐주셔서 감사합니다!
@seonhohwang50262 жыл бұрын
@@ChrisWonyeobPark 감사는 제가해야죠. 요번에는 꼭 해내고 싶습니다.
@망고사장-d8g Жыл бұрын
안녕하세요 선생님의 강의를 통해 많은 도움을 받고 있습니다. 저는 아두이노 우노에서 can 통신을 통해 정보를 전송해서(아두이노들 사이의 can통신은 원활함) stm32에서 수신할 수 있는 코드를 작성하고 있는데 어째서인지 선생님과 똑같이 코드를 작성하였는데도 인터럽트 함수가 실행이 되지 않는 것 같습니다.. ㅜㅜ while (1) 문 안에 if(can1_rx0_flag)가 실행이 안 되는 것 같은데 선생님과 다른 점은 제가 cubeide를 사용해서인지 can.c 파일이 생성되지 않아 main.c에 코드를 작성한 것 입니다. 혹시 저가 어떤 부분을 놓치고 있는지 여쭤 볼 수 있을까요?
@ChrisWonyeobPark Жыл бұрын
안녕하세요. 우선 " cubeide를 사용해서인지 can.c 파일이 생성되지 않아" -> 이 이슈는 cubeIDE의 CubeMX를 실행하시면 Project Manager 탭이 있는데, Code Generator 에서 Generate peripheral initialization... 항목을 체크해주시면 페리페럴별로 .c 파일이 생성됩니다. can 통신이 안되는 이유는 다양할 수 있으나 가장 먼저 확인하셔야 할 것은 메시지의 필터 설정에 의해 필터링 되지 않았는지 일 것 같습니다. 강의에서는 특정 메시지 ID 만 수신할 수 있게 설정하였기 때문에, 그 외의 ID의 메시지는 아예 수신되지 않습니다. 모든 ID의 메시지를 허용하시려면 필터마스크ID와 필터ID를 변경하셔야 합니다. 해당 내용은 강의안에 설명되어있으니 확인해보세요!
@걔미-v8z8 ай бұрын
혹시 성공하셨나요? 저도 canpro랑 stm이랑은 되는데 같은 버스 내에 아두이노는 인식을 못하네요(아두이노끼리 서로 통신은 또 됩니다..) ㅋㅋ 걸리는건 아두이노에는 MCP_8MHz 속도란게 있던데 이게 문제일까요?..
@ericmoon68996 жыл бұрын
안녕하세요 ChrisP 님 STM32 로 갈아타면서 접근에 어려움이 있었데 올려주신 강의 보면서 많은 도움이 되었습니다. 그동안 애쓰셨습니다. 덕분에 Project 무사히 완료 하였습니다. 감사드림니다.
@ChrisWonyeobPark6 жыл бұрын
오~ 제 영상들이 도움이 되었다니 저도 뿌듯합니다! 중간에 ETH랑 CAN 설명할때 저도 개념이 잘 안잡혀서 어떻게 설명해야하나 막막했는데 하면서 저도 공부도 되고 좋았네요 ㅎㅎ 그래서 좀 많이 딜레이 되기도 했지만.. 제 부족한 영상들 봐주셔서 감사합니다! 그리고 프로젝트 잘 완료하셨다니 저도 기쁘네요 ㅎㅎ 그럼 언젠가 또 재밌는 영상으로 뵙겠습니다. 감사합니다!
@hoo_chuchu_09016 жыл бұрын
잘 보고 갑니다
@ChrisWonyeobPark6 жыл бұрын
봐주셔서 감사합니다!
@조수완-r7yАй бұрын
영상에 나오는 can.c와 can.h 파일은 어디에 있는 자료인가요??
@ChrisWonyeobParkАй бұрын
안녕하세요. can.c와 .h 파일은 cubemx에서 자동으로 생성해주는 파일입니다. cubemx 설정에서 .c와 .h 파일을 생성하는 옵션을 체크한 후에 코드생성을 하시면 자동으로 생성됩니다.
@koker86612 жыл бұрын
안녕하세요 임베디드 처음 하고 강의 듣다 궁금한게 있어 질문 올립니다. 제가 SCAN이라는 RS232 to CAN converter를 사용하는데, 여기서 MCU에서 나오는 CAN 통신을 받기 위해서 MCU 측에 트랜시버를 사용해야 할까요?
@ChrisWonyeobPark2 жыл бұрын
안녕하세요! MCU에서 출력되는 CAN 통신 신호는 실제 CAN 버스에서 사용되는 신호가 아닙니다. 따라서 MCU 와 CAN 버스 사이에는 CAN 트랜시버가 필요합니다. PC - RS232 to CAN(모듈 내부에 트랜시버 존재) - CAN 버스 - CAN 트랜시버 - MCU 이렇게 연결되겠죠.
@koker86612 жыл бұрын
@@ChrisWonyeobPark 만약 MCU에서 보내는 신호를 보고 싶은거여도 트랜시버가 필요할까요? 예를들어 MCU - 트랜시버 - Can to rs232 (컨버터) - PC 이런식이요
@ChrisWonyeobPark2 жыл бұрын
@@koker8661 MCU에서 보내는 CAN 데이터를 PC에서 읽고싶으신건가 보네요. 어쨌든 CAN to 232 모듈에서 CAN 버스를 통한 신호를 입력받을거기 때문에, MCU에서 출력하는 CAN Tx Rx 신호를 바로 입력받을 순 없습니다. 따라서 트랜시버가 필요할겁니다.
@koker86612 жыл бұрын
@@ChrisWonyeobPark 답변 너무 감사합니다 카페도 자주 방문할게요 감사합니다
@ChrisWonyeobPark2 жыл бұрын
@@koker8661 네 감사합니다! 즐거운 STM32 공부되세요~
@이석규-m4p Жыл бұрын
영상 잘 봤습니다. 제가 stm32f4로 ECU랑 통신을 시도하는 중인데 영상과 똑같이 진행해도 MCU에서 수신이 안되더라구요 ㅠㅠ 연결은 ECU - can 트랜시버 - STM32 이렇게 연결했습니다. 혼자서 문제에 대해 알아보니 stm32는 little endian을 사용하기 때문에 ECU에서 big endian을 사용한다면 수신하는 데이터를 반대로 읽는다는 것을 알았습니다. 현재 ECU쪽에서 little endian으로 데이터를 전송하는 방법을 찾지 못해서 MCU에서 데이터를 수신할 때, mask filter와 filter를 의도적으로 반대로 사용하면 된다고 생각했습니다. 여기서 원래는 5bit만큼 쉬프트하던걸 어떻게 맞춰줘야 될지 궁금합니다 ㅠㅠ
@ChrisWonyeobPark Жыл бұрын
안녕하세요! 수신이 안됐다면 little, big endian과는 다른 문제일 것 같습니다. 먼저 주소 설정할 떄 모든 메시지를 다 받아들일 수 있도록 메시지 필터 ID와 마스크 필터 ID를 설정하신 후에 메시지가 수신되는지부터 확인해보세요. 그래도 안된다면 결선 등의 하드웨어적인 문제이거나 CAN 초기화가 제대로 이뤄지지 않았을 수 있습니다. little 또는 big endian은 메시지가 수신된 이후에 데이터를 디코딩할때 필요한 개념입니다. 메시지가 수신조차 되지 않았다면 현재는 고려하지 않아도 되는 문제일겁니다.
@정당근-z1n6 жыл бұрын
CubeMX 4.22로 CAN 통신 TX, RX를 다 짜놨는데, Ethernet 때문에 4.27로 바뀌면서.. 구조체가 변경됬더라구요. 일단 앞 강의만 봤는데, 정확하고 친절한 설명 감사합니다. 복받으실 겁니다. ^^
@ChrisWonyeobPark6 жыл бұрын
오 그런가요? 그런 정보 너무 좋은거 같습니다 ㅎㅎ 저는 제가 쓰는 버전에 대한거만 설명을 드렸는데 버전에 따라서 다른게 많아지나 보네요. 구조체가 바뀐거면 꽤 큰게 바뀐거 같은데 제 영상이 나중되면 old한 영상이 되겠군요.. 이러면 안되는데 ㅋㅋㅋ 전 ETH에 Lwip부분이 버전에 따라서 바뀐걸 보긴했습니다. 새로운 버전이 나올때마다 계속 바뀌면 ST 입장에서도 좋을건 없을텐데 걱정이 좀 되는군요 ㅎㅎ 강의를 준비하면서 최대한 정확한 정보를 드리려고 노력했었는데 그걸 알아봐주셔서 뿌듯합니다 ㅎㅎ 저도 감사드립니다~
@이석규-m4p Жыл бұрын
영상 보고 stm보드와 모터 컨트롤러와의 통신과 oled로의 출력은 성공했습니다. 그런데 컨트롤러 설정을 확인해봤더니, 하나의 ID로 여러개의 데이터를 보내고 있고 그 중에서 가장 첫번째 데이터만을 읽고 있습니다. 제가 필요로하는 데이터는 첫번째가 아닌 두번째 데이터입니다 ㅠㅠ 데이터가 can1RxData[]에 저장된다고 생각해서 []안의 숫자를 바꾸기도 해봤는데 잘 안됐습니다. 그래서 데이터가 어디에 저장되는지 그리고 어떻게하면 좋을지 질문 남깁니다!!
@ChrisWonyeobPark Жыл бұрын
답이 늦어서 죄송합니다. STM32의 CAN 에서는 한번에 최대 8바이트의 데이터가 전송되고 수신된 데이터는 제 강의에서는 uint8_t can1Rx0Data[8]; 배열에 저장되므로 해당 배열의 두번째 요소인 인덱스 1에 접근하시면 됩니다. 만약 그래도 원하지 않는 데이터가 읽혔다면 다른 이유가 있을겁니다.
@mjaysg2 жыл бұрын
안녕하세요. 특정 ID만 보내서 데이터를 받으려면 아래처럼 설정하면 될까요? canFilter1.FilterIdHigh = 0xFC
@ChrisWonyeobPark Жыл бұрын
안녕하세요. 네 list 모드로 하신 후 수신받을 ID를 넣어주시면 됩니다. mask모드로도 가능하긴 합니다만 list가 좀 더 편하겠죠.
@ByunJongHyun Жыл бұрын
안녕하세요. cubdIDE통해서 만들고 있습니다. 혹시, CAN_FilterTypeDef 등은 활성화가 안되어 있는데 어디에 설정을 만져야 할까요?
@ChrisWonyeobPark Жыл бұрын
안녕하세요! CAN_FilterTypeDef canFilter1; 등 CAN 통신에 사용되는 변수는, 제 강의에서는, can.c에 전역변수로 선언합니다. 강의를 천천히 보시면 설명되어있습니다.
@걔미-v8z8 ай бұрын
can통신 구현을 해보던 중에 막혀서 질문 드리고 싶습니다 ㅠ mcp2515(8mhz)사용하는 아두이노 uno 2개, stm보드 하나, realsys can pro 이렇게 4개를 한버스에 구성했습니다 아두이노 끼리도 서로 통신은 되고 stm보드랑 can pro랑도 되는데 얘네끼리는 서로 통신 안되는데 이유가 무엇일까요 넷 다 id 0x000, 필터도 전부 000으로 설정했고 bps 500k, std id 사용하는걸로 설정해주었는데 흠.. 제가 놓친게 있을까요?
@ChrisWonyeobPark8 ай бұрын
음 글쎄요 저도 뭐가 문제인지 감이 잘 안오는군요. 통신속도, std id 외에 다른 parameter들 설정도 문제없는지 확인해보시고, 혹시 모르니 모두 같은 CAN 트랜시버로 통일해보시고 MCU도 uno로 통일하던지 stm32로 통일하던지 해보시는 것도 좋을 것 같습니다. 통신이 아예 안되는 것은 아니라서 문제는 금방 해결되지 않을까 싶네요!
@양양재용-p1j Жыл бұрын
만약 수신 되는 CAN이 2개 라면 CAN DATA 중복되어 저장 되는데, 각 CAN ID별로 DATA를 저장 하는 방법이 있나요? EX) CAN ID = 0x1CFF3031의 8BYTE는 CAN RX DATA 1 배열에 저장 하고, CAN ID = 0x18FF7850의 8BYTE는 CAN RX DATA 2 배열에 저장 하고 싶습니다. 현재 HAL_CAN_GetRxMessage(&hcan, CAN_FILTER_FIFO0, &CAN_RX_HEADER, &CAN_RX_DATA[0]); 사용시 모든 수신된 CAN DATA는 CAN_RX_DATA에 저장 되며, 각각 DATA를 저장하고 처리 할려니 계속 0x1CFF3031와 0x18FF7850의 CAN DATA가 중복되서 처리 하기 힘드네요 ㅠ
@ChrisWonyeobPark Жыл бұрын
여러 방법이 있을 수 있어서 몇 가지를 확정한 후에 진행해야 할 것 같습니다. - 메시지 수신모드를 MASK 모드로 할건지 LIST 모드로 할건지 - 수신된 메시지를 구분할 때 다른 FIFO로 사용할건지, 인터럽트에서 별도의 데이터 배열에 저장할건지 상황에 따라 다르겠지만 만약 저라면, 1. 만약 질문처럼 딱 두 ID의 메시지만 수신받으실 거라면 LIST 모드로 사용하고, 2. 메시지가 수신되면 void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) 함수안에서 메시지의 ID를 확인하고 (canTxHeader.StdId 변수) 3. 두개의 임시배열을 선언해서 ID마다 각각 다른 배열에 8바이트 데이터를 저장할 것 같습니다. 이 방식은 하나의 FIFO만 사용하는 방식입니다. 데이터 수신 속도가 빠르다면 FIFO를 여러개 써야할 수도 있는데, 그 방법은 사용해보진 않았습니다. 생각해보면 매우 쉬운 과정입니다. 수신된 메시지의 ID는 canTxHeader.StdId 여기에 저장되어있으니, 이를 확인해서 별도의 배열에 저장하면 됩니다.
@pusatberk41935 жыл бұрын
where is the can lib????
@ChrisWonyeobPark5 жыл бұрын
Hi Do you mean HAL library? There is no just "can library". You can find CAN library that belongs to HAL driver. Please search on www.st.com
@BlueCircle-q6v3 жыл бұрын
안녕하세요. 영상 잘 보았습니다. 궁금한게 있는데 CAN2를 사용하게되더라도 동일하게 세팅하면 되는지 궁금합니다.
@ChrisWonyeobPark3 жыл бұрын
안녕하세요! CAN1과 CAN2가 다른게 있었던 것으로 기억하긴 하는데, 기본적인 사용법은 제 강의처럼 같을겁니다. 타임퀀텀 설정이나 메시지 패킷 구조 등은 크게 달라지진 않을거에요~
@jungukko11463 жыл бұрын
CAN 통신을 위해서는 BUS 상에 CAN H, CAN L 을 연결해야하는데요, 혹시 연결에 편리한 커넥터 같은게 있을까요?
@ChrisWonyeobPark3 жыл бұрын
안녕하세요! CAN 통신에 정해진 케이블 규격은 찾아보진 않았고, 차량용 통신에서는 OBD-II 에서 쓰이는 커넥터와 케이블이 사용되는 것 같습니다. 단거리 통신이라면 일반 피복전선으로도 가능할 것 같고, 거리가 좀 된다면 보통은 쉴드처리되어있는 twisted-pair 선이 사용되는 것으로 알고있습니다.
@miracle47082 жыл бұрын
안녕하세요 유익한 영상 너무 감사드립니다. 근데 하나 궁금한게 있는데 구조체로 정의한것 중에 uint32_t FilteridHigh라고 선언 되어있는데 이 비트는 0x00~0x7FF까지 못쓴다고 적혀있는데 어째서 32비트 자료형으로 선언되어 있는거죠?
@ChrisWonyeobPark2 жыл бұрын
안녕하세요! 영상이 도움이 되었다니 다행이네요~ 질문은 uint32_t FilteridHigh 변수를 왜 uint16_t로 선언하지 않고 uint32_t 로 선언하는지 인 것 같습니다. CAN 통신 설정 시, FilterScale을 CAN_FILTERSCALE_16BIT 또는 CAN_FILTERSCALE_32BIT 중 하나를 선택해서 사용하게 됩니다. 강의에서는 CAN_FILTERSCALE_16BIT 를 사용하기 때문에 uint32_t FilteridHigh 의 상위 16bit를 사용하지 않지만 만약 CAN_FILTERSCALE_32BIT 를 사용한다면 필터의 길이도 32bit가 되어야 합니다. 따라서 제 생각엔, HAL 드라이버의 범용성을 위해(?) uint32_t FilteridHigh 로 선언된 것 같습니다.
@ChrisWonyeobPark2 жыл бұрын
아 제가 CAN 통신을 강의처럼 사용해본것 밖에 없어서 어쩌면 다른 이유가 있을지도 모른다고 생각이 드는데요, 어쩌면 16BIT 모드로 했을 때는 상위 16비트가 하나의 필터로 동작하고 하위 16비트가 또 다른 하나의 필터로 동작할 수도 있습니다. 그 내용은 데이터시트를 좀 더 찾아봐야 할 것 같네요~
@k1seo1173 жыл бұрын
혹시 can annalyzer 어떻게 사용하신건가요?? 보고 같은 제품인지 모르겠지만 샀는데 작동을 안해서 (포트 인식은 하지만 led가 안 들어옵니다 ㅠ) 펌웨어를 넣줘야하는건지 혹시 초기설정 어떻게 하셨는지 궁금합니다.
@ChrisWonyeobPark3 жыл бұрын
안녕하세요! 제가 산건 CANTACT 라는 제품인 것 같은데, 이게 오픈되어있어서 카피제품이 많습니다. 그리고 사용자가 직접 펌웨어를 넣어주어야 하는데, 부트모드 진입이 안되는 경우가 있어서 비슷하게 생겼더라도 펌웨어 업로드가 안되는 경우도 있는 것 같습니다. 그리고 제 경우엔 windows 7을 쓰는데 장치 드라이버를 약간 변경해야 했습니다. windows 10은 잘 모르겠습니다. 그리고 CANTACT 전용 프로그램을 써야 했던것 같고요. 자세한건 구글에서 CANTACT 또는 CANABLE 을 찾아보세요. 근데 설명이 다 영어로 되어있어 좀 어려울 수도 있습니다.
@k1seo1173 жыл бұрын
@@ChrisWonyeobPark 설명 감사합니다!! 시간이 많이 지난 영상이라 댓글 달아주실줄 상상도 못했습니다 ㅎㅎㅎ 정말 감사합니다!! STM도 덕분에 방향성 잡고 잘 배울 수 있었습니다!! CANTACT 유사 제품 맞습니다! 설명해주신대로 해조도록 하겠습니다! 답변 감사합니다~!!
@ChrisWonyeobPark3 жыл бұрын
@@k1seo117 아 당연히 질문에 답변해드려야죠 ㅎㅎ 도움이 되었다니 다행입니다! 그럼 앞으로도 즐거운 STM32 개발 되시기 바랍니다~ 감사합니다!