OS에 의한 무장 | 하카 데이


악명 높은 ‘BluePill’ STM32 보드를 사용한 프로젝트가 많이 있습니다. 그들은 저렴하고 풍부했고 많은 뛰어난 기능을 가지고 있거나 적어도 칩이 부족하기 전에있었습니다. 요즘 ‘블랙필’을 받았습니다. 이것은 매우 유사하지만 더 강력한 프로세서를 탑재하고 있습니다. 몇 달러로 100MHz에서 실행할 수 있는 ARMCPU를 얻을 수 있습니다(단, USB를 사용하면 아마 96MHz가 될 것입니다). 512kB 플래시와 128kB RAM이 있습니다. USB 타입 C 포트가 있고 버튼과 LED도 탑재되어 있습니다. 브레드보드에 맞춰 약 10달러의 저렴한 STLink 동글로 프로그래밍할 수 있습니다.

브레드보드의 Blackpill 모듈.

물론 이런 경우에는 소프트웨어를 고려해야 합니다. STM32Cube는 설정과 학습이 많이 있지만 상상할 수있는 모든 것을 할 수 있습니다. 그런 다음 견고한 Arduino로 사용할 수있는 STM32Duino 플러그인이 있습니다. 이것은 작동하고 설정도 간단합니다. 그러나 Mbed도 있습니다. 유일한 문제는 Mbed가 상자에서 꺼내 즉시 작동하지 않는다는 것입니다. 그러나 설정은 그리 어렵지 않습니다. 일을 진행하는 것이 얼마나 쉬운지 보여드립니다. 다음은 mBedRTOS 기능을 사용하는 USB 주변 장치의 실제 예를 소개합니다.

첫 단계

분명히, 당신은 검은 정제가 필요할 것입니다. 최소한 두 가지 옵션이 있지만 메모리가 많은 STM32F411 버전을 얻지 못하는 이유는 거의 없습니다. DIP 폼 팩터는 가지고 있는 브레드보드에 적합하며 USB C 케이블이 보드에 전원을 공급합니다. 따라서 많은 외부 회로를 구동하지 않는 한 외부 전원이 필요하지 않습니다.

그러나 일부 보드와 달리 부트 로더를 사용하지 않는 한 USB 포트는 프로그래밍에 도움이 되지 않습니다. 이론적으로 리셋 중에 BOOT0 버튼을 길게 누르면 보드가 DFU를 실행할 수 있습니다. 하지만 내 보드는 가끔 DFU 모드로 들어갔습니다. 일반적인 문제처럼 들리는 인터넷을 읽습니다. 트릭은 재설정 버튼을 사용하는 대신 USB를 분리했다가 다시 연결하는 것 같습니다. 보드를 연결하면서 BOOT0을 누릅니다. 몇 초 후 BOOT0 버튼을 놓습니다. 그것은 좀 더 신뢰할 수 있습니다. 그런 다음 프로그램하려면 DFU 플래시 프로그램이 필요합니다. .bin 위치 0x08000000에 있는 DFU 장치의 alt0에 쓰는 파일. 그래도 디버깅은 불가능합니다.

다행히 USB에서 10핀 커넥터에 연결하는 STLink v2 동글은 매우 저렴하며 10달러 이하입니다. 이렇게 하면 프로그래밍 및 디버깅이 가능합니다. 그러나 이러한 동글이 지원하지 않는 추적 기능도 있습니다.

트레이스 하지 않아도 문제 없이 동작합니다만, SWO(시리얼 와이어 출력)라고 하는 기능을 사용해 「printf 스타일」의 출력을 실행할 수 있어 USB 포트를 시리얼 포트로서 사용할 필요가 없기 때문에 편리합니다. SWO가 필요한 경우, 더 비싼 버전의 STLink (더 큰 커넥터가있는 것)가 필요하거나 물론 해킹이 있습니다. Blackmagic 프로브와 같은 다른 유사한 프로브를 사용할 수도 있습니다. 경우에 따라 세미호스팅을 사용할 수 있지만 적절한 프로브를 얻거나 SWO 출력을 해킹하거나 단순히 디버거를 사용하는 것이 좋습니다. 물론 USB 시리얼 포트를 설정하는 경우 (쉽게 실행할 수 있음) 문제없이 사용할 수 있습니다.

내가 사용한 STLink 동글에는 10 개의 핀이 있습니다. 불행히도 모든 클론이 동일한 핀아웃을 갖고 있는 것은 아닙니다. Blackpill의 4개의 핀은 커넥터를 보면서 왼쪽에서 시작하여 3.3V, SWDIO, SWCLK 및 Ground입니다. USB 포트에서 전원을 공급해도 상관없다면 마지막 3개의 핀만 필요합니다.

