マイコン

今さらLPCXpressoメモ (2)

割り込み待ち 割り込み待ち命令の組込み関数は、__WFI() クロック出力 LPC812 Xpressoの場合、P0_1ピンにクロック出力が設定されている。 設定箇所は、lpc_board_nxp_lpcxpresso_812(ボードライブラリのプロジェクト) の board_sysinit.c の Board_SetupMuxi…

固定小数点計算ふたたび

前回の 固定小数点の再発明 - 滴了庵日録 ではROMサイズがかえって増えるという残念な結果になったので、C++でクラス化することはあきらめてC言語で書きなおした。 fixed24.h #ifndef _FIXED24_H #define _FIXED24_H #include<stdint.h> typedef int32_t fixed24; #def</stdint.h>…

今さらLPCXpressoメモ

ひさしぶりにLPCXpresso使ったら、使い方忘れてたのでメモ。 IDEのインストール 最新版のLPCXpresso IDE (今日現在でv8.2.2_650) をダウンロードしてインストールする。 Windowsでは、通常は C:\nxp\LPCXpresso_8.2.2_650 にインストールされる。 IDEの起動 …

固定小数点の再発明

Adafruit TrinketのようなROMが数キロバイトしかないマイコンでは、float型を用いると浮動小数点のライブラリがROM容量を圧迫してしまう。そこで固定小数点クラスを作ってみた。【2019/05/24 追記】 Arduino IDEでビルドしてみたところ、AVRマイコンではfloa…

Arduinoのしょうもない落とし穴

踏んでしまったのでメモ。操作ミスまたは一時的なバックアップのつもりでうっかり下図のようなファイルコピーをおこなったとする。このとき、test.ino を開いてもArduino IDE上に test - コピー.ino は表示されない。空白や日本語を含むファイル名のソースは…

Arduino系マイコンで超いいかげんなprintf

Arduino系のマイコンでprintfをシリアルに出力するためのいいかげんなマクロ static char print_buff[256]; // ←メモリが許すなら十分大きくとる #define printf(...) sprintf(print_buff, __VA_ARGS__), Serial.print(print_buff) sprintf()とSerial.print(…

マイコンでTensorFlow!? (4)

今回はいよいよTensorFlow Liteのサンプルコードをビルドしてボードに書き込んでみます。 サンプルコードの内容 SparkFun Edgeボードの2つのマイクに入力される音声から「Yes」と「No」という単語を検出します。これには畳み込みニューラルネットワークによ…

マイコンでTensorFlow!? (3)

今回はサンプルコードのビルドとボードへの書き込みをやってみます。以下の2つを試します。 Edge Test:GPIO、UART、ADC、I2Cなどのハードウェア機能のデモ。 Makefile Project Template : 自分でプロジェクトを作るためのテンプレート。 (1) Edge Test 4つ…

マイコンでTensorFlow!? (2)

今回は開発環境をセットアップしていきます。前回説明した通り、SparkFun EdgeボードはまだGUIなIDEが用意されていないので、コマンドラインベースの開発環境を構築する必要があります。 (1) Bash コマンドラインツール、いわゆるシェルです。MacやLinuxを使…

マイコンでTensorFlow!? (1)

ワンチップマイコンでTensorFlowが動くという驚きのTensorFlow Lite対応ボードを入手しました。人柱レポートしていきます。 TensorFlow Liteとは ごぞんじGoogleが世に出した機械学習フレームワークTensorFlowの軽量版です。強力なクラウドサーバやPCではな…

Arduinoのハードウェアシリアルのボーレート誤差

AVR 5V(16MHz)系 (Uno, Mega, Leonardo, Micro, Pro Mini 5V など) ボーレート設定 実際のボーレート 誤差[%] 9600 9615.4 0.16 19200 19230.8 0.16 38400 38461.5 0.16 57600 58823.5 2.12 115200 117647.1 2.12 230400 222222.2 3.55 基本的には倍速動作で…

STM32のRTCの落とし穴

STM32のRTCを使ってみてハマった落とし穴などについて書く。 環境は、STM32F767ZI (Nucleo-F767ZI) + HALドライバ + CubeMX + IAR EWARM 以下では単にSTM32と書くが、STM32F767ZIでしか試していない。 やや不可解な内容も含むので誤りがあればご指摘ください…

独断と偏見で選ぶ五大Arduino系ボード

いろいろ種類が増えすぎたArduino系マイコンボード。僕がよく使うものを中心にチョイス。(かなり偏ったチョイスです。) Arduino UNO : 最初の1台に。リファレンス用に。 GR-SAKURA : 実戦むき。UNOサイズの高性能ボード。 Arduino Pro Mini : ちっちゃいも…

mbedのプロジェクトにmbed-srcをインポートする

mbedのwebコンパイラでプロジェクトを作成すると、mbedライブラリ(歯車のアイコン)はドキュメントのみでソースが含まれない。 ソースをインポートするには以下のようにする。 mbed-srcから import into Compiler をクリックし、Target Pathでインポート先の…

GR-CITRUS + WA-MIKANをC++で使う

Rubyなにそれおいしいのシリーズ(笑) GR-CITRUS+WA-MIKANは、Rubyの環境(Rubic)ではGR-CITRUSからWA-MIKANのWiFi機能を使うクラスが用意されていますが、ArduinoライクなC++環境であるIDE for GRではクラスが用意されていません。かたくなにC++でGR-CITRUS+W…

