インテルMac + VSCode + PIO
Platform: ST STM8 2.1.0
Lチカ
フォルダー
~/.platformio/platforms/ststm8/examples/spl-blink
をまとめてどこかにコピーします。
$ pio run -e nucleo_8s208rb --target upload
補足
最低限にしてみた
[env:nucleo_8s208rb]
platform = ststm8
board = nucleo_8s208rb
framework = spl
#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
をまとめてどこかにコピーします。
[env:nucleo_8s208rb]
platform = ststm8
board = nucleo_8s208rb
framework = spl
を追加します。
$ 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 を押す)
$
補足
例によって簡略化すると
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
も使えるようになっているので,シリアルモニターでデバッグが可能ですね。
printf("GPIOE->IDR [4] %d\r\n", ((GPIOE->IDR) & 1<<4) >> 4);
芸が無いですが... GPIOE IDR 4ビット目 NucleoではUSERボタンを読んでいます。
動作周波数を決める
16MHz
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
DIV1
を DIV2
にすれば 8MHz
タイマーでLチカ
以下のサンプルを移植させていただきました m(_ _)m
フォルダー
~/.platformio/platforms/ststm8/examples/spl-blink
をまとめてどこかにコピーします。
逆順になりましたが,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" // ここも使います。
SPLの場合,割り込みハンドラは stm8s_it.c
に書く流儀のようです。ここにLチカ本体を書きます。
変更後
INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
TIM1_ClearFlag(TIM1_FLAG_UPDATE); // 再スタート
GPIO_WriteReverse(GPIOC, GPIO_PIN_5);
return;
}
#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 です。
とりあえずここまで
カッコいい梱包箱ですね!
チップそのものはNRNDなのがちょっと残念ですが...
STM32より機能がシンプルな分,マニュアルとサンプルを読みながら理解してくのが楽しいです。
おまけ platformio CLI メモ
~/.platformio/penv にあるスクリプトで activate すると CLI も使えるようになることがわかり,それなりに便利ですね。
# 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