일반적으로 이러한 클론 어댑터에는 케이스에 핀아웃이 있습니다. 제 경우에는 필요한 3개의 와이어가 핀 6, 7, 8에 있었습니다. 장치에서 3.3V를 당기면 주의하십시오. 전류를 너무 많이 흘리거나 전력선을 단락시키면 동글이 정지합니다.

클론의 또 다른 문제점은 오래된 펌웨어가 로드되는 경우입니다. 그들을 업데이트하는 방법을 알고 공식 STM32CubeProgrammer를 얻을 수 있습니다. 장치를 업데이트한 후에는 장치의 플러그를 뽑고 플러그를 다시 연결한 후 프로그래머 목록을 업데이트하는 것을 잊지 마십시오.

소프트웨어

내가 말했듯이 많은 옵션과 많은 도구 세트가 있습니다. 나는 일반적으로 Mbed 도구를 좋아합니다. Mbed를 처음 보았을 때, 그것은 Arduino의 종류와 같은 생태계였습니다. IDE는 온라인이었지만 몇 가지 옵션을 사용하여 오프라인으로 만들 수있었습니다. 그러나, 그 이후로, 그것은 성장하고, 지금은 다양한 도구가 있으며, 필요에 따라 정통 운영 체제도 있습니다. 단순한 것을 만들려는 경우 “베어 메탈”모드를 선택하는 방법이 있지만 Black Pill과 같은 것이 충분한 메모리를 가지고 있기 때문에 많은 코드를 푸시하는 것은 실제로 문제입니다. 아니다. 베어 메탈 모드가 없어도 링커는 사용하지 않는 것을 제거하려고하므로 그리 나쁘지 않습니다.

그러나 나쁜 소식은 생태계가 블랙 알약을 직접 지원하지 않는다는 것입니다. 그러나 동일한 CPU를 탑재한 Nucleo 보드는 지원합니다. 그것은 잘 작동하고 간단한 테스트의 경우, 그것은 나쁘지 않습니다.확실히 핀 이름은 잘못되었지만 다음과 같이 실제 이름을 지정할 수 있습니다. PC_13 그 외 LED1. 그러나 진정한 나쁜 소식은 타겟 보드가 USB를 지원하지 않는다는 것입니다. USB 드라이버를 사용하려고하면 시스템이 그것을 처리하기위한 하드웨어가 없다고 가정하기 때문에 단순히 중지합니다.

좋은 소식과 나쁜 소식이 있습니다. 다행히 BlackPill에는 사용자가 만든 설정이 있습니다. 보다 안정적인 클럭 레퍼런스를 제공하고 USB를 가능하게 하고 올바른 핀 정의를 제공합니다. 그다지 좋은 소식은 아니지만 로컬에서 실행되는 MbedIDE에서만 작동하는 것 같습니다. 어쨌든 현지 물건을 사용하고 싶었기 때문에 그렇게 나쁘지는 않습니다. 다른 도구 세트를 사용하는 경우 스스로 타겟을 정의하는 것을 알 수 있습니다. PlatformIO도 BluePill의 경우처럼 작동하는 것 같습니다.

어서 가자!

모든 것이 조립되면 프로그램을 실행하는 것은 매우 간단합니다. 다음 번에는 USB의 재미를 조금 더 보여드리겠습니다. 일단 USB 시리얼 포트에 출력을 갖춘 간단한 LED 플러셔를 사용해 봅시다. 예를 들어, 온라인 에뮬레이터에서 “Blinky” 샘플을 실행할 수 있습니다.문제는 그것 printf 우리 보드에서는 어디에도 도움이되지 않습니다.

문제 없음:


#include "mbed.h"
#include "USBSerial.h"

DigitalOut led(LED1);
USBSerial usbSerial(false); // don't wait for connection

int main() {
   usbSerial.connect();  // set up serial port
   while (1) {
     led = !led;
    usbSerial.printf("Blink! LED is now %dn", led.read());
    ThisThread::sleep_for(500ms);
    }
}