STM32のリセットフラグ

ウォッチドッグによってリセットしたことは下記のコードでチェックできる。 // ウォッチドッグによってリセットしたか? if(READ_BIT(RCC->CSR, RCC_CSR_IWDGRSTF)) { // フラグのクリア CLEAR_BIT(RCC->CSR, RCC_CSR_IWDGRSTF); } 同様に下記のようなフラグ…

Arduino UNO のタイマ資源

毎度気になるArduino系やmbed系マイコンボードでのタイマ資源の問題。 Arduino UNOでは、下記のようになっているらしい。競合に要注意。 Timer0 8bit delay(), millis(), micros()などの時間管理5,6番ピンのPWM Timer1 16bit ServoライブラリTimer1ライブラ…

STM32のバックアップレジスタ

バックアップレジスタとは? STM32マイコンには主電源(Vdd)を落としてもバックアップ電源(Vbat)で値が保持されるバックアップレジスタがある。 一種の不揮発性メモリとして利用できる。 ただし容量は、マイコンの型番によるが20〜128バイト程度しかない。(ST…

IAR EWARMのMAPファイルの見方

項目 内容 先頭 実行したコマンドライン等の情報 RUNTIME MODEL ATTRIBUTES よくわからん HEAP SELECTION よくわからん PLACEMENT SUMMARY ・各セクションの先頭アドレス・各オブジェクトの配置(よくわからん) INIT TABLE 変数の初期化テーブル MODULE SUMMA…

マイコンでtan(355/226)の計算

tan(355/226)の計算は関数電卓の正確さを試すベンチマークによく使われるらしいです。というのも、355/226はπ/2に極めて近い有理数であり、π/2近傍でtanは無限大に発散するからです。 下表のように両者は10進数で7桁まで一致しています。 π/2 1.570796326794…

STM32のブラウンアウトリセット

STM32マイコンにはブラウンアウトリセット(BOR)の機能がある。ブラウンアウトリセットとは、ざっくり言うと電源電圧が(パワーダウンするほどでもないが)ちょっと下がったときにリセットをかけることである。この機能はデフォルトではOFFになっており、オプ…

CubeMXでIWDGを有効にしたときの小技

CubeMXでIWDG(ウォッチドッグタイマ)を有効にした場合、自動生成される初期化コードでIWDGがスタートしてしまうため、デバッガで実行を止めるとIWDGによってリセットがかかってしまう。これを回避するためには、デバッグ時には下記のようなマクロをmain.cの …

CubeMX環境でLLドライバのフル機能を使う

CubeMXを使ったSTM32マイコンの開発環境(ここではIAR EWARMを想定)でLLドライバの全APIを利用するための設定について簡単にメモ。(すこし事情がややこしいです。間違ってたらご指摘ください。) CubeMXでは、抽象度の高いHALドライバまたは低水準のLLドライ…

CubeMX/HALのSystick割り込みについて

STM32マイコンのCubeMX/HAL環境では、HALライブラリ内でSystick割り込みを利用してHAL_Delay関数や通信のタイムアウト処理等の時間を管理している。(Tickカウンタの変数名はuwTickである。) Systick割り込みより優先しなければならない他の割り込みがある場…

STM32のTips (Flash関係)

開発環境はIARのEWARMです。 binファイルの生成 デフォルトではプロジェクトをビルドするとoutファイルが生成されます。outファイルからbinファイル(バイナリイメージ)を生成するには、プロジェクトの[オプション]の[出力コンバータ]にて、[追加出力ファイル…

CubeMXのコードを流用して音声再生

この記事はMbed Advent Calendar 2017の23日目の記事です。 STM32のCubeMXの吐いたコードをmbedにコピペしても、ふつうにコンパイルできます。HALライブラリのAPIもふつうに使えます。そこで、Nucleo-F767ZIをmbedで使用しつつ、CubeMXで生成したコードをコ…

Nucleo/mbedのタイマリソースの調査

この記事はMbed Advent Calendar 2017の19日目の記事です。 目的 mbedベースでお手軽に開発しつつ、痒い所だけ本気出して底からコード書くようなスタイルが好みです。ただしそのとき問題になるのが、mbedライブラリがどういうリソースの使い方をしているかと…

nRF52ミニ基板「斑鳩」の試作

この記事はMbed Advent Calendar 2017の8日目の記事です。 BLEマイコンnRF52搭載のミニ基板「斑鳩」の試作について書きます。「斑鳩」はオープンソースハードウェアです。今はまだ試作段階ですが、そのうちイベント等で頒布するかも。12/16(土)・17(日)開催…

IARコンパイラのWarning抑制

IAR C/C++コンパイラで、使われていない関数や変数についての警告を抑制するおまじない。 (あくまでデバッグ用。最終的にはそんなものは残さない。) #pragma diag_suppress=Pe177 // never referenced function #pragma diag_suppress=Pe550 // never used…

CubeMX環境でprintfを使う

UART出力 STM32マイコンのCubeMX環境(HAL Driver使用)でprintfを使ってUARTに文字列を出力したい場合、下記のようなputchar関数を実装すればよい。この例では標準出力をUART2に出力している。もちろん、あらかじめCubeMXで対応するUARTの設定をおこなって初…