STM32F103C8 のやっすいボード (bluepill などと呼ばれているらしい) については数年前に書いた STM32F103 C8 T6 の安いボードでLチカ (platformio + mbed) が、これを題材にして ChibiOS の環境を用意する。

レポジトリとChibiOSの依存の追加

適当に git repo を作って ChibiOS を submodule に追加する。もちろんただダウンロードしてきてコピーしても良いがとにかくレポジトリ内に全コードを入れておく

mkdir foo
cd foo
git init
git submodule add git@github.com:ChibiOS/ChibiOS.git

demo から一番近い設定を持ってくる

できれば同じ MCU のボードだと変更点がすくなくてよい。Bluepill は Maplemini というののクローンの一種らしいので、そこからコピーしてくる。

cp -r ChibiOS/demos/STM32/RT-STM32F103-MAPLEMINI/* .

Makefileを書きかえる

CHIBIOS  := ./ChibiOS 

ボード定義を自分で作りなおす

手元にあるボードと、既にあるボード定義はだいたい一致していないので、修正する必要がある。

Makefile に以下のような行がある。

include $(CHIBIOS)/os/hal/boards/MAPLEMINI_STM32_F103/board.mk  

このディレクトリをまるっと自分のディレクトリにコピーする

cp -r ChibiOS/os/hal/boards/MAPLEMINI_STM32_F103 STM32F103_BLUEPILL

board.mk を編集する。まずはパスを変更したディレクトリにあわせるだけ。

# List of all the board related files.
BOARDSRC = STM32F103_BLUEPILL/board.c

# Required include directories
BOARDINC = STM32F103_BLUEPILL

# Shared variables
ALLCSRC += $(BOARDSRC)
ALLINC  += $(BOARDINC)

board.h を確認して、必要であれば編集する。

まずクロック設定があっているか確認する。実際の基板のものとあってないと何もかもがおかしくなる。後述する mcuconf.h と組合せてよくチェックする。

#define STM32_LSECLK            32768
#define STM32_HSECLK            8000000

VAL_GPIOACRL など、GPIO の初期設定を必要に応じて変更する。とはいえアプリケーションコード (main.c) で、palSetPadMode などで、あとから変えることもできるので必須ではない。

ここまででベースはおわり。make は通るはず

ほかのチェックポイント

  • cfg/mcuconf.h で各クロックのプリスケーラーなどが正しいか確認する
  • cfg/mcuconf.h で STM32_ST_USE_TIMER で指定したタイマーは OS によって予約されるので適切にする
  • cfg/mcuconf.h で利用する HAL ドライバーを有効にする。
  • cfg/halconf.h で必要なサブシステム設定を有効にする。

備考: STM32F103 での Alternate function の設定方法は?

入力として使う alternate function は、ピンに特別な設定は必要なく、PAL_MODE_INPUT などにして、ペリフェラル側の設定を有効にするだけで良い。

出力として使う alternate function は、ピンにもPAL_MODE_STM32_ALTERNATE_PUSHPULL を指定する必要がある。

(STM32F401 などとは設定方法が違う)

備考: 「これをChibiOSでやる方法がわからん」

ChibiOS の HAL ドライバのインターフェイスは MCU ごとに柔軟に設定できるようになっている。裏をかえすと、基本的に MCU ごとに設定方法を変えなければならない。

一番簡単なのは定義を読むことで、ChibiOS/os のディレクトリで git grep したりして、必要なソースコードを読むのがてっとりばやい。ChibiOS は幸い、あまり変なコードはなく素直に読みくだせるようになっている。

特殊なことをしないなら HAL ドライバを使ったほうが圧倒的に楽だが、もちろん利用せずに自力でレジスタを設定しても良い。データシートを読みながらペリフェラルを設定する場合は結局こうすることになる。その場合 mcuconf.h で利用するペリフェラルのドライバは無効にすること。

感想

できたものは https://github.com/cho45/STM32F103C8-ChibiOS

STM32 の開発環境で悩んでいて、ちょうどよく気にいるものがなかなくていろいろ試している。STM32 デバイスでの例が多く抽象化やビルドシステムもちょうどよく手に収まる感じで、今のところいい感じ。

ChibiOS は RTOS のライセンスがGPLであるのが若干やっかいだが、OSS ならまぁ GPL 採用すればいいので気にしないことにする。

  1. トップ
  2. tech
  3. STM32F103C8 で ChibiOS を使ってみる

以下をいれるととりあえずおさまる。ccls と相性が悪い??

let g:lsp_insert_text_enabled = 0
let g:lsp_text_edit_enabled = 0  

あとラベルが勝手に補完に含まれるのはinitialization_optionsになんか指定するとよいらしい?

	   au User lsp_setup call lsp#register_server({
		  \ 'name': 'ccls',
		  \ 'cmd': {server_info->['ccls']},
		  \ 'root_uri': {server_info->lsp#utils#path_to_uri(lsp#utils#find_nearest_parent_file_directory(lsp#utils#get_buffer_path(), 'compile_commands.json'))},
		  \ 'initialization_options': #{
		  \    cache: #{directory : '/tmp/ccls_cache'},
		  \    completion: #{detailedLabel: v:false}
		  \ },
		  \ 'whitelist': ['c', 'cpp', 'objc', 'objcpp', 'cc'],
		  \ })
https://github.com/prabirshrestha/vim-lsp/issues/328#issuecomment-555304328
  1. トップ
  2. tech
  3. ccls + vim-lsp で補完時に後続のwhitespaceが削除される

測定方法について

以下を根拠に測定する

測定前の知識

アマチュアの F3E の占有周波数帯幅の許容値は 40kHz (ただし 430-440MHz では 30kHz)。ただし事実上の帯域幅は 16kHz 程度になっていることが多い。

周波数変調は振幅が周波数偏移になるため、最大振幅でどれぐらい周波数偏移をするかを決めなければならない。アマチュアで通常使われてる狭帯域FMで、最大振幅時の最大周波数偏移は ±5kHz。

測定準備

標準変調度とは、通常、規定の最大周波数偏移許容値を100%としたものであり、最大周波数偏移の許容値が規定されていない場合は工事設計書の設計値(工事設計書に記載される値)の最大周波数偏移を100%としたものである。基準周波数偏移とは、試験機器の最大周波数偏移が規則で規定されていない場合、測定のための基準点の周波数偏移である。

で F3E では、「標準変調度又は基準周波数偏移(位)」は「正弦波1kHzで最大周波数偏移の70%」になる。測定時には「基準周波数偏移の入力から10dB増加(擬似音声)」

アマチュアのF3Eの場合「標準変調度とは (略) 工事設計書の設計値(工事設計書に記載される値)の最大周波数偏移を100%としたものである」が適用される。工事設計書の設計値の最大周波数偏移は通常±5kHzなので、つまり 1kHz 入力したときに、5 * 0.7 = 3.5kHz 周波数偏移するように入力ゲインを変更し、疑似音声はこのときのレベルに +10dB することになる。

前に書いた「特定の変調指数になるようにゲインを調整したい場合」にそって 1kHz で変調指数 3.5 になるようにして、疑似音声をそれの +10dB で出力できるように信号源のゲインを調整する。

今回は温度制限がかかるので、出力は 5W (37dBm) でやる。(本来は最大でやらなければならない)

1kHz で最大周波数偏位 3500Hz にあわせる。


(52013416 - 52006833) / 2 = 3291Hz

測定周波数

FM なので 50MHz 帯で測定することにする。別表第三十五 証明規則第2条第1項第12号に掲げる無線設備の試験方法によれば、50MHzは50〜54MHzと、2MHz以上の帯域があり、この場合の試験周波数は3波になる。

  • 下限周波数に 60kHz 加えた周波数
    • 50060000Hz
  • 中央の周波数
    • 52000000Hz
  • 上限周波数から60kHz減じた周波数
    • 53940000Hz

正直めんどい。同じことを3回やるだけなので、今回は省略して中央のみで行う。

帯域外領域

占有周波数帯幅の許容値が40kHz なので 帯域外領域は 2.5倍して ±100kHz。
無変調で測定する。

「30MHzを超え54MHz以下」「1Wを超え50W以下」の条件では「1mW以下であり、かつ、基本周波数の平均電力より60dB低い値」

スプリアス領域

「50μW以下又は基本周波数の搬送波電力より70dB低い値」-13dBm または搬送波電力-70dB以下ならよい

RBW=1kHz 9kHz〜150kHz

RBW=10kHz 150kHz〜30MHz

RBW=100kHz 30MHz〜520MHz

ref

https://www.hakodate-ct.ac.jp/~moriya/class/5SCE_Exp/text05-1.pdf
http://ja5fp.org/bessel.pdf

  1. トップ
  2. tech
  3. スペアナでスプリアス測定してみる3 KX3 FMの測定