매우 간단합니다. BlackPill 구성에 설명된 대로 프로젝트를 설정하기만 하면 됩니다. 그건 :

  • MbedIDE에서 새 프로젝트를 만듭니다.
  • 프로그램의 루트 폴더를 마우스 오른쪽 버튼으로 클릭하고 팝업 창에서[ライブラリの追加…]를 선택합니다.
  • 들어가다 https://os.mbed.com/users/hudakz/code/BLACKPILL_Custom_Target [次へ]버튼을 클릭합니다.
  • 드롭 목록을 열고 기본값을 선택하고,[完了]을 클릭합니다.
  • BLACKPILL_Custom_Target 폴더를 열고 TARGET_BLACKPILL_F411CE 폴더를 프로젝트의 루트 폴더로 드래그합니다.
  • custom_targets.json을 BLACKPILL_Custom_Target 폴더에서 루트 폴더로 드래그합니다.
  • 프로젝트에서 BLACKPILL_Custom_Target 폴더를 삭제합니다.
  • 타겟 드롭 목록을 열고 ‘팁’ 아이콘이 있는 버튼을 클릭합니다.
  • USB 장치의 드롭 목록을 열고 STM32 ST-Link 프로그래머(또는 해당 루트를 사용하는 경우 DFU 장치)를 선택합니다.
  • 타겟으로 BlackPill_F411CE를 선택합니다.
  • [すべて保存]버튼을 클릭합니다.

STLink를 사용하는 경우 실행 버튼 또는 디버그 버튼을 클릭하기만 하면 시작할 수 있습니다. DFU를 선택하면 IDE는 .bin 파일을 남긴 위치를 알립니다. 이것은 DFU 프로그래머에 피드하는 데 필요한 것입니다. Linux를 사용하는 경우 dfu-util 행은 다음과 같습니다.

dfu-util -d 0483:df11 -a 0 -s 0x80000000:leave -D blackpill-program.bin

예에 대하여

의 디폴트 생성자 USBSerial 직렬 포트를 실제로 열 때까지 프로그램이 중단되지만, 이것은 원하는 동작이거나 그렇지 않을 수 있습니다. 그러나 Black Pill과 내 설정에서는 어쨌든 기본 생성자를 사용하여 직렬 포트를 열거하지 않았습니다.

시뮬레이터에서 그들은 wait_ms 일시 중지하는 기능이 있지만 더 현대적으로 변경합니다. ThisThread::sleep_for. 진실은 위의 프로그램에는 스케줄 된 우선 순위 작업과 사서함에서 뮤텍스에 이르기까지 다양한 동기화 방법을 갖춘 본격적인 RTOS가 있습니다. 모든 종류의 USB 장치, CAN 버스, 파일 시스템 등의 드라이버도 있습니다. 현재 이들 중 어느 것도 사용하지 않지만 사용되고 있습니다.아직 단일 스레드가 있고 다음과 같은 메소드를 사용하여 작업 할 수 있습니다. sleep_for.

일반 올드 Printf

그냥 갖고 싶다면 printf 다른 콘솔 I/O는 기본적으로 USB 포트에 연결되지만 다음 코드를 추가할 수도 있습니다. usbSerial 이 코드에 표시되는 객체.



namespace mbed
{
   FileHandle *mbed_override_console(int fd)
   {
   return &usbSerial;
   }
}


그런 다음 사용할 수 있습니다. printf 그 외 usbSerial.printf 결과는 동일합니다. 잡기는 하나뿐입니다.기본값을 사용하는 경우 USBSerial 생성자의 경우 프로그램은 USB 포트가 연결될 때까지 멈춥니다. 그러나 첫 번째 생성자 인수를 false로 설정하면 발생하지 않습니다.프로그램이 출력을 쓰려고 시도하고 거기에 아무것도 없으면 어떤 일이 발생합니까? stdio 라이브러리는 더 이상 시도 할 필요가 없다고 판단하므로 아무 것도 표시되지 않습니다.그것을 해결하려면 정기적으로 전화해야합니다. clearerr(stdout) 또는 사용할 수 있는 기타 핸들. 다른 옵션이 있습니다.예를 들어, 다음과 같은 것을 호출하는 것을 피할 수 있습니다. printf 언제 usbSerial::connected() false를 리턴합니다. 또는, clearerr 포트가 연결되지 않은 상태에서 연결로 이동하고 있음을 감지할 때. 관심이 있다면 GitHub에 다른 예를 남기기 시작하세요.

다음 단계

디버거 모드의 MbedIDE

디버거를 통해 코드를 쉽게 실행할 수 있습니다. 이것은 매우 유용합니다. 물론 코어는 기본적으로 STLink 연결을 통해 하드웨어와 통신하는 gdb 서버이기 때문에 다른 많은 디버깅 옵션이 있습니다.

그러나 다음 번에는 Black Pill을 가짜 USB 키보드로 바꾸고 아날로그 입력에 연결된 전위차계의 움직임에 해당하는 볼륨 제어 명령을 PC로 보냅니다. 그 과정에서 여러 스레드를 만들고 함께 연동합니다.

About the author

amazingrecipes.co

Leave a Comment