Nucleo 8S208RB セットアップ + 小物

インテルMac + VSCode + PIO
Platform: ST STM8 2.1.0

# Lチカ

フォルダー
`~/.platformio/platforms/ststm8/examples/spl-blink`
をまとめてどこかにコピーします。

```bash
$ pio run -e nucleo_8s208rb --target upload
```

## 補足

最低限にしてみた

```platformio.ini
[env:nucleo_8s208rb]
platform = ststm8
board = nucleo_8s208rb
framework = spl
```

```main.c
#include "stm8s.h"
#include "stm8s_it.h"

void main(void)
{

  GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_LOW_FAST);

  while (1)
  {
    GPIO_WriteReverse(GPIOC, GPIO_PIN_5);
    for (uint32_t c = 200000L; c > 0; c--) {}
  }

}

// from example

#ifdef USE_FULL_ASSERT

void assert_failed(uint8_t *file, uint32_t line)
{
  (void)file;
  (void)line;
  while (1)
  {
  }
}
#endif
```

最後の `void assert_failed(uint8_t *file, uint32_t line)` はエラーがあったときのためのようです。

# デバッグ

未だに成功していません。やむを得ず，UARTによるデバッグを先に確かめます。

# UARTを試す

フォルダー
`~/.platformio/platforms/ststm8/examples/spl-uart-simple-printf`
をまとめてどこかにコピーします。

```platformio.ini
[env:nucleo_8s208rb]
platform = ststm8
board = nucleo_8s208rb
framework = spl
```
を追加します。

```bash
$ pio run -e nucleo_8s208rb --target upload; pio device monitor -b 115200

（中略）

--- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H
Hello, world!
Hello, world!

（Ctrl+C を押す）

$ 
```

## 補足

例によって簡略化すると

```main.c
UART1_DeInit();
UART1_Init(
  (uint32_t)115200,
  UART1_WORDLENGTH_8D,
  UART1_STOPBITS_1,
  UART1_PARITY_NO,
  UART1_SYNCMODE_CLOCK_DISABLE,
  UART1_MODE_TXRX_ENABLE);
```

で設定完了です。NucleoではPA4/PA5がSTLINKのVCPと接続されていますので，そのままシリアルモニターで確認できます。

RM0016によれば，GPIOに Alternate Function のような設定はなく，
UART1を使えるようにすれば，割り当てられている PA4/PA5 がUART1として使えるようになるという感じのようです。

上のサンプルでは `printf` も使えるようになっているので，シリアルモニターでデバッグが可能ですね。

```main.c
    printf("GPIOE->IDR [4] %d\r\n", ((GPIOE->IDR) & 1<<4) >> 4);
```

芸が無いですが... GPIOE IDR 4ビット目 NucleoではUSERボタンを読んでいます。

# 動作周波数を決める

16MHz

```main.c
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
```

`DIV1` を `DIV2` にすれば 8MHz

# タイマーでLチカ

以下のサンプルを移植させていただきました m(_ _)m

- https://hirasaka001.blogspot.com/2015/12/stm8s-sdccst.html?m=1

フォルダー
`~/.platformio/platforms/ststm8/examples/spl-blink`
をまとめてどこかにコピーします。

逆順になりましたが，`stm8s_conf.h` をよく見て，使うインクルードファイルがコメントアウトされていないか確認する必要があります。

以下追記しました。

```stm8s_conf.h
#if defined (STM8S208) || defined (STM8AF52Ax)
// #include "stm8s_can.h"
#endif /* (STM8S208) || (STM8AF52Ax) */
//#include "stm8s_clk.h" // ここを使います。
//#include "stm8s_exti.h"
//#include "stm8s_flash.h"
#include "stm8s_gpio.h"
//#include "stm8s_i2c.h"
//#include "stm8s_itc.h"
//#include "stm8s_iwdg.h"
//#include "stm8s_rst.h"
//#include "stm8s_spi.h"
//#include "stm8s_tim1.h" // ここも使います。
```
変更後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/cc8c4a53-0072-451c-f7e1-b9f5ec2e0b93.png)

SPLの場合，割り込みハンドラは `stm8s_it.c` に書く流儀のようです。ここにLチカ本体を書きます。

変更前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/6a256527-edb9-51c6-9754-a70d7c71c583.png)

変更後
```stm8s_it.c
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
  TIM1_ClearFlag(TIM1_FLAG_UPDATE); // 再スタート
  GPIO_WriteReverse(GPIOC, GPIO_PIN_5);
  return;
}
```

```main.c
#include "stm8s.h"
#include "stm8s_it.h"

void main(void)
{

  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1); // 16MHz

  GPIO_Init(GPIOC, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);

  TIM1_DeInit();
  TIM1_TimeBaseInit(
    1599, // prescaler
    TIM1_COUNTERMODE_UP, 
    5000,  // period
    0);
  TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
  TIM1_Cmd(ENABLE); // start TIM1

  enableInterrupts();

  while (1)
  {
  }

}

// 以下略
```

周波数は 16MHz / (1599+1) / 5000 = 2Hz です。

# とりあえずここまで

カッコいい梱包箱ですね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533274/fa8cc4cc-e78c-a887-6dc8-044ece537898.png)

チップそのものはNRNDなのがちょっと残念ですが... 

STM32より機能がシンプルな分，マニュアルとサンプルを読みながら理解してくのが楽しいです。

# おまけ platformio CLI メモ

~/.platformio/penv にあるスクリプトで activate すると CLI も使えるようになることがわかり，それなりに便利ですね。

```bash
# create new project
$ pio project init

# Upload firmware
$ pio run --target upload

# Build specific environment
$ pio run -e nucleo_8s208rb

# Upload firmware for the specific environment
$  pio run -e nucleo_8s208rb --target upload

# Clean build files
$ pio run --target clean

# monitor
$ pio device monitor -b 115200
```