Actions

KAmod BlackPill 401 (PL): Difference between revisions

From Kamamilabs.com - Wiki

 
(14 intermediate revisions by 2 users not shown)
Line 2: Line 2:
===== Opis =====
===== Opis =====
<b>Płytka ewaluacyjna z mikrokontrolerem STM32F401CCU, kompatybilna z BlackPill</b><br><br>
<b>Płytka ewaluacyjna z mikrokontrolerem STM32F401CCU, kompatybilna z BlackPill</b><br><br>
Płytka ewaluacyjna<b>KAmod BlackPill 401</b> zawiera mikrokontroler STM32F401CCU oraz elementy niezbędne do jego uruchomienia i programowania. Płytka jest kompatybilna pod względem wyprowadzeń z projektem BlackPill, jednak jest to zupełnie nowy projekt, wyposażony w złącze USB-C z zabezpieczeniem ESD i zmodyfikowany obwód zasilania. Może być programowana z Arduino IDE, ponieważ w pamięci układu znajduje się odpowiedni bootloader.
Płytka ewaluacyjna <b>KAmod BlackPill 401</b> zawiera mikrokontroler STM32F401CCU oraz elementy niezbędne do jego uruchomienia i programowania. Płytka jest kompatybilna pod względem wyprowadzeń z projektem BlackPill, jednak jest to zupełnie nowa konstrukcja, wyposażona w złącze USB-C z zabezpieczeniem ESD i zmodyfikowany obwód zasilania. Może być programowana z Arduino IDE, ponieważ w pamięci układu znajduje się odpowiedni bootloader.
<center>
<center>
[[File:KAmod_BlackPill_3D.png|none|700px|thumb|center]]
[[File:KAmod_BlackPill_3D.png|none|700px|thumb|center]]
Line 8: Line 8:


===== Podstawowe cechy i parametry =====
===== Podstawowe cechy i parametry =====
* mikrokontroler STM32F401CCU6: Cortex-M4, 256 kB Flash, 64 kB RAM, 84 MHz, 1 x ADC 12-bitowy, 7 timerów, 3 x I2C, 2 x SPI, 3 x UART, USB OTG FS, RTC
* mikrokontroler STM32F401CCU6: Cortex-M4, 256 kB Flash, 64 kB RAM, 84 MHz, 1 x ADC 12-bitowy, 7 timerów, 3 x I2C, 2 x SPI, 3 x UART, USB OTG FS, RTC
* złącze USB-C służy jako złącze zasilające, interfejs komunikacyjny USB oraz pozwala na programowanie mikrokontrolera
* złącze USB-C służy jako złącze zasilające, interfejs komunikacyjny USB oraz pozwala na programowanie mikrokontrolera
* zawiera elementy filtrujące zakłócenia i przepięcia na liniach interfejsu USB
* zawiera elementy filtrujące zakłócenia i przepięcia na liniach interfejsu USB
Line 45: Line 45:
::Mikrokontroler oraz złącza GPIO i SWD
::Mikrokontroler oraz złącza GPIO i SWD
<center>
<center>
[[File:foto.jpg|none|950px|thumb|center]]
[[File:KAmod_BlackPill_401_sch_1.png|none|950px|thumb|center]]
</center>
</center>
<br>
::Interfejs USB
::Interfejs USB
<center>
<center>
[[File:foto.jpg|none|700px|thumb|center]]
[[File:KAmod_BlackPill_401_sch_2.jpg|none|700px|thumb|center]]
</center>
</center>
::Obwód zasilania  
::Obwód zasilania  
<center>
<center>
[[File:foto.jpg|none|950px|thumb|center]]
[[File:KAmod_BlackPill_401_sch_3.jpg|none|950px|thumb|center]]
</center>
</center>
::Taktowanie mikrokontrolera  
::Taktowanie mikrokontrolera  
<center>
<center>
[[File:foto.jpg|none|700px|thumb|center]]
[[File:KAmod_BlackPill_401_sch_4.jpg|none|550px|thumb|center]]
</center>
</center>
::Elementy dodatkowe  
::Elementy dodatkowe  
<center>
<center>
[[File:foto.jpg|none|800px|thumb|center]]
[[File:KAmod_BlackPill_401_sch_5.jpg|none|800px|thumb|center]]
</center>
</center>
::Zewnętrzna pamięć
::Zewnętrzna pamięć
<center>
<center>
[[File:foto.jpg|none|500px|thumb|center]]
[[File:KAmod_BlackPill_401_sch_6.jpg|none|500px|thumb|center]]
</center>
</center>


Line 83: Line 84:
|}
|}
</center>
</center>
Płytka ewaluacyjna <b>KAmod BlackPill 401</b> może być zasilana na dwa sposoby::
Płytka ewaluacyjna <b>KAmod BlackPill 401</b> może być zasilana na dwa sposoby:
*poprzez odpowiednie styki złączy J1 i J2,
*poprzez odpowiednie styki złączy J1 i J2,
*poprzez złącze USB-C.
*poprzez złącze USB-C.
<br>
<br>
Źródło zasilania o napięciu z zakresu 4,5...5,5 V i wydajności min. 100 mA należy dołączyć do styków oznaczonych''''' 5V''''' (plus) oraz '''''GND''''' (minus) na złączach J1 i/lub J2. Wtedy na styku oznaczonym '''''3,3V''''' dostępne jest stabilizowane napięcie o wartości 3,3 V, które również zasila mikrokontroler. Obecność napięcia 3,3 V sygnalizuje świecenie diody LED oznaczonej '''''PWR'''''.
Źródło zasilania o napięciu z zakresu 4,5...5,5 V i wydajności min. 100 mA należy dołączyć do styków oznaczonych''''' 5V''''' (plus) oraz '''''GND''''' (minus) na złączach J1 i/lub J2. Wtedy na styku oznaczonym '''''3,3V''''' dostępne jest stabilizowane napięcie o wartości 3,3 V, które również zasila mikrokontroler. Obecność napięcia 3,3 V jest sygnalizowana świeceniem diody LED oznaczonej '''''PWR'''''.
<br><br>
<br><br>
Do złącza USB-C należy dołączyć standardowe źródło zasilania USB o wydajności min. 100 mA. Wtedy na styku 5V złącza J1 dostępne jest napięcie o wartości bliskiej 5 V (względem masy oznaczonej '''''GND'''''). Niewielki spadek napięcia (ok 0,5 V) występuje na diodzie Schottky’ego, która umożliwia przepływ prądu w kierunku ze złącza USB-C do płytki, ale blokuje przepływ prądu w kierunku przeciwnym - do złącza USB-C. Dzięki temu można bezpiecznie dołączać zasilanie w różnych konfiguracjach - USB i/lub styki J1, J2.
Do złącza USB-C należy dołączyć standardowe źródło zasilania USB o wydajności min. 100 mA. Wtedy na styku 5V złącza J1 dostępne jest napięcie o wartości bliskiej 5 V (względem masy oznaczonej '''''GND'''''). Niewielki spadek napięcia (ok 0,5 V) występuje na diodzie Schottky’ego, która umożliwia przepływ prądu w kierunku ze złącza USB-C do płytki, ale blokuje przepływ prądu w kierunku przeciwnym - do złącza USB-C. Dzięki temu można bezpiecznie dołączać zasilanie w różnych konfiguracjach - USB i/lub styki J1, J2.
Line 113: Line 114:
<br><br>
<br><br>
Płytka została skonfigurowana w taki sposób, że umożliwia działanie interfejsu w trybie Peripheral, nie jest przygotowana do pracy w trybie Host (OTG). Na płytce znajdują się również elementy filtrujące ewentualne zakłócenia i przepięcia na liniach interfejsu USB, które zapewniają jego stabilne działanie.
Płytka została skonfigurowana w taki sposób, że umożliwia działanie interfejsu w trybie Peripheral, nie jest przygotowana do pracy w trybie Host (OTG). Na płytce znajdują się również elementy filtrujące ewentualne zakłócenia i przepięcia na liniach interfejsu USB, które zapewniają jego stabilne działanie.
<br><br>
Dodatkową funkcjonalnością złącza USB-C jest możliwość programowania pamięci Flash mikrokontrolera. Wymagany jest do tego odpowiedni bootloader, który zostaje załadowany do mikrokontrolera modułu Kamod BluePill+ wraz z programem testowym.
<br><br>
<br><br>
Dodatkową funkcjonalnością złącza USB-C jest możliwość programowania pamięci Flash mikrokontrolera. Odpowiedni bootloader jest ładowany do pamięci nieulotnej (ROM) mikrokontrolera na etapie produkcji.<br><br>
Dodatkową funkcjonalnością złącza USB-C jest możliwość programowania pamięci Flash mikrokontrolera. Odpowiedni bootloader jest ładowany do pamięci nieulotnej (ROM) mikrokontrolera na etapie produkcji.<br><br>
Line 122: Line 121:
[[File:KAmod_BlackPill_USB.png|none|600px|thumb|center]]
[[File:KAmod_BlackPill_USB.png|none|600px|thumb|center]]
</center>
</center>
<br><br>


===== Interfejs programowania/debugowania SWD =====
===== Interfejs programowania/debugowania SWD =====
Line 143: Line 143:
:*C – sygnał taktujący SWCLK,
:*C – sygnał taktujący SWCLK,
:*D – sygnał danych SWDIO,
:*D – sygnał danych SWDIO,
:*V – linia zasiulania 3,3 V.
:*V – linia zasilania 3,3 V.
Sygnały należy połączyć z takimi samymi sygnałami na złączu programatora/debuggera. Czasami SWCLK jest oznaczony również jako TCK, natomiast SWDIO jest jednocześnie oznaczony jako TMS. Programator nie dostarcza zasilania do płytki <b>KAmod BlackPill 401</b>, zasilanie należy dołączyć do złącza USB-C lub styków J1/J2. <br><br>
Sygnały należy połączyć z takimi samymi sygnałami na złączu programatora/debuggera. Czasami SWCLK jest oznaczony również jako TCK, natomiast SWDIO jest jednocześnie oznaczony jako TMS. Programator nie dostarcza zasilania do płytki <b>KAmod BlackPill 401</b>, zasilanie należy dołączyć do złącza USB-C lub styków J1/J2. <br><br>
<center>
<center>
Line 179: Line 179:
Uruchomienie bootloadera aktywuje dwa interfejsy programujące:
Uruchomienie bootloadera aktywuje dwa interfejsy programujące:
:*'''SWD''', który został opisany we wcześniejszym rozdziale i pozwala na programowanie mikrokontrolera z użyciem programatora/debuggera np. STLINK-V2 lub STLINK-V3MINIE.
:*'''SWD''', który został opisany we wcześniejszym rozdziale i pozwala na programowanie mikrokontrolera z użyciem programatora/debuggera np. STLINK-V2 lub STLINK-V3MINIE.
:*vUART''', który pozwala na użycie zwykłego konwertera USB-UART w roli programatora, np. [https://kamami.pl/konwertery-usb---uart--rs232/1190298-kamod-usb-uart-mini-miniaturowy-konwerter-usb-uart-5906623433421.html KAmod USB-UART-mini]. Należy wtedy podłączyć do styków A9 oraz A10 linie interfejsu UART, gdzie:
:*'''UART''', który pozwala na użycie zwykłego konwertera USB-UART w roli programatora, np. [https://kamami.pl/konwertery-usb---uart--rs232/1190298-kamod-usb-uart-mini-miniaturowy-konwerter-usb-uart-5906623433421.html KAmod USB-UART-mini]. Należy wtedy podłączyć do styków A9 oraz A10 linie interfejsu UART, gdzie:
:**A9 – wyjście TXD mikrokontrolera należy podłączyć do wejścia RXD konwertera USB-UART,
:**A9 – wyjście TXD mikrokontrolera należy podłączyć do wejścia RXD konwertera USB-UART,
:**A10 – wejście RXD mikrokontrolera należy podłączyć do wyjścia TXD konwertera USB-UART.
:**A10 – wejście RXD mikrokontrolera należy podłączyć do wyjścia TXD konwertera USB-UART.
Line 196: Line 196:
<br>
<br>
Płytka <b>KAmod BlackPill 401</b> umożliwia programowanie mikrokontrolera poprzez interfejs USB z użyciem Arduino IDE. Należy wtedy:
Płytka <b>KAmod BlackPill 401</b> umożliwia programowanie mikrokontrolera poprzez interfejs USB z użyciem Arduino IDE. Należy wtedy:
:*dodać następujący adres do źródeł menedżera płytek (Preferences) w Arduino IDE: https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
:*dodać następujący adres do źródeł menedżera płytek (''Preferences'') w Arduino IDE: https://github.com/stm32duino/BoardManagerFiles/raw/main/package_stmicroelectronics_index.json
:*poprzez menedżer płytek (Boards Manager) zainstalować pakiet „STM32 MCU based boards”
:*poprzez menedżer płytek (''Boards Manager'') zainstalować pakiet'' „STM32 MCU based boards”''
:*zainstalować STM32CubeProgrammer (https://www.st.com/en/development-tools/stm32cubeprog.html)
:*zainstalować STM32CubeProgrammer (https://www.st.com/en/development-tools/stm32cubeprog.html)
<br>
<br>
Line 269: Line 269:
===== Program testowy =====
===== Program testowy =====
Uproszczony kod programu testowego znajduje się poniżej, można go skompilować w środowisku Arduino.
Uproszczony kod programu testowego znajduje się poniżej, można go skompilować w środowisku Arduino.
<br><br>
<syntaxhighlight lang="arduino">


#include <STM32RTC.h>


<code>
#define LED_PIN  PC13
#define SW_PIN    PA0


<font color="#5e6d03">#include</font> <font color="#434f54">&lt;</font><b><font color="#d35400">STM32RTC</font></b><font color="#434f54">.</font><font color="#000000">h</font><font color="#434f54">&gt;</font>
int message_period = 0;
int config_state = 0;
int ports_state = 0;
int pindex = 0;


STM32RTC& rtc = STM32RTC::getInstance();


<font color="#5e6d03">#define</font> <font color="#000000">LED_PIN</font> &nbsp;&nbsp;<font color="#00979c">PC13</font>
void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  pinMode(SW_PIN, INPUT_PULLUP);
  rtc.begin(); // initialize RTC 24H format
}


<font color="#5e6d03">#define</font> <font color="#000000">SW_PIN</font> &nbsp;&nbsp;&nbsp;<font color="#00979c">PA0</font>
// the loop function runs over and over again forever
void loop() {
  //digitalWrite(LED_PIN, HIGH);
  if (digitalRead(SW_PIN) == HIGH){
    if ((ports_state&4) > 0){
      digitalWrite(LED_PIN, HIGH);    
    } else {   
      digitalWrite(LED_PIN, LOW);    
    }


    if (config_state > 0){
      IO2input();
      config_state = 0;
    }


<font color="#00979c">int</font> <font color="#000000">message_period</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font>
  } else {
    if ((ports_state&1) > 0){
      digitalWrite(LED_PIN, HIGH);     
    } else {   
      digitalWrite(LED_PIN, LOW);     
    }
   
    if (config_state == 0){
      IO2output();
      config_state = 1;
    }


<font color="#00979c">int</font> <font color="#000000">config_state</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font>


<font color="#00979c">int</font> <font color="#000000">ports_state</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font>
    if (config_state == 1){
      IO2low();
      IOwriteIndexed(pindex, 1);
      pindex++;
      if (pindex > 26) pindex = 1;
    }
  }


<font color="#00979c">int</font> <font color="#000000">pindex</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font>
  // check if plugged into a host
  if (message_period >= 11){
    message_period = 0;
   
    int tmt = rtc.getMinutes();
    Serial.print("KAmod BlackPill401 RTC=");
    if (tmt < 10) Serial.print("0");
    Serial.print(tmt);
   
    tmt = rtc.getSeconds();
    Serial.print(":");
    if (tmt < 10) Serial.print("0");
    Serial.println(tmt);
  }
 
  delay(200);
  message_period++;
  ports_state++;
}


void IO2output(){
  //pinMode(PA0, OUTPUT); //switch
  pinMode(PA1, OUTPUT);
  pinMode(PA2, OUTPUT);
  pinMode(PA3, OUTPUT);
  pinMode(PA4, OUTPUT);
  pinMode(PA5, OUTPUT);
  pinMode(PA6, OUTPUT);
  pinMode(PA7, OUTPUT);


<b><font color="#d35400">STM32RTC</font></b><font color="#434f54">&amp;</font> <font color="#000000">rtc</font> <font color="#434f54">=</font> <b><font color="#d35400">STM32RTC</font></b><font color="#434f54">:</font><font color="#434f54">:</font><font color="#d35400">getInstance</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PA8, OUTPUT);
  pinMode(PA9, OUTPUT);
  pinMode(PA10, OUTPUT);
  pinMode(PA15, OUTPUT);


<font color="#00979c">void</font> <font color="#5e6d03">setup</font><font color="#000000">(</font><font color="#000000">)</font> <font color="#000000">{</font>
  pinMode(PB0, OUTPUT);
&nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">begin</font><font color="#000000">(</font><font color="#000000">115200</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB1, OUTPUT);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">LED_PIN</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB2, OUTPUT);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">SW_PIN</font><font color="#434f54">,</font> <font color="#00979c">INPUT_PULLUP</font><font color="#000000">)</font><font color="#000000">;</font>
 
&nbsp;<font color="#000000">rtc</font><font color="#434f54">.</font><font color="#d35400">begin</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font> <font color="#434f54">&#47;&#47; initialize RTC 24H format</font>
  pinMode(PB3, OUTPUT);
<font color="#000000">}</font>
  pinMode(PB4, OUTPUT);
  pinMode(PB5, OUTPUT);
  pinMode(PB6, OUTPUT);
  pinMode(PB7, OUTPUT);
  pinMode(PB8, OUTPUT);
  pinMode(PB9, OUTPUT);


<font color="#434f54">&#47;&#47; the loop function runs over and over again forever</font>
  pinMode(PB10, OUTPUT);
<font color="#00979c">void</font> <font color="#5e6d03">loop</font><font color="#000000">(</font><font color="#000000">)</font> <font color="#000000">{</font>
&nbsp;<font color="#434f54">&#47;&#47;digitalWrite(LED_PIN, HIGH);</font>
&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#d35400">digitalRead</font><font color="#000000">(</font><font color="#000000">SW_PIN</font><font color="#000000">)</font> <font color="#434f54">==</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">{</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">(</font><font color="#000000">ports_state</font><font color="#434f54">&amp;</font><font color="#000000">4</font><font color="#000000">)</font> <font color="#434f54">&gt;</font> <font color="#000000">0</font><font color="#000000">)</font><font color="#000000">{</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">LED_PIN</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;<font color="#000000">}</font> <font color="#5e6d03">else</font> <font color="#000000">{</font> &nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">LED_PIN</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;<font color="#000000">}</font>


&nbsp;&nbsp;&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">config_state</font> <font color="#434f54">&gt;</font> <font color="#000000">0</font><font color="#000000">)</font><font color="#000000">{</font>
  pinMode(PB12, OUTPUT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">IO2input</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB13, OUTPUT);
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">config_state</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font>
  pinMode(PB14, OUTPUT);
&nbsp;&nbsp;&nbsp;<font color="#000000">}</font>
  pinMode(PB15, OUTPUT);
  //pinMode(PC13, OUTPUT);  //led
}


&nbsp;<font color="#000000">}</font> <font color="#5e6d03">else</font> <font color="#000000">{</font>
void IO2input(){
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">(</font><font color="#000000">ports_state</font><font color="#434f54">&amp;</font><font color="#000000">1</font><font color="#000000">)</font> <font color="#434f54">&gt;</font> <font color="#000000">0</font><font color="#000000">)</font><font color="#000000">{</font>
  //pinMode(PA0, INPUT); //switch
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">LED_PIN</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  pinMode(PA1, INPUT);
&nbsp;&nbsp;&nbsp;<font color="#000000">}</font> <font color="#5e6d03">else</font> <font color="#000000">{</font> &nbsp;&nbsp;&nbsp;
  pinMode(PA2, INPUT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">LED_PIN</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  pinMode(PA3, INPUT);
&nbsp;&nbsp;&nbsp;<font color="#000000">}</font>
  pinMode(PA4, INPUT);
&nbsp;&nbsp;&nbsp;
  pinMode(PA5, INPUT);
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">config_state</font> <font color="#434f54">==</font> <font color="#000000">0</font><font color="#000000">)</font><font color="#000000">{</font>
  pinMode(PA6, INPUT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">IO2output</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PA7, INPUT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">config_state</font> <font color="#434f54">=</font> <font color="#000000">1</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#000000">}</font>


  pinMode(PA8, INPUT);
  pinMode(PA9, INPUT);
  pinMode(PA10, INPUT);
  pinMode(PA15, INPUT);


&nbsp;&nbsp;&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">config_state</font> <font color="#434f54">==</font> <font color="#000000">1</font><font color="#000000">)</font><font color="#000000">{</font>
  pinMode(PB0, INPUT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">IO2low</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB1, INPUT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">IOwriteIndexed</font><font color="#000000">(</font><font color="#000000">pindex</font><font color="#434f54">,</font> <font color="#000000">1</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB2, INPUT);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">pindex</font><font color="#434f54">++</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">pindex</font> <font color="#434f54">&gt;</font> <font color="#000000">26</font><font color="#000000">)</font> <font color="#000000">pindex</font> <font color="#434f54">=</font> <font color="#000000">1</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#000000">}</font>
&nbsp;<font color="#000000">}</font>


&nbsp;<font color="#434f54">&#47;&#47; check if plugged into a host</font>
  pinMode(PB3, INPUT);
&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">message_period</font> <font color="#434f54">&gt;=</font> <font color="#000000">11</font><font color="#000000">)</font><font color="#000000">{</font>
  pinMode(PB4, INPUT);
&nbsp;&nbsp;&nbsp;<font color="#000000">message_period</font> <font color="#434f54">=</font> <font color="#000000">0</font><font color="#000000">;</font>
  pinMode(PB5, INPUT);
&nbsp;&nbsp;&nbsp;
  pinMode(PB6, INPUT);
&nbsp;&nbsp;&nbsp;<font color="#00979c">int</font> <font color="#000000">tmt</font> <font color="#434f54">=</font> <font color="#000000">rtc</font><font color="#434f54">.</font><font color="#d35400">getMinutes</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB7, INPUT);
&nbsp;&nbsp;&nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#005c5f">&#34;KAmod BlackPill401 RTC=&#34;</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB8, INPUT);
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">tmt</font> <font color="#434f54">&lt;</font> <font color="#000000">10</font><font color="#000000">)</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#005c5f">&#34;0&#34;</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB9, INPUT);
&nbsp;&nbsp;&nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#000000">tmt</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;<font color="#000000">tmt</font> <font color="#434f54">=</font> <font color="#000000">rtc</font><font color="#434f54">.</font><font color="#d35400">getSeconds</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#005c5f">&#34;:&#34;</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">tmt</font> <font color="#434f54">&lt;</font> <font color="#000000">10</font><font color="#000000">)</font> <b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">print</font><font color="#000000">(</font><font color="#005c5f">&#34;0&#34;</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<b><font color="#d35400">Serial</font></b><font color="#434f54">.</font><font color="#d35400">println</font><font color="#000000">(</font><font color="#000000">tmt</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#000000">}</font>
&nbsp;
&nbsp;<font color="#d35400">delay</font><font color="#000000">(</font><font color="#000000">200</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#000000">message_period</font><font color="#434f54">++</font><font color="#000000">;</font>
&nbsp;<font color="#000000">ports_state</font><font color="#434f54">++</font><font color="#000000">;</font>
<font color="#000000">}</font>


<font color="#00979c">void</font> <font color="#000000">IO2output</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">{</font>
  pinMode(PB10, INPUT);
&nbsp;<font color="#434f54">&#47;&#47;pinMode(PA0, OUTPUT); &#47;&#47;switch</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA1</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA2</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA3</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA4</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA5</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA6</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA7</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>


&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA8</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB12, INPUT);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA9</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB13, INPUT);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA10</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB14, INPUT);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA15</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(PB15, INPUT);


&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB0</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  //pinMode(PC13, INPUT);  //led
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB1</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
}
  &nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB2</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB3</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB4</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB5</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB6</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB7</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB8</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB9</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>


&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB10</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
void IO2low(){
  //digitalWrite(PA0, LOW); //switch
  digitalWrite(PA1, LOW);
  digitalWrite(PA2, LOW);
  digitalWrite(PA3, LOW);
  digitalWrite(PA4, LOW);
  digitalWrite(PA5, LOW);
  digitalWrite(PA6, LOW);
  digitalWrite(PA7, LOW);


&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB12</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PA8, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB13</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PA9, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB14</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PA10, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB15</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PA15, LOW);
&nbsp;<font color="#434f54">&#47;&#47;pinMode(PC13, OUTPUT); &nbsp;&#47;&#47;led</font>
<font color="#000000">}</font>


<font color="#00979c">void</font> <font color="#000000">IO2input</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">{</font>
  digitalWrite(PB0, LOW);
&nbsp;<font color="#434f54">&#47;&#47;pinMode(PA0, INPUT); &#47;&#47;switch</font>
  digitalWrite(PB1, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA1</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB2, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA2</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
 
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA3</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB3, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA4</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB4, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA5</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB5, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA6</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB6, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA7</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB7, LOW);
  digitalWrite(PB8, LOW);
  digitalWrite(PB9, LOW);


&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA8</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB10, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA9</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA10</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PA15</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>


&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB0</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB12, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB1</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB13, LOW);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB2</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB14, LOW);
  digitalWrite(PB15, LOW);


&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB3</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  //digitalWrite(PC13, LOW);  
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB4</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
}
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB5</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB6</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB7</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB8</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB9</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>


&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB10</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
void IO2high(){
  //digitalWrite(PA0, HIGH); //switch
  digitalWrite(PA1, HIGH);
  digitalWrite(PA2, HIGH);
  digitalWrite(PA3, HIGH);
  digitalWrite(PA4, HIGH);
  digitalWrite(PA5, HIGH);
  digitalWrite(PA6, HIGH);
  digitalWrite(PA7, HIGH);


&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB12</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PA8, HIGH);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB13</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PA9, HIGH);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB14</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PA10, HIGH);
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#00979c">PB15</font><font color="#434f54">,</font> <font color="#00979c">INPUT</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PA15, HIGH);


&nbsp;<font color="#434f54">&#47;&#47;pinMode(PC13, INPUT); &nbsp;&#47;&#47;led</font>
  digitalWrite(PB0, HIGH);
<font color="#000000">}</font>
  digitalWrite(PB1, HIGH);
  digitalWrite(PB2, HIGH);
 
  digitalWrite(PB3, HIGH);
  digitalWrite(PB4, HIGH);
  digitalWrite(PB5, HIGH);
  digitalWrite(PB6, HIGH);
  digitalWrite(PB7, HIGH);
  digitalWrite(PB8, HIGH);
  digitalWrite(PB9, HIGH);


<font color="#00979c">void</font> <font color="#000000">IO2low</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">{</font>
  digitalWrite(PB10, HIGH);
&nbsp;<font color="#434f54">&#47;&#47;digitalWrite(PA0, LOW); &#47;&#47;switch</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA1</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA2</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA3</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA4</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA5</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA6</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA7</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>


&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA8</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB12, HIGH);
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA9</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB13, HIGH);
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA10</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB14, HIGH);
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA15</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
  digitalWrite(PB15, HIGH);


&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB0</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
  //digitalWrite(PC13, HIGH);  
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB1</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
}
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB2</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB3</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB4</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB5</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB6</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB7</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB8</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB9</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>


&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB10</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
void IOwriteIndexed(int index, int state){
  int pp = 1;


&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB12</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
  switch (index){
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB13</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
    //case 0: pp = PA0; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB14</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
    case 1: pp = PA1; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB15</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
    case 2: pp = PA2; break;
    case 3: pp = PA3; break;
    case 4: pp = PA4; break;
    case 5: pp = PA5; break;
    case 6: pp = PA6; break;
    case 7: pp = PA7; break;


&nbsp;<font color="#434f54">&#47;&#47;digitalWrite(PC13, LOW); &nbsp;&nbsp;</font>
    case 8: pp = PB0; break;
<font color="#000000">}</font>
    case 9: pp = PB1; break;
    case 10: pp = PB2; break;
    case 11: pp = PB10; break;


<font color="#00979c">void</font> <font color="#000000">IO2high</font><font color="#000000">(</font><font color="#000000">)</font><font color="#000000">{</font>
    case 12: pp = PB12; break;
&nbsp;<font color="#434f54">&#47;&#47;digitalWrite(PA0, HIGH); &#47;&#47;switch</font>
    case 13: pp = PB13; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA1</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    case 14: pp = PB14; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA2</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    case 15: pp = PB15; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA3</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA4</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA5</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA6</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA7</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>


&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA8</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    case 16: pp = PA8; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA9</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    case 17: pp = PA9; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA10</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    case 18: pp = PA10; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PA15</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
   
    //case 19: pp = PA11; break
    //case 20: pp = PA12; break
   
    case 19: pp = PA15; break;


&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB0</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    case 20: pp = PB3; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB1</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    case 21: pp = PB4; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB2</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    case 22: pp = PB5; break;
&nbsp;
    case 23: pp = PB6; break;
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB3</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB4</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB5</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB6</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB7</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB8</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB9</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>


&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB10</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    case 24: pp = PB7; break;
    case 25: pp = PB8; break;
    case 26: pp = PB9; break;
  }


&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB12</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
  pinMode(pp, OUTPUT);
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB13</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
  if (state > 0){
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB14</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
    digitalWrite(pp, HIGH);
&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#00979c">PB15</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
  } else {
    digitalWrite(pp, LOW);
  }
}


&nbsp;<font color="#434f54">&#47;&#47;digitalWrite(PC13, HIGH); &nbsp;&nbsp;</font>
</syntaxhighlight>
<font color="#000000">}</font>


<font color="#00979c">void</font> <font color="#000000">IOwriteIndexed</font><font color="#000000">(</font><font color="#00979c">int</font> <font color="#000000">index</font><font color="#434f54">,</font> <font color="#00979c">int</font> <font color="#000000">state</font><font color="#000000">)</font><font color="#000000">{</font>
&nbsp;<font color="#00979c">int</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#000000">1</font><font color="#000000">;</font>


&nbsp;<font color="#5e6d03">switch</font> <font color="#000000">(</font><font color="#000000">index</font><font color="#000000">)</font><font color="#000000">{</font>
&nbsp;&nbsp;&nbsp;<font color="#434f54">&#47;&#47;case 0: pp = PA0; break;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">1</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA1</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">2</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA2</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">3</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA3</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">4</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA4</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">5</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA5</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">6</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA6</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">7</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA7</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>


&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">8</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB0</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
<br><br>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">9</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB1</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">10</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB2</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">11</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB10</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
 
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">12</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB12</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">13</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB13</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">14</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB14</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">15</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB15</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
 
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">16</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA8</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">17</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA9</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">18</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA10</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;<font color="#434f54">&#47;&#47;case 19: pp = PA11; break</font>
&nbsp;&nbsp;&nbsp;<font color="#434f54">&#47;&#47;case 20: pp = PA12; break</font>
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">19</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PA15</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
 
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">20</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB3</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">21</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB4</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">22</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB5</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">23</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB6</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
 
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">24</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB7</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">25</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB8</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;&nbsp;&nbsp;<font color="#5e6d03">case</font> <font color="#000000">26</font><font color="#434f54">:</font> <font color="#000000">pp</font> <font color="#434f54">=</font> <font color="#00979c">PB9</font><font color="#000000">;</font> <font color="#5e6d03">break</font><font color="#000000">;</font>
&nbsp;<font color="#000000">}</font>
 
&nbsp;<font color="#d35400">pinMode</font><font color="#000000">(</font><font color="#000000">pp</font><font color="#434f54">,</font> <font color="#00979c">OUTPUT</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#5e6d03">if</font> <font color="#000000">(</font><font color="#000000">state</font> <font color="#434f54">&gt;</font> <font color="#000000">0</font><font color="#000000">)</font><font color="#000000">{</font>
&nbsp;&nbsp;&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">pp</font><font color="#434f54">,</font> <font color="#00979c">HIGH</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#000000">}</font> <font color="#5e6d03">else</font> <font color="#000000">{</font>
&nbsp;&nbsp;&nbsp;<font color="#d35400">digitalWrite</font><font color="#000000">(</font><font color="#000000">pp</font><font color="#434f54">,</font> <font color="#00979c">LOW</font><font color="#000000">)</font><font color="#000000">;</font>
&nbsp;<font color="#000000">}</font>
<font color="#000000">}</font>
</code>
<br><br><br>
Działanie programu polega na uruchomieniu portu szeregowego na bazie interfejsu USB oraz modułu zegara RTC i cyklicznym wysyłaniu informacji o czasie poprzez ten port szeregowy.<br><br>
Działanie programu polega na uruchomieniu portu szeregowego na bazie interfejsu USB oraz modułu zegara RTC i cyklicznym wysyłaniu informacji o czasie poprzez ten port szeregowy.<br><br>
Działaniu programu towarzyszy powolne miganie diody LED D3. Gdy zostanie naciśnięty przycisk KEY (SW3) to na wszystkich portach kolejno będzie ustawiany stan wysoki oraz dioda LED zacznie pulsować szybko.
Działaniu programu towarzyszy powolne miganie diody LED D3. Gdy zostanie naciśnięty przycisk KEY (SW3) to na wszystkich portach kolejno będzie ustawiany stan wysoki oraz dioda LED zacznie pulsować szybko.


===== Linki =====
===== Linki =====
*[https://wiki.kamamilabs.com/images/3/35/KAmod_BlackPill_3D.zip Model CAD (STEP)]
*[https://wiki.kamamilabs.com/images/d/d2/Stm322f401cb.zip Karta katalogowa układu STM32F401CCU]
*[https://wiki.kamamilabs.com/images/d/d2/Stm322f401cb.zip Karta katalogowa układu STM32F401CCU]
*[https://wiki.kamamilabs.com/images/0/0f/Program_testowy_arduino.zip Program testowy Arduino]
*[https://wiki.kamamilabs.com/images/f/f1/Arduino_black_pill_401.zip Program testowy Arduino]
*[https://wiki.kamamilabs.com/images/0/0a/BluePillDemo_USB_CDC.zip Projekt testowy STM32CUBE_IDE]
*[https://wiki.kamamilabs.com/images/0/0a/BluePillDemo_USB_CDC.zip Projekt testowy STM32CUBE_IDE]
*[https://kamami.pl/programatory-stm32/1181273-stlink-v3minie-kompaktowy-programatordebuger-dla-stm32-5906623436668.html STLINK-V3MINIE - kompaktowy programator/debuger dla STM32]
*[https://kamami.pl/programatory-stm32/1181273-stlink-v3minie-kompaktowy-programatordebuger-dla-stm32-5906623436668.html STLINK-V3MINIE - kompaktowy programator/debuger dla STM32]
*[https://www.st.com/en/development-tools/stm32cubeprog.html STM32CubeProgrammer]
*[https://www.st.com/en/development-tools/stm32cubeprog.html STM32CubeProgrammer]
*[https://kamami.pl/konwertery-usb---uart--rs232/1190298-kamod-usb-uart-mini-miniaturowy-konwerter-usb-uart-5906623433421.html KAmod USB-UART-mini - Miniaturowy konwerter USB-UART]
*[https://kamami.pl/konwertery-usb---uart--rs232/1190298-kamod-usb-uart-mini-miniaturowy-konwerter-usb-uart-5906623433421.html KAmod USB-UART-mini - Miniaturowy konwerter USB-UART]

Latest revision as of 17:35, 2 November 2024

Opis

Płytka ewaluacyjna z mikrokontrolerem STM32F401CCU, kompatybilna z BlackPill

Płytka ewaluacyjna KAmod BlackPill 401 zawiera mikrokontroler STM32F401CCU oraz elementy niezbędne do jego uruchomienia i programowania. Płytka jest kompatybilna pod względem wyprowadzeń z projektem BlackPill, jednak jest to zupełnie nowa konstrukcja, wyposażona w złącze USB-C z zabezpieczeniem ESD i zmodyfikowany obwód zasilania. Może być programowana z Arduino IDE, ponieważ w pamięci układu znajduje się odpowiedni bootloader.

Podstawowe cechy i parametry
  • mikrokontroler STM32F401CCU6: Cortex-M4, 256 kB Flash, 64 kB RAM, 84 MHz, 1 x ADC 12-bitowy, 7 timerów, 3 x I2C, 2 x SPI, 3 x UART, USB OTG FS, RTC
  • złącze USB-C służy jako złącze zasilające, interfejs komunikacyjny USB oraz pozwala na programowanie mikrokontrolera
  • zawiera elementy filtrujące zakłócenia i przepięcia na liniach interfejsu USB
  • 32 wyprowadzenia GPIO oraz linie zasilania 5 V i 3,3 V dostępne na standardowych złączach o rastrze 2,54 mm
  • maksymalne obciążenie linii 5 V wynosi 500 mA, natomiast dla linii 3,3 V wynosi 200 mA
  • precyzyjny rezonator taktujący mikrokontroler oraz niezależny rezonator dla modułu RTC
  • możliwość dołączenia baterii podtrzymującej działanie modułu RTC
  • złącze interfejsu programowania/debugowania SWD
  • możliwość programowania poprzez STM32CubeProgrammer oraz Arduino IDE
  • wymiary płytki: 53,5x23 mm, wysokość ok. 7 mm (bez wlutowanych szpilek goldpin)
Wyposażenie standardowe
Kod Opis
KAmod BlackPill 401
  • Zmontowany i uruchomiony moduł, z wgranym bootloaderem
  • 2 x prosta listwa goldpin 20-pin raster 2,54 mm
  • 1 x kątowa listwa goldpin 4-pin raster 2,54 mm


Schemat elektryczny


Mikrokontroler oraz złącza GPIO i SWD


Interfejs USB
Obwód zasilania
Taktowanie mikrokontrolera
Elementy dodatkowe
Zewnętrzna pamięć
Zasilanie
Złącze Funkcja
USB-C

J1, J2

  • Doprowadza zasilanie 5 V do modułu
  • Pozwala doprowadzić zasilanie 5 V oraz udostępnia napięcie 3,3 V

Płytka ewaluacyjna KAmod BlackPill 401 może być zasilana na dwa sposoby:

  • poprzez odpowiednie styki złączy J1 i J2,
  • poprzez złącze USB-C.


Źródło zasilania o napięciu z zakresu 4,5...5,5 V i wydajności min. 100 mA należy dołączyć do styków oznaczonych 5V (plus) oraz GND (minus) na złączach J1 i/lub J2. Wtedy na styku oznaczonym 3,3V dostępne jest stabilizowane napięcie o wartości 3,3 V, które również zasila mikrokontroler. Obecność napięcia 3,3 V jest sygnalizowana świeceniem diody LED oznaczonej PWR.

Do złącza USB-C należy dołączyć standardowe źródło zasilania USB o wydajności min. 100 mA. Wtedy na styku 5V złącza J1 dostępne jest napięcie o wartości bliskiej 5 V (względem masy oznaczonej GND). Niewielki spadek napięcia (ok 0,5 V) występuje na diodzie Schottky’ego, która umożliwia przepływ prądu w kierunku ze złącza USB-C do płytki, ale blokuje przepływ prądu w kierunku przeciwnym - do złącza USB-C. Dzięki temu można bezpiecznie dołączać zasilanie w różnych konfiguracjach - USB i/lub styki J1, J2.

Na złączu J2 znajduje się styk oznaczony B+. Wraz z masą GND jest to wejście zasilania z baterii podtrzymującej działanie zegara RTC (zintegrowanego z mikrokontrolerem). Napięcie baterii podtrzymującej powinno zawierać się w przedziale 1,65...3,6 V.. Dokładne informacje na temat działania modułu RTC można znaleźć w dokumentacji mikrokontrolera STM32F401CCU.

Interfejs USB
Złącze Funkcja
USB-C
  • Doprowadza zasilanie 5 V do modułu
  • Może realizować interfejs USB 2.0 FS Peripheral
  • Pozwala programować pamięć Flash mikrokontrolera

Złącze USB-C jest łatwym sposobem na doprowadzenie zasilania do płytki KAmod BlackPill 401. Ponadto mikrokontroler STM32F401CCU ma zintegrowany kontroler interfejsu USB 2.0 FS, który może służyć do komunikacji np. w trybie VCP (Virtual COM Port) lub CDC (Communication Device Class).

Płytka została skonfigurowana w taki sposób, że umożliwia działanie interfejsu w trybie Peripheral, nie jest przygotowana do pracy w trybie Host (OTG). Na płytce znajdują się również elementy filtrujące ewentualne zakłócenia i przepięcia na liniach interfejsu USB, które zapewniają jego stabilne działanie.

Dodatkową funkcjonalnością złącza USB-C jest możliwość programowania pamięci Flash mikrokontrolera. Odpowiedni bootloader jest ładowany do pamięci nieulotnej (ROM) mikrokontrolera na etapie produkcji.

Linie interfejsu USB (DP oraz DM) są jednocześnie portami GPIO PA12 oraz PA11 mikrokontrolera. Jeżeli korzystamy z USB to styki oznaczone A12 i A11 nie mogą pełnić żadnej innej funkcji – muszą pozostać niepodłączone.



Interfejs programowania/debugowania SWD
Złącze Funkcja
J3
  • Wyprowadzony interfejs SWD (Single Wire Debug) z sygnałami SWDIO oraz SWCLK

Interfejs SWD (Single Wire Debug) pozwala na programowanie pamięci Flash mikrokontrolera oraz śledzenie działania programu (debugowanie). Wymaga dołączenia zewnętrznego programatora/debuggera np. STLINK-V2 lub STLINK-V3MINIE.

Interfejs SWD został wyprowadzony na złącze szpilkowe J3. Sygnały zostały opisane w następujący sposób:

  • G – masa układu,
  • C – sygnał taktujący SWCLK,
  • D – sygnał danych SWDIO,
  • V – linia zasilania 3,3 V.

Sygnały należy połączyć z takimi samymi sygnałami na złączu programatora/debuggera. Czasami SWCLK jest oznaczony również jako TCK, natomiast SWDIO jest jednocześnie oznaczony jako TMS. Programator nie dostarcza zasilania do płytki KAmod BlackPill 401, zasilanie należy dołączyć do złącza USB-C lub styków J1/J2.

Programowanie mikrokontrolera
Komponent Funkcja

SW1 – NRST
SW2 – BOOT0
J3 – SWD
A9, A10 – UART

  • Wymuszenie stanu wyzerowania mikrokontolera
  • Uruchomienie fabrycznego bootloadera mikrokontolera
  • Interfejs programowania SWD (Single Wire Debug)
  • Interfejs programowania UART (TXD, RXD)

W specjalnym obszarze pamięci mikrokontrolera znajduje się oprogramowanie umożliwiające zaprogramowanie jego pamięci programu – jest to tzw. bootloader przygotowany przez producenta mikrokontrolera. Aby uruchomić bootloader należy wykonać określoną sekwencję czynności, przy podłączonym zasilaniu płytki:

  1. Przycisnąć i trzymać przycisk NRTS
  2. Przycisnąć i trzymać przycisk BOOT 0 trzymając wciśnięty przycisk NRST
  3. Zwolnić przycisk NRTS, trzymając wciśnięty przycisk BOOT 0
  4. Zwolnić przycisk BOOT 0

Inną metodą uruchomienia bootloadera jest podłączenie zasilania płytki przy wciśniętym przycisku BOOT 0.

Uruchomienie bootloadera aktywuje dwa interfejsy programujące:

  • SWD, który został opisany we wcześniejszym rozdziale i pozwala na programowanie mikrokontrolera z użyciem programatora/debuggera np. STLINK-V2 lub STLINK-V3MINIE.
  • UART, który pozwala na użycie zwykłego konwertera USB-UART w roli programatora, np. KAmod USB-UART-mini. Należy wtedy podłączyć do styków A9 oraz A10 linie interfejsu UART, gdzie:
    • A9 – wyjście TXD mikrokontrolera należy podłączyć do wejścia RXD konwertera USB-UART,
    • A10 – wejście RXD mikrokontrolera należy podłączyć do wyjścia TXD konwertera USB-UART.
  • USB, który pozwala na bezpośrednie programowanie mikrokontrolera podłączonego do komputera PC. Po prawidłowym zainicjowaniu interfejsu mikrokontroler zostanie rozpoznany jako urządzenie STM32 BOOTLOADER:



Ze względu na pewne uwarunkowania techniczne prawidłowe działanie bootloadera z interfejsem USB w układzie STM32F401CCU jest możliwe tylko wtedy, gdy układ ma temperaturę zbliżoną do 25°C. Tylko w takich warunkach możliwe jest wystarczająco precyzyjne działanie zintegrowanego generatora taktującego. Mikrokontroler można programować poprzez jeden z interfejsów: SWD, UART lub USB za pomocą aplikacji STM32CubeProgrammer, który jest dostępny na oficjalnej stronie STMicroelectronics: https://www.st.com/en/development-tools/stm32cubeprog.html


Płytka KAmod BlackPill 401 umożliwia programowanie mikrokontrolera poprzez interfejs USB z użyciem Arduino IDE. Należy wtedy:


Następnie, po utworzeniu nowego szkicu, w zakładce Tools:

  • należy wybrać płytkę: BlackPill F401CC,
  • należy ustawić Upload method na: STM32CubeProgrammer(DFU),
  • USB support należy ustawić na: CDC (generic Serial),
  • U(S)ART support należy ustawić na: Enabled (generic Serial)



Dodatkowe elementy – dioda LED oraz przycisk
Komponent Funkcja

D3 – LED (C13)
SW3 – KEY (A0)

  • Dioda LED dołączona do portu PC13, aktywna w stanie L
  • Mikroprzycisk dołączony do portu PA0, aktywny w stanie L

Płytka KAmod BlackPill 401 zawiera elementy dodatkowe – diodę LED i mikroprzycisk, które mogą być użyte w docelowej aplikacji.

Dioda LED jest podłączona do portu PC13, jej zaświecenie następuje przy stanie niskim.

Mikroprzycisk jest dołączony do portu PA0, jego wciśnięcie wymusza stan niski na tym porcie. Przycisk jest dołączony poprzez rezystor 1k, zatem nie ma możliwości uszkodzenia portu PA0 skonfigurowanego jako wyjście.


Złącza GPIO
Złącze Funkcja
J1, J2
  • Złącza o 20 stykach z rastrem 2,54 mm, do których doprowadzone są porty GPIO mikrokontrolera oraz zasilanie 5 V i 3,3 V

Złącza GPIO J1 i J2 zawierają po 20 szpilek, do których doprowadzone są linie zasilania 5 V, 3,3 V, masa GND oraz wyprowadzenia GPIO modułu mikrokontrolera. Porty GPIO tolerują napięcie 5 V (5 V tolerant). Dokładny opis wyprowadzeń oraz niektóre ich dodatkowe funkcje pokazuje rysunek i tabela poniżej.


Wymiary

Wymiary płytki KAmod BlackPill 401 to 53,5x23 mm, a wysokość wynosi ok. 7 mm (bez wlutowanych szpilek goldpin).

Program testowy

Uproszczony kod programu testowego znajduje się poniżej, można go skompilować w środowisku Arduino.

#include <STM32RTC.h>

#define LED_PIN   PC13
#define SW_PIN    PA0

int message_period = 0;
int config_state = 0;
int ports_state = 0;
int pindex = 0;

STM32RTC& rtc = STM32RTC::getInstance();

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  pinMode(SW_PIN, INPUT_PULLUP);
  rtc.begin(); // initialize RTC 24H format
}

// the loop function runs over and over again forever
void loop() {
  //digitalWrite(LED_PIN, HIGH);
  if (digitalRead(SW_PIN) == HIGH){
    if ((ports_state&4) > 0){
      digitalWrite(LED_PIN, HIGH);      
    } else {    
      digitalWrite(LED_PIN, LOW);      
    }

    if (config_state > 0){
      IO2input();
      config_state = 0;
    }

  } else {
    if ((ports_state&1) > 0){
      digitalWrite(LED_PIN, HIGH);      
    } else {    
      digitalWrite(LED_PIN, LOW);      
    }
    
    if (config_state == 0){
      IO2output();
      config_state = 1;
    }


    if (config_state == 1){
      IO2low();
      IOwriteIndexed(pindex, 1);
      pindex++;
      if (pindex > 26) pindex = 1;
    }
  }

  // check if plugged into a host
  if (message_period >= 11){
    message_period = 0;
    
    int tmt = rtc.getMinutes();
    Serial.print("KAmod BlackPill401 RTC=");
    if (tmt < 10) Serial.print("0");
    Serial.print(tmt);
    
    tmt = rtc.getSeconds();
    Serial.print(":");
    if (tmt < 10) Serial.print("0");
    Serial.println(tmt);
  }
  
  delay(200); 
  message_period++;
  ports_state++;
}

void IO2output(){
  //pinMode(PA0, OUTPUT); //switch
  pinMode(PA1, OUTPUT);
  pinMode(PA2, OUTPUT);
  pinMode(PA3, OUTPUT);
  pinMode(PA4, OUTPUT);
  pinMode(PA5, OUTPUT);
  pinMode(PA6, OUTPUT);
  pinMode(PA7, OUTPUT);

  pinMode(PA8, OUTPUT);
  pinMode(PA9, OUTPUT);
  pinMode(PA10, OUTPUT);
  pinMode(PA15, OUTPUT);

  pinMode(PB0, OUTPUT);
  pinMode(PB1, OUTPUT);
  pinMode(PB2, OUTPUT);
  
  pinMode(PB3, OUTPUT);
  pinMode(PB4, OUTPUT);
  pinMode(PB5, OUTPUT);
  pinMode(PB6, OUTPUT);
  pinMode(PB7, OUTPUT);
  pinMode(PB8, OUTPUT);
  pinMode(PB9, OUTPUT);

  pinMode(PB10, OUTPUT);

  pinMode(PB12, OUTPUT);
  pinMode(PB13, OUTPUT);
  pinMode(PB14, OUTPUT);
  pinMode(PB15, OUTPUT);
  //pinMode(PC13, OUTPUT);  //led
}

void IO2input(){
  //pinMode(PA0, INPUT); //switch
  pinMode(PA1, INPUT);
  pinMode(PA2, INPUT);
  pinMode(PA3, INPUT);
  pinMode(PA4, INPUT);
  pinMode(PA5, INPUT);
  pinMode(PA6, INPUT);
  pinMode(PA7, INPUT);

  pinMode(PA8, INPUT);
  pinMode(PA9, INPUT);
  pinMode(PA10, INPUT);
  pinMode(PA15, INPUT);

  pinMode(PB0, INPUT);
  pinMode(PB1, INPUT);
  pinMode(PB2, INPUT);

  pinMode(PB3, INPUT);
  pinMode(PB4, INPUT);
  pinMode(PB5, INPUT);
  pinMode(PB6, INPUT);
  pinMode(PB7, INPUT);
  pinMode(PB8, INPUT);
  pinMode(PB9, INPUT);

  pinMode(PB10, INPUT);

  pinMode(PB12, INPUT);
  pinMode(PB13, INPUT);
  pinMode(PB14, INPUT);
  pinMode(PB15, INPUT);

  //pinMode(PC13, INPUT);  //led
}

void IO2low(){
  //digitalWrite(PA0, LOW); //switch
  digitalWrite(PA1, LOW);
  digitalWrite(PA2, LOW);
  digitalWrite(PA3, LOW);
  digitalWrite(PA4, LOW);
  digitalWrite(PA5, LOW);
  digitalWrite(PA6, LOW);
  digitalWrite(PA7, LOW);

  digitalWrite(PA8, LOW);
  digitalWrite(PA9, LOW);
  digitalWrite(PA10, LOW);
  digitalWrite(PA15, LOW);

  digitalWrite(PB0, LOW);
  digitalWrite(PB1, LOW);
  digitalWrite(PB2, LOW);
  
  digitalWrite(PB3, LOW);
  digitalWrite(PB4, LOW);
  digitalWrite(PB5, LOW);
  digitalWrite(PB6, LOW);
  digitalWrite(PB7, LOW);
  digitalWrite(PB8, LOW);
  digitalWrite(PB9, LOW);

  digitalWrite(PB10, LOW);

  digitalWrite(PB12, LOW);
  digitalWrite(PB13, LOW);
  digitalWrite(PB14, LOW);
  digitalWrite(PB15, LOW);

  //digitalWrite(PC13, LOW);   
}

void IO2high(){
  //digitalWrite(PA0, HIGH); //switch
  digitalWrite(PA1, HIGH);
  digitalWrite(PA2, HIGH);
  digitalWrite(PA3, HIGH);
  digitalWrite(PA4, HIGH);
  digitalWrite(PA5, HIGH);
  digitalWrite(PA6, HIGH);
  digitalWrite(PA7, HIGH);

  digitalWrite(PA8, HIGH);
  digitalWrite(PA9, HIGH);
  digitalWrite(PA10, HIGH);
  digitalWrite(PA15, HIGH);

  digitalWrite(PB0, HIGH);
  digitalWrite(PB1, HIGH);
  digitalWrite(PB2, HIGH);
  
  digitalWrite(PB3, HIGH);
  digitalWrite(PB4, HIGH);
  digitalWrite(PB5, HIGH);
  digitalWrite(PB6, HIGH);
  digitalWrite(PB7, HIGH);
  digitalWrite(PB8, HIGH);
  digitalWrite(PB9, HIGH);

  digitalWrite(PB10, HIGH);

  digitalWrite(PB12, HIGH);
  digitalWrite(PB13, HIGH);
  digitalWrite(PB14, HIGH);
  digitalWrite(PB15, HIGH);

  //digitalWrite(PC13, HIGH);   
}

void IOwriteIndexed(int index, int state){
  int pp = 1;

  switch (index){
    //case 0: pp = PA0; break;
    case 1: pp = PA1; break;
    case 2: pp = PA2; break;
    case 3: pp = PA3; break;
    case 4: pp = PA4; break;
    case 5: pp = PA5; break;
    case 6: pp = PA6; break;
    case 7: pp = PA7; break;

    case 8: pp = PB0; break;
    case 9: pp = PB1; break;
    case 10: pp = PB2; break;
    case 11: pp = PB10; break;

    case 12: pp = PB12; break;
    case 13: pp = PB13; break;
    case 14: pp = PB14; break;
    case 15: pp = PB15; break;

    case 16: pp = PA8; break;
    case 17: pp = PA9; break;
    case 18: pp = PA10; break;
    
    //case 19: pp = PA11; break
    //case 20: pp = PA12; break
    
    case 19: pp = PA15; break;

    case 20: pp = PB3; break;
    case 21: pp = PB4; break;
    case 22: pp = PB5; break;
    case 23: pp = PB6; break;

    case 24: pp = PB7; break;
    case 25: pp = PB8; break;
    case 26: pp = PB9; break;
  }

  pinMode(pp, OUTPUT);
  if (state > 0){
    digitalWrite(pp, HIGH);
  } else {
    digitalWrite(pp, LOW);
  }
}




Działanie programu polega na uruchomieniu portu szeregowego na bazie interfejsu USB oraz modułu zegara RTC i cyklicznym wysyłaniu informacji o czasie poprzez ten port szeregowy.

Działaniu programu towarzyszy powolne miganie diody LED D3. Gdy zostanie naciśnięty przycisk KEY (SW3) to na wszystkich portach kolejno będzie ustawiany stan wysoki oraz dioda LED zacznie pulsować szybko.

Linki