前の10件 | -
CubeMX 4.23.0 + STM32CubeL1 1.8.0でCOMP2からのトリガをキャプチャする [電子工作]
L0とかF0のシリーズでは対応してるのになんでやー!?
ということで、設定ファイルを解析してL1でもCubeMXのPinout設定において、
TIM2,3,4のChannel4で"Input Capture direct from COMPx"を設定できるようにしてみた。
※L1のラインは売れ線じゃないんですかねー?その割にL0って流通してるように見えないんですけど。
L151/152CxTx以外は検証してません
条件をちゃんと設定していないので、COMPxからのdirectに対応していないタイマーでも設定できちゃうかも。
ということで、設定ファイルを解析してL1でもCubeMXのPinout設定において、
TIM2,3,4のChannel4で"Input Capture direct from COMPx"を設定できるようにしてみた。
※L1のラインは売れ線じゃないんですかねー?その割にL0って流通してるように見えないんですけど。
L151/152CxTx以外は検証してません
条件をちゃんと設定していないので、COMPxからのdirectに対応していないタイマーでも設定できちゃうかも。
~/STM32CubeMX/db/mcu/IP$ diff -uN TIM1_8L1-gptimer2_v2_x_Cube_Modes.xml_orig TIM1_8L1-gptimer2_v2_x_Cube_Modes.xml --- TIM1_8L1-gptimer2_v2_x_Cube_Modes.xml_orig2017-11-06 21:39:17.314001382 +0900 +++ TIM1_8L1-gptimer2_v2_x_Cube_Modes.xml2017-11-06 21:50:33.434001382 +0900 @@ -1303,6 +1303,7 @@+ TIM_MasterConfigSynchronization TIM_ConfigBreakDeadTime @@ -3263,6 +3264,14 @@+ + Semaphore_input_Channel4$IpInstance +Semaphore_input_Channel4_direct$IpInstance +Semaphore_CH4pinUsed$IpInstance ++ ++ Semaphore_input_Channel4$IpInstance Semaphore_input_Channel4_indirect$IpInstance
Rustでイテレータを組み合わせて素因数分解してみる [Rust]
たぶん実用性皆無
準備.素数イテレータ
まずは、素数をイテレータで生成してみる
生成済の素数列を状態として持っておいて、next()が呼ばれるたびに、
[]の場合 => 素数列を[2]にする
[2]の場合 => 素数列を[2,3]にする
[2,3,...n]の場合 => n+2から+2ずつ走査して、
生成済の素数列の全要素で割り切れないもの(=np)を探して素数列に加える
素数列の末尾を返す
とすれば良さそう
「全要素で割り切れないもの」については、検査する数の平方根までで打ち切って良い
というわけで実験
↓結果
おお、良さそう
let mut state = Vec::<64>::new() みたいな?
割るぜ!.素因数分解イテレータ
これをもとに、素因数分解してみる
ううむ、変態的だ(汗)
結果
できた!
外側のscanで(素因数分解する数, それまでに消費した素数列)を状態変数として、
素因数(f)を見つけるごとに、素因数分解する数を割って(state.0 /= f)、
素因数(Some(f))をイテレータの出力にしている
(0..)は素因数分解が終わるまでループさせるためのもの
state.0が1になったら、Noneを出力してループを終了させる
一段目は、素因数分解の終了判定と、素数列の末尾から素因数の候補を生成する
素数列が空の場合は、2を格納して2を候補とする
素数列が2だけで目的の数を2で割れない場合は、3を格納して3を候補とする
(2 -> 3だけ、+2で生成できないため)
それ以外の場合は、とりあえず素数列の末尾を候補とする
二段目のmatchで、
候補にした数で割れるならそのまま出力、
割れないならば割れる数が見つかるまで素数を生成する
14行目からのマッチが素数列を更新しながら素因数を探しているところ
素数列を生成していって(let np=...)、findで目的の数を割れるものを探している
内側のscanの状態にしている素数列は外側のscanの状態変数をミュータブル参照で
借用しないとなので所有・参照関係を解決するのがちょっと大変
あまり褒められたやり方じゃあない気も?
23行目は直接state.0を書きたいけれど、
scanでstate.1をミュータブル参照してしまっているのでできない
仕方がないので別の名前に移し替えている
なんとか動いているけれど、まだ勘所がよくわからないので
コンパイラのエラーメッセージとにらめっこでご機嫌を伺ってる感
なにぶん勉強し始めたばかりなので、 もっとカッチョイイ書き方があったら、ぜひ教えて!
準備.素数イテレータ
まずは、素数をイテレータで生成してみる
生成済の素数列を状態として持っておいて、next()が呼ばれるたびに、
[]の場合 => 素数列を[2]にする
[2]の場合 => 素数列を[2,3]にする
[2,3,...n]の場合 => n+2から+2ずつ走査して、
生成済の素数列の全要素で割り切れないもの(=np)を探して素数列に加える
素数列の末尾を返す
とすれば良さそう
「全要素で割り切れないもの」については、検査する数の平方根までで打ち切って良い
というわけで実験
for p in (0..).scan(Vec::<u64>::new(), |state, _| { let np = match state.last() { None => Some(2), Some(&2) => Some(3), Some(&n) => (1..).map(|x| x*2+n) .find(|&x| state.iter() .take_while(|&p| p*p <= x) .all(|&p| x % p != 0)) }; state.push(np.unwrap()); np }).take(10) { println!("{}", p); }
↓結果
2 3 5 7 11 13 17 19 23 29
おお、良さそう
状態変数に入れる値(Vec::<64>::new())は自動でミュータブルになるのかしら?
let mut state = Vec::<64>::new() みたいな?
割るぜ!.素因数分解イテレータ
これをもとに、素因数分解してみる
let n = 179046; for f in (0..).scan((n, Vec::<u64>::new()), |state, _| { match match (state.0, state.1.last()) { (1, _) => None, (_, None) => { state.1.push(2); Some(2) }, (n, Some(&2)) if n % 2 != 0 => { state.1.push(3); Some(3) } (_, Some(&p)) => Some(p) } { None => None, Some(f) if state.0 % f == 0 => { state.0 /= f; Some(f) }, _ => { let t = state.0; let f = (0..).scan(&mut state.1, |v, _| { let lastp = *v.last().unwrap(); let np = (1..).map(|x| x*2 + lastp) .find(|&x| v.iter() .take_while(|&pv| pv * pv <= x) .all(|&pv| x % pv != 0)); v.push(np.unwrap()); np }).find(|&x| t % x == 0 ); state.0 /= f.unwrap(); f } } } ) { println!("{}", f); }
ううむ、変態的だ(汗)
結果
2 3 3 7 7 7 29
できた!
外側のscanで(素因数分解する数, それまでに消費した素数列)を状態変数として、
素因数(f)を見つけるごとに、素因数分解する数を割って(state.0 /= f)、
素因数(Some(f))をイテレータの出力にしている
(0..)は素因数分解が終わるまでループさせるためのもの
state.0が1になったら、Noneを出力してループを終了させる
scanの関数はmatch二段掛け(汗)
一段目は、素因数分解の終了判定と、素数列の末尾から素因数の候補を生成する
素数列が空の場合は、2を格納して2を候補とする
素数列が2だけで目的の数を2で割れない場合は、3を格納して3を候補とする
(2 -> 3だけ、+2で生成できないため)
それ以外の場合は、とりあえず素数列の末尾を候補とする
二段目のmatchで、
候補にした数で割れるならそのまま出力、
割れないならば割れる数が見つかるまで素数を生成する
14行目からのマッチが素数列を更新しながら素因数を探しているところ
素数列を生成していって(let np=...)、findで目的の数を割れるものを探している
内側のscanの状態にしている素数列は外側のscanの状態変数をミュータブル参照で
借用しないとなので所有・参照関係を解決するのがちょっと大変
あまり褒められたやり方じゃあない気も?
23行目は直接state.0を書きたいけれど、
scanでstate.1をミュータブル参照してしまっているのでできない
仕方がないので別の名前に移し替えている
なんとか動いているけれど、まだ勘所がよくわからないので
コンパイラのエラーメッセージとにらめっこでご機嫌を伺ってる感
タグ:RUST
Ubuntu16.04でCLang4.0.1をGCC7.1でビルドする [C++11]
自分メモ:
Downloadサイトからもってきたソースではうまくビルドできなかった(なぜか)
ので、Subversionリポジトリから4.0.1のfinal版のtagを持ってきてビルド
前回ビルドしたGCC 7.0.1でビルドしてみる
(次からはこのClangでビルドしよう)
ついでにboostもビルドしてみる
Downloadサイトからもってきたソースではうまくビルドできなかった(なぜか)
ので、Subversionリポジトリから4.0.1のfinal版のtagを持ってきてビルド
前回ビルドしたGCC 7.0.1でビルドしてみる
(次からはこのClangでビルドしよう)
$ sudo apt install subversion $ cd $ svn co $* http://llvm.org/svn/llvm-project/llvm/tags/RELEASE_401/final llvm $ cd llvm/tools $ svn co $* http://llvm.org/svn/llvm-project/cfe/tags/RELEASE_401/final clang $ cd clang/tools $ svn co $* http://llvm.org/svn/llvm-project/clang-tools-extra/tags/RELEASE_401/final extra $ cd $ cd llvm/projects $ svn co $* http://llvm.org/svn/llvm-project/compiler-rt/tags/RELEASE_401/final compiler-rt $ cd $ mkdir clang $ cd clang/ $ cmake -G "Unix Makefiles" ../llvm \ -DCMAKE_C_COMPILER=${HOME}/local/gcc-7.1.0/bin/gcc7.1 \ -DCMAKE_CXX_COMPILER=${HOME}/local/gcc-7.1.0/bin/g++7.1 \ -DGCC_INSTALL_PREFIX=${HOME}/local/gcc-7.1.0 \ -DCMAKE_CXX_LINK_FLAGS=\ "-L${HOME}/local/gcc-7.1.0/lib64 -Wl,-rpath,${HOME}/local/gcc-7.1.0/lib64" \ -DCMAKE_INSTALL_PREFIX=${HOME}/local/clang-4.0.1 \ -DCMAKE_BUILD_TYPE="Release" \ -DLLVM_TARGETS_TO_BUILD="X86" $ make -j4 $ make install
ついでにboostもビルドしてみる
$ ./bootstrap.sh --with-toolset=clang --with-libraries=all $ ./b2 -j4 --prefix=${HOME}/local/boost-clang toolset=clang architecture=x86 cxxflags=-std=c++14 install
タグ:CLANG
Ubuntu16.04でboost 1.64を全ビルドする [C++11]
自分メモ:
OpenMPI:
必要なライブラリ:
ダウンロード:
Boost1.64ではMPIのビルドが通らないので、修正commitを取得する
※これでビルドは通るけれど、masterブランチにまるごと置き換えたほうがいいかもしれない
~/user-config.jamを用意する:
※gcc 7.1.0でビルドする場合、c++17ではビルドが通らない
ビルド:
OpenMPI:
$ curl -O https://www.open-mpi.org/software/ompi/v2.1/downloads/openmpi-2.1.1.tar.bz2 $ tar jxf openmpi-2.1.1.tar.bz2 $ cd openmpi-2.1.1 $ ./configure --prefix=${HOME}/local/OpenMPI CC=gcc7.1 CXX=g++7.1 $ make $ make install
必要なライブラリ:
$ sudo apt-get install python-dev $ sudo apt-get install zlib1g-dev $ sudo apt-get install libbz2-dev $ sudo apt-get install libicu-dev icu-devtools
ダウンロード:
$ curl -L -O https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2
Boost1.64ではMPIのビルドが通らないので、修正commitを取得する
※これでビルドは通るけれど、masterブランチにまるごと置き換えたほうがいいかもしれない
tar jxf boost_1_64_0.tar.bz2 $ cd boost_1_64_0/boost $ rm -r mpi $ cd ../libs $ rm -r mpi $ git clone https://github.com/boostorg/mpi.git $ cd mpi $ git checkout -b 1.6 refs/tags/boost-1.64.0 $ git cherry-pick e2537e507ff98ff99046d9f418f1b8233e493a2e $ git cherry-pick 00e55d8f5e5280f499bf34b2c41bb9b67c7c8549
~/user-config.jamを用意する:
※gcc 7.1.0でビルドする場合、c++17ではビルドが通らない
using gcc : 7.1.0 : g++7.1 : <cxxflags>-std=c++14 ; using mpi : mpicxx ;
ビルド:
$ cd boost_1_64_0 $ ./bootstrap.sh $ ./b2 -j4 --prefix=$HOME/local/boost toolset=gcc architecture=x86 install
Ubuntu16.04でGCC7.1をビルドする [C++11]
自分メモ:
gcc7.1.sh
$ sudo apt-get install flex $ wget ftp://ftp.gnu.org/gnu/gcc/gcc-7.1.0/gcc-7.1.0.tar.bz2 $ tar jxf gcc-7.1.0.tar.bz2 $ cd gcc-7.1.0 $ ./contrib/download_prerequisites $ cd ~ $ mkdir build $ cd build/ $ ../gcc-7.1.0/configure --prefix=${HOME}/local/gcc-7.1.0 \ --enable-languages=c,c++ \ --program-suffix=7.1 \ --disable-multilib \ --enable-linker-build-id \ --enable-shared \ --enable-threads=posix \ --with-sysroot=/ \ --enable-gnu-unique-object \ --disable-vtable-verify \ --disable-werror \ --with-tune=generic \ --enable-checking=release $ make BOOT_CFLAGS='-O' -j4 $ make install
gcc7.1.sh
export PATH=${HOME}/local/gcc-7.1.0/bin:$PATH export LD_LIBRARY_PATH=${HOME}/local/gcc-7.1.0/lib:${HOME}/local/gcc-7.1.0/lib64${LD_LIBRARY_PATH:+:}${LD_LIBRARY_PATH} export LIBRARY_PATH=${HOME}/local/gcc-7.1.0/lib:${HOME}/local/gcc-7.1.0/lib64${LIBRARY_PATH:+:}${LIBRARY_PATH}
タグ:gcc
OCamlとOPAMをソースからビルドする (Ubuntu 16.04) [OCaml]
自分メモ:
1. OPAMビルド用のOCamlをインストールする
ビルド用フォルダを用意する
$ mkdir ocaml-build
$ cd ocaml-build
最新バージョンのソースコードを入手
$ wget https://github.com/ocaml/ocaml/archive/4.04.1.tar.gz
$ tar zxf 4.04.1.tar.gz
$ cd ocaml-4.04.1
ビルドしてHOME下にインストール
$ ./configure --prefix $HOME/ocaml
$ make world.opt
$ make install
パスを通す
$ PATH=$HOME/ocaml/bin:$PATH
2. OPAMをビルドしてインストールする(その1)
ビルド用フォルダを用意する
$ cd
$ mkdir opam-build
$ cd opam-build
最新バージョンのソースコードを入手(今回は1.2.2)
$ wget https://github.com/ocaml/opam/releases/download/1.2.2/opam-full-1.2.2.tar.gz
$ tar zxf opam-full-1.2.2.tar.gz
$ cd opam-full-1.2.2
ビルド
$ ./configure
$ make lib-ext
$ make
$ sudo make install
OPAMに必要なパッケージをインストール(無くても良い)
$ sudo apt-get install git
$ sudo apt-get install mercurial
$ sudo apt-get install darcs
$ sudo apt-get install aspcud
$ sudo apt-get install m4
OPAMを設定
$ opam init
Do you want OPAM to modify ~/.profile and ~/.ocamlinit?
(default is 'no', use 'f' to name a file other than ~/.profile)
[N/y/f] y
$ eval `opam config env`
3. OPAMを使ってOCamlをインストール(本番)
$ opam switch list
$ opam switch 4.04.1 (最新)
4. OPAMビルド用のOCamlを削除
$ cd
$ rm -r ocaml
$ rm -r ocaml-build
$ cd .opam
$ rm -r system
$ vi aliases
-> systemの行を削除
5. ターミナルを再起動
(再起動したターミナルで)
$ eval `opam config env`
6. 必要なライブラリをインストールしてOPAMを再ビルド
$ opam install ocamlfind
$ opam install cmdliner.0.9.7
$ opam install jsonm.0.9.1
$ opam install dose.3.3
=> このバージョンに合わせないとOPAMのビルドに失敗する(?)
$ cd opam-build
$ rm -r opam-full-1.2.2
$ tar zxf opam-full-1.2.2.tar.gz
$ cd opam-full-1.2.2
$ ./configure
$ make
$ sudo make install
$ sudo make libinstall
1. OPAMビルド用のOCamlをインストールする
ビルド用フォルダを用意する
$ mkdir ocaml-build
$ cd ocaml-build
最新バージョンのソースコードを入手
$ wget https://github.com/ocaml/ocaml/archive/4.04.1.tar.gz
$ tar zxf 4.04.1.tar.gz
$ cd ocaml-4.04.1
ビルドしてHOME下にインストール
$ ./configure --prefix $HOME/ocaml
$ make world.opt
$ make install
パスを通す
$ PATH=$HOME/ocaml/bin:$PATH
2. OPAMをビルドしてインストールする(その1)
ビルド用フォルダを用意する
$ cd
$ mkdir opam-build
$ cd opam-build
最新バージョンのソースコードを入手(今回は1.2.2)
$ wget https://github.com/ocaml/opam/releases/download/1.2.2/opam-full-1.2.2.tar.gz
$ tar zxf opam-full-1.2.2.tar.gz
$ cd opam-full-1.2.2
ビルド
$ ./configure
$ make lib-ext
$ make
$ sudo make install
OPAMに必要なパッケージをインストール(無くても良い)
$ sudo apt-get install git
$ sudo apt-get install mercurial
$ sudo apt-get install darcs
$ sudo apt-get install aspcud
$ sudo apt-get install m4
OPAMを設定
$ opam init
Do you want OPAM to modify ~/.profile and ~/.ocamlinit?
(default is 'no', use 'f' to name a file other than ~/.profile)
[N/y/f] y
$ eval `opam config env`
3. OPAMを使ってOCamlをインストール(本番)
$ opam switch list
$ opam switch 4.04.1 (最新)
4. OPAMビルド用のOCamlを削除
$ cd
$ rm -r ocaml
$ rm -r ocaml-build
$ cd .opam
$ rm -r system
$ vi aliases
-> systemの行を削除
5. ターミナルを再起動
(再起動したターミナルで)
$ eval `opam config env`
6. 必要なライブラリをインストールしてOPAMを再ビルド
$ opam install ocamlfind
$ opam install cmdliner.0.9.7
$ opam install jsonm.0.9.1
$ opam install dose.3.3
=> このバージョンに合わせないとOPAMのビルドに失敗する(?)
$ cd opam-build
$ rm -r opam-full-1.2.2
$ tar zxf opam-full-1.2.2.tar.gz
$ cd opam-full-1.2.2
$ ./configure
$ make
$ sudo make install
$ sudo make libinstall
タグ:OCaml
STM32L151とCubeMXでfreeRTOS [電子工作]
例によってLaunchpadのGNU ARM Embedded Toolchain環境とOpenOCD+CMSIS-DAP
罠っていうかSTM32L1用のFWバグってるじゃんという
1. CubeMXでプロジェクト作成
[Pinout]
・[Middlewares]-[FREERTOS]-[Enabled]をチェック
※以下はそれぞれのボードに合わせて
・[Peripherals]-[RCC]-[High Speed Clock (HSE)]を'Crystal/Ceramic Resonator'
・[SYS]-[Debug]を'Serial Wire'
※テスト用のLED出力ピン
・PC13
GPIO_Output, ラベル='LED1'
・PC14
GPIO_Output, ラベル='LED2'
[Clock Configuration]
System Clock MuxでHSEを選択
[Configuration]
FREERTOSの設定
[Config parametes]
・[Memory management settings]-[Memory Management scheme]がデフォルトで'heap_4'なので'heap_1'に変更
(しなくてもいいけど)
[Task and Queues]
・LED1TaskとLED2Taskを、それぞれosPriorityNormalで設定
-> [Project]-[Settings]-[Project]で[Toolchain / IDE]を'SW4STM32'にして、Code Generate
2. makefile
こんな感じ
3. ソース修正!
クロックソースをMSI以外にしている場合、'STM32Cube FW_L1 V1.6.0'のSystemClock_Config()ではバグっていて起動しません。
(コンパイルオプションと運次第では起動することもある)
void SystemClock_Config(void)の下記の部分で、RCC_OSCILLATORTYPE_MSIを削除
やらなくてもいいけれど、使わないMSIを止めたい場合は
HAL_RCC_ClockConfigでSYSCLKSourceを変更した後で
4. テスト用のTaskの実装
適当に
罠っていうかSTM32L1用のFWバグってるじゃんという
1. CubeMXでプロジェクト作成
[Pinout]
・[Middlewares]-[FREERTOS]-[Enabled]をチェック
※以下はそれぞれのボードに合わせて
・[Peripherals]-[RCC]-[High Speed Clock (HSE)]を'Crystal/Ceramic Resonator'
・[SYS]-[Debug]を'Serial Wire'
※テスト用のLED出力ピン
・PC13
GPIO_Output, ラベル='LED1'
・PC14
GPIO_Output, ラベル='LED2'
[Clock Configuration]
System Clock MuxでHSEを選択
[Configuration]
FREERTOSの設定
[Config parametes]
・[Memory management settings]-[Memory Management scheme]がデフォルトで'heap_4'なので'heap_1'に変更
(しなくてもいいけど)
[Task and Queues]
・LED1TaskとLED2Taskを、それぞれosPriorityNormalで設定
-> [Project]-[Settings]-[Project]で[Toolchain / IDE]を'SW4STM32'にして、Code Generate
2. makefile
こんな感じ
PROJECT = stm32l151 DIR=~/gcc-arm/bin CC=$(DIR)/arm-none-eabi-gcc NM=$(DIR)/arm-none-eabi-nm CP=$(DIR)/arm-none-eabi-objcopy OD=$(DIR)/arm-none-eabi-objdump SZ=$(DIR)/arm-none-eabi-size # SEMIHOST_LIB = --specs=rdimon.specs -lrdimon NANOLIB = --specs=nosys.specs --specs=nano.specs OPENOCD=~/openocd TARGETCNF=stm32l1.cfg #INTERFACECNF=stlink-v2-1.cfg INTERFACECNF=cmsis-dap.cfg DEFS = -DUSE_HAL_DRIVER -DSTM32L151xB -DGCC_ARMCM3 MCU = cortex-m3 MCFLAGS = -MD -mcpu=$(MCU) -march=armv7-m -mtune=$(MCU) MCFLAGS += -std=gnu99 MCFLAGS += -mthumb -mlittle-endian -mno-unaligned-access -mno-sched-prolog # MCFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 MCFLAGS += -fno-strict-aliasing -fsigned-char MCFLAGS += -ffunction-sections -fdata-sections MCFLAGS += -fno-schedule-insns2 MCFLAGS += -fno-common -fno-hosted MCFLAGS += -mthumb-interwork MCFLAGS += -fmessage-length=0 MCFLAGS += -ffreestanding MCFLAGS += -fno-move-loop-invariants MCFLAGS += -fsingle-precision-constant # MCFLAGS += -nostartfiles MCFLAGS += -Wl,--gc-sections # MCFLAGS += -u _printf_float STM32_INCLUDES = \ -IInc \ -IDrivers/CMSIS/Device/ST/STM32L1xx/Include \ -IDrivers/CMSIS/Include \ -IDrivers/STM32L1xx_HAL_Driver/Inc/Legacy \ -IDrivers/STM32L1xx_HAL_Driver/Inc \ -IMiddlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS \ -IMiddlewares/Third_Party/FreeRTOS/Source/include \ -IMiddlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3 # OPTIMIZE = -gdwarf-2 -O0 -flto-partition=none -fipa-sra OPTIMIZE = -Os -finline -finline-functions-called-once CFLAGS = $(MCFLAGS) $(OPTIMIZE) $(NANOLIB) $(SEMIHOST_LIB) $(DEFS) $(STM32_INCLUDES) CFLAGS += -Wl,-cref -T STM32L151C8Tx_FLASH.ld AFLAGS = $(MCFLAGS) CSRC = \ $(wildcard Src/*.c) \ $(wildcard Drivers/STM32L1xx_HAL_Driver/Src/*.c) \ $(wildcard Middlewares/Third_Party/FreeRTOS/Source/CMSIS_RTOS/*.c) \ $(wildcard Middlewares/Third_Party/FreeRTOS/Source/*.c) \ $(wildcard Middlewares/Third_Party/FreeRTOS/Source/portable/GCC/ARM_CM3/*.c) \ $(wildcard Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/*.c) \ $(wildcard Middlewares/Third_Party/FreeRTOS/Source/portable/*.c) ASRC = startup/startup_stm32l151xb.s COBJ = $(CSRC:.c=.o) AOBJ = $(ASRC:.s=.o) all: build size build: elf hex lst sym elf: $(PROJECT).elf hex: $(PROJECT).hex lst: $(PROJECT).lst sym: $(PROJECT).sym %.hex: %.elf @echo $(CP) -O ihex $< $@ %.lst: %.elf @echo $(OD) -h -S -C $< > $@ %.sym: %.elf @echo $(NM) -n $< > $@ size: @echo $(SZ) $(PROJECT).hex $(SZ) $(PROJECT).elf $(SZ) -A -x $(PROJECT).elf %.elf: $(AOBJ) $(COBJ) @echo $(CC) $(CFLAGS) $^ -o $@ $(COBJ) : %.o : %.c @echo $(CC) -c $(CFLAGS) $< -o $@ $(AOBJ) : %.o : %.s @echo $(CC) -c $(CFLAGS) $< -o $@ clean: @echo find . -name '*.o' -print -or -name '*.d' -print | xargs rm -f rm -f $(PROJECT).elf $(PROJECT).hex $(PROJECT).lst $(PROJECT).sym flash: $(PROJECT).elf # $(OPENOCD)/src/openocd -s $(OPENOCD)/tcl -f board/st_nucleo_l1.cfg -c "program $^ verify reset exit" $(OPENOCD)/src/openocd -s $(OPENOCD)/tcl -f interface/$(INTERFACECNF) -f target/$(TARGETCNF) -c "program $^ verify reset exit"
3. ソース修正!
クロックソースをMSI以外にしている場合、'STM32Cube FW_L1 V1.6.0'のSystemClock_Config()ではバグっていて起動しません。
(コンパイルオプションと運次第では起動することもある)
void SystemClock_Config(void)の下記の部分で、RCC_OSCILLATORTYPE_MSIを削除
/**Initializes the CPU, AHB and APB busses clocks */ // RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); }
やらなくてもいいけれど、使わないMSIを止めたい場合は
HAL_RCC_ClockConfigでSYSCLKSourceを変更した後で
/**Initializes the CPU, AHB and APB busses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } /* ADD: stop MSI after changing SYSCLKSource */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; RCC_OscInitStruct.MSIState = RCC_MSI_OFF; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); }
4. テスト用のTaskの実装
適当に
/* StartLED1Task function */ void StartLED1Task(void const * argument) { /* USER CODE BEGIN 5 */ /* Infinite loop */ for(;;) { HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, SET); osDelay(500); HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, RESET); osDelay(500); } /* USER CODE END 5 */ } /* StartLED2Task function */ void StartLED2Task(void const * argument) { /* USER CODE BEGIN StartLED2Task */ /* Infinite loop */ for(;;) { HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, SET); osDelay(1000); HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, RESET); osDelay(1000); } /* USER CODE END StartLED2Task */ }
秋月のMEMS発振器を買ってみた [電子工作]
(写真右 スマフォ撮影なのでぶれぶれなのはご容赦を)
特に使い道は考えてないですが、発振とマイコンへの入力だけ確認して見ました。
nucleo f303k8のOSC_IN(D7)に突っ込んでCubeMXで適当にLチカするだけ。
ただこいつ、普通に5mA近く食いやがります。
(データシートではno loadでTyp.3.8mA まあ適当なテスターなので気にしない方向で)
アイドル時には内部クロックに切り替えてoutput disableにする、って使い方かなあ。
写真左は、比較用に用意して見た同じく秋月で売ってるTCXO。
2.8V Typ.ですが電源電圧範囲:2.3 V ~ 3.6 Vって書いてあるので3.3V突っ込んで動かしてます。
出力が0.8Vppでそのままではマイコンに入れられないので、ワンゲートロジックを挟んでます。
(実装面積くいますね。ちょっとじゃま)
こっちだと消費電力は2.5mAくらい。うむむむ。
STM32 TIM17とDMA Channel1でDACを駆動する [電子工作]
STM32でDACをDMAで駆動する場合、通常はTIM6/7の出力をトリガイベントとしてDACに繋げるかと思います(リファレンスにもそう書いてあるし)。
が、
STM32F051ではDAC, USARTx_RX, SPI1_TX, I2Cx_RXでChannel3を取り合っているので
あまりChannel3を使いたくない気がします。
USARTのRXはDMA使わなくてもいーんじゃね?というとそのような気もしますが、
Channel1がなんとなくヒマそうなので、Channel1にリクエストできるTIM17を使ってやってみます。
CubeMXでの設定
TIM17
Prescaler (PSC - 16 bits value) : 0
Counter Mode : Up
Counter Period (AutoReload Register - 16 bits value ) : 3000-1 * (48MHz / 16KHz = 3000)
Internal Clock Division (CKD) : No Division
Repetition Counter (RCR - 8 bits value) : 0
auto-reload preload : Disable
DMA request : TIM17_CH1/UP
Stream : DMA1_Channel1
Direction : Memory To Peripheral
Priority : Low
TIM17_CH1/UP: DMA1_Channel1 DMA request Settings:
Mode: Circular *
Peripheral Increment: Disable
Memory Increment: Enable *
Peripheral Data Width: Half Word
Memory Data Width: Half Word
DAC Out1 Settings:
Output Buffer : Enable
Trigger : None
DACのTriggerをNoneにしておくのがミソです。
Code Generateして、main.cに以下を追記
Private Variables (16KHzサンプリングでの440Hzのサイン波)
デバイス初期化の後で
(DMAをCircularモードにしているので、止めない限り出力しっぱなし)
HAL_TIM_Base_Start_DMA()は、なぜかDMAの転送先をタイマのARRレジスタにしてしまうので、
参考にして開始処理を書いてみました。
が、
STM32F051ではDAC, USARTx_RX, SPI1_TX, I2Cx_RXでChannel3を取り合っているので
あまりChannel3を使いたくない気がします。
USARTのRXはDMA使わなくてもいーんじゃね?というとそのような気もしますが、
Channel1がなんとなくヒマそうなので、Channel1にリクエストできるTIM17を使ってやってみます。
CubeMXでの設定
TIM17
Prescaler (PSC - 16 bits value) : 0
Counter Mode : Up
Counter Period (AutoReload Register - 16 bits value ) : 3000-1 * (48MHz / 16KHz = 3000)
Internal Clock Division (CKD) : No Division
Repetition Counter (RCR - 8 bits value) : 0
auto-reload preload : Disable
DMA request : TIM17_CH1/UP
Stream : DMA1_Channel1
Direction : Memory To Peripheral
Priority : Low
TIM17_CH1/UP: DMA1_Channel1 DMA request Settings:
Mode: Circular *
Peripheral Increment: Disable
Memory Increment: Enable *
Peripheral Data Width: Half Word
Memory Data Width: Half Word
DAC Out1 Settings:
Output Buffer : Enable
Trigger : None
DACのTriggerをNoneにしておくのがミソです。
Code Generateして、main.cに以下を追記
Private Variables (16KHzサンプリングでの440Hzのサイン波)
const uint16_t sine_440[] = { 0x003, 0x022, 0x07E, 0x115, 0x1E1, 0x2DD, 0x401, 0x545, 0x69D, 0x800, 0x964, 0xABC, 0xC00, 0xD24, 0xE20, 0xEEC, 0xF83, 0xFDF, 0xFFF, 0xFDF, 0xF83, 0xEEC, 0xE20, 0xD24, 0xBFF, 0xABC, 0x964, 0x801, 0x69D, 0x545, 0x402, 0x2DD, 0x1E1, 0x115, 0x07E, 0x022 };
デバイス初期化の後で
(DMAをCircularモードにしているので、止めない限り出力しっぱなし)
/* Enable DAC */ HAL_DAC_Start(&hdac1, DAC_CHANNEL_1); /* Enable the DMA channel */ HAL_DMA_Start_IT(htim17.hdma[TIM_DMA_ID_UPDATE], (uint32_t)sine_440, (uint32_t)&(hdac1.Instance->DHR12R1), 36); /* Enable the TIM Update DMA request */ __HAL_TIM_ENABLE_DMA(&htim17, TIM_DMA_UPDATE); /* Enable the Peripheral (Start Timer) */ __HAL_TIM_ENABLE(&htim17);
HAL_TIM_Base_Start_DMA()は、なぜかDMAの転送先をタイマのARRレジスタにしてしまうので、
参考にして開始処理を書いてみました。
[電子工作] MacでSTM32の開発環境を GNU arm + OpenOCDで作ってみる - CubeMXのプロジェクトをどうにかする版 [電子工作]
いろいろリニューアル
前提環境
・MacBook Pro (15-inch, Early 2011)
・macOS Sierra バージョン 10.12.2
・make ... たぶんXCodeのコマンドラインツール
・MacPort 2.3.5 ... OpenOCDのビルド
・git ... MacPortでインストール
構築する環境
・launchpad GNU ARM Embedded Toolchain : 5-2016-q3-update
・OpenOCD : ソースからビルド, CMSIS-DAPとSTLinkに対応
・STM32CubeMX : 4.18.0
目標
・CubeMXで雛形を生成
・launchpadのGNU ARM Embedded Toolchainでビルドする
・テキストエディタ+makeで開発
・OpenOCDで書き込み & デバッグする
ターゲット
・Nucleo-F303RE ボード
おっきいボードに変えてみました
・CubeMXで雛形を生成してLチカ
手順1.arm-none-eabi-gccの入手
お手軽にlaunchpadからバイナリを入手します。
右のDownloadsのリストから、gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2をダウンロードし、
~/gcc_arm下に展開します。
(makefile使い回しの都合上、展開フォルダ名を変更しました)
手順2.OpenOCDのビルド
ソースからビルドします
makefile使い回しの都合上、HOMEディレクトリ直下に展開しています。
(Nucleoだけを使う場合はCMSIS-DAPは不要)
手順3.STM32 CubeMXの入手とインストール
STmicroのサイトからダウンロードします。
メールアドレスを入力するとダウンロードURLがメールで送られてきます。
ダウンロードしたファイル(en.stm32cubemx.zip)を展開し、SetupSTM32CubeMX-4.18.0.appを右クリック->開くで起動してインストール、、、
なのですが、理由はよくわかりませんが、Finderからインストーラが起動しません??
ターミナルを開いてzipを展開したフォルダに移動し、下記のようにインストーラを直で起動してインストールしました。
なんなんでしょうね?
インストールできたらApplicationフォルダからCubeMXを起動し、
[Help]-[Install New Libraries]で必要なMCU用のライブラリ(STM32CubeF3)をインストールします。
手順4.CubeMXでテンプレートを作成
[File]-[New Project...]を選択
[Board Selector]タブに切り替え
[Type of Board]で Nucleo64 を選択
[MCU Series]で STM32F3 を選択
[Boards List]から NUCLEO-F303RETx を選択
ペリフェラルの設定
・HSE外部クロック源 - STLinkからMCOに供給される外部クロック(8MHz)
RCC BYPASS Clock Source RCC_OSC_IN PF0-OSC_IN
・LSE外部クロック源 - Nucleoボードに載っているクリスタル(32.768KHz)
RCC Crystal/Ceramic Resonator RCC_OSC32_IN PC14-OSC32_IN
RCC Crystal/Ceramic Resonator RCC_OSC32_OUT PC15-OSC32_OUT
・SWD : SWOが使えるのかよくわからないけれど、SB15がショートされて繋がっているようなのでいちおう
SYS Trace Asynchronous Sw SYS_JTCK-SWCLK PA14
SYS Trace Asynchronous Sw SYS_JTMS-SWDIO PA13
SYS Trace Asynchronous Sw SYS_JTDO-TRACESWO PB3
・SysTickのクロック源はSystemClockで
SYS SysTick SYS_VS_Systick VP_SYS_VS_Systick
ピンラベル(使うのだけ)
Pin Nb PINs FUNCTIONs LABELs
2 PC13 GPIO_EXTI13 B1 [Blue PushButton]
21 PA5 GPIO_Output LD2 [Green Led]
プロジェクト設定
SOFTWARE PROJECT
Project Settings :
Project Name : f303re_led
Project Folder : /Users/mickey/STM32Project/f303re_led
Toolchain / IDE : SW4STM32
Firmware Package Name and Version : STM32Cube FW_F3 V1.6.0
Code Generation Settings :
STM32Cube Firmware Library Package : Copy only the necessary library files
Generate peripheral initialization as a pair of '.c/.h' files per peripheral : No
Backup previously generated files when re-generating : No
Delete previously generated files when not re-generated : Yes
Set all free pins as analog (to optimize the power consumption) : No
手順5.ちょこっとだけコードを追加
main.cの先頭の USER CODE BEGIN 0 〜 USER CODE END 0の間に以下の定義を追加
(NANO-libの初期化処理から呼ばれる)
ついでにテスト用のLチカコード
手順6.makefile
プロジェクトフォルダ直下に、下記の内容でmakefileを作ります。
前回からの変更点は以下になります
・NANO-libをリンク (加えて、-nostartfilesも指定)
・OpenOCDで焼き込みするmakeターゲット(flash)を追加
手順7.ビルド
手順8.書き込み
前提環境
・MacBook Pro (15-inch, Early 2011)
・macOS Sierra バージョン 10.12.2
・make ... たぶんXCodeのコマンドラインツール
・MacPort 2.3.5 ... OpenOCDのビルド
・git ... MacPortでインストール
構築する環境
・launchpad GNU ARM Embedded Toolchain : 5-2016-q3-update
・OpenOCD : ソースからビルド, CMSIS-DAPとSTLinkに対応
・STM32CubeMX : 4.18.0
目標
・CubeMXで雛形を生成
・launchpadのGNU ARM Embedded Toolchainでビルドする
・テキストエディタ+makeで開発
・OpenOCDで書き込み & デバッグする
ターゲット
・Nucleo-F303RE ボード
おっきいボードに変えてみました
・CubeMXで雛形を生成してLチカ
手順1.arm-none-eabi-gccの入手
お手軽にlaunchpadからバイナリを入手します。
右のDownloadsのリストから、gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2をダウンロードし、
~/gcc_arm下に展開します。
(makefile使い回しの都合上、展開フォルダ名を変更しました)
$ cd ~ $ tar jxf ~/Downloads/gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2 $ mv gcc-arm-none-eabi-5_4-2016q3 gcc-arm
手順2.OpenOCDのビルド
ソースからビルドします
makefile使い回しの都合上、HOMEディレクトリ直下に展開しています。
(Nucleoだけを使う場合はCMSIS-DAPは不要)
$ cd ~ $ sudo port install libtool autoconf texinfo libusb $ sudo port install hidapi-devel $ git clone http://repo.or.cz/r/openocd.git openocd $ cd openocd $ ./bootstrap $ ./configure --enable-stlink --enable-cmsis-dap $ make
手順3.STM32 CubeMXの入手とインストール
STmicroのサイトからダウンロードします。
メールアドレスを入力するとダウンロードURLがメールで送られてきます。
ダウンロードしたファイル(en.stm32cubemx.zip)を展開し、SetupSTM32CubeMX-4.18.0.appを右クリック->開くで起動してインストール、、、
なのですが、理由はよくわかりませんが、Finderからインストーラが起動しません??
ターミナルを開いてzipを展開したフォルダに移動し、下記のようにインストーラを直で起動してインストールしました。
なんなんでしょうね?
$ cd SetupSTM32CubeMX-4.18.0.app/Contents/MacOs/ $ ./SetupSTM32CubeMX-4_18_0_macos
インストールできたらApplicationフォルダからCubeMXを起動し、
[Help]-[Install New Libraries]で必要なMCU用のライブラリ(STM32CubeF3)をインストールします。
手順4.CubeMXでテンプレートを作成
[File]-[New Project...]を選択
[Board Selector]タブに切り替え
[Type of Board]で Nucleo64 を選択
[MCU Series]で STM32F3 を選択
[Boards List]から NUCLEO-F303RETx を選択
ペリフェラルの設定
・HSE外部クロック源 - STLinkからMCOに供給される外部クロック(8MHz)
RCC BYPASS Clock Source RCC_OSC_IN PF0-OSC_IN
・LSE外部クロック源 - Nucleoボードに載っているクリスタル(32.768KHz)
RCC Crystal/Ceramic Resonator RCC_OSC32_IN PC14-OSC32_IN
RCC Crystal/Ceramic Resonator RCC_OSC32_OUT PC15-OSC32_OUT
・SWD : SWOが使えるのかよくわからないけれど、SB15がショートされて繋がっているようなのでいちおう
SYS Trace Asynchronous Sw SYS_JTCK-SWCLK PA14
SYS Trace Asynchronous Sw SYS_JTMS-SWDIO PA13
SYS Trace Asynchronous Sw SYS_JTDO-TRACESWO PB3
・SysTickのクロック源はSystemClockで
SYS SysTick SYS_VS_Systick VP_SYS_VS_Systick
ピンラベル(使うのだけ)
Pin Nb PINs FUNCTIONs LABELs
2 PC13 GPIO_EXTI13 B1 [Blue PushButton]
21 PA5 GPIO_Output LD2 [Green Led]
プロジェクト設定
SOFTWARE PROJECT
Project Settings :
Project Name : f303re_led
Project Folder : /Users/mickey/STM32Project/f303re_led
Toolchain / IDE : SW4STM32
Firmware Package Name and Version : STM32Cube FW_F3 V1.6.0
Code Generation Settings :
STM32Cube Firmware Library Package : Copy only the necessary library files
Generate peripheral initialization as a pair of '.c/.h' files per peripheral : No
Backup previously generated files when re-generating : No
Delete previously generated files when not re-generated : Yes
Set all free pins as analog (to optimize the power consumption) : No
手順5.ちょこっとだけコードを追加
main.cの先頭の USER CODE BEGIN 0 〜 USER CODE END 0の間に以下の定義を追加
(NANO-libの初期化処理から呼ばれる)
/* USER CODE BEGIN 0 */ void _init(void) { } /* USER CODE END 0 */
ついでにテスト用のLチカコード
/* USER CODE BEGIN WHILE */ while (1) { HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, SET); HAL_Delay(1000); HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, RESET); HAL_Delay(1000); /* USER CODE END WHILE */
手順6.makefile
プロジェクトフォルダ直下に、下記の内容でmakefileを作ります。
前回からの変更点は以下になります
・NANO-libをリンク (加えて、-nostartfilesも指定)
・OpenOCDで焼き込みするmakeターゲット(flash)を追加
PROJECT = f303re_led DIR=~/gcc-arm/bin CC=$(DIR)/arm-none-eabi-gcc NM=$(DIR)/arm-none-eabi-nm CP=$(DIR)/arm-none-eabi-objcopy OD=$(DIR)/arm-none-eabi-objdump SZ=$(DIR)/arm-none-eabi-size # SEMIHOST_LIB = --specs=rdimon.specs -lrdimon NANOLIB = --specs=nano.specs OPENOCD=~/openocd BOARDCNF=st_nucleo_f3.cfg DEFS = -DUSE_HAL_DRIVER -DSTM32F303xE MCU = cortex-m4 MCFLAGS = -MD -mcpu=$(MCU) -march=armv7e-m -mtune=$(MCU) MCFLAGS += -mthumb -mlittle-endian -mno-unaligned-access -mno-sched-prolog MCFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16 MCFLAGS += -fno-strict-aliasing -fsigned-char MCFLAGS += -ffunction-sections -fdata-sections MCFLAGS += -fno-schedule-insns2 MCFLAGS += -fno-common -fno-hosted MCFLAGS += -mthumb-interwork MCFLAGS += -fmessage-length=0 MCFLAGS += -ffreestanding MCFLAGS += -fno-move-loop-invariants MCFLAGS += -nostartfiles MCFLAGS += -Wl,--gc-sections STM32_INCLUDES = \ -IInc \ -IDrivers/CMSIS/Device/ST/STM32F3xx/Include \ -IDrivers/CMSIS/Include \ -IDrivers/STM32F3xx_HAL_Driver/Inc/Legacy \ -IDrivers/STM32F3xx_HAL_Driver/Inc #OPTIMIZE = -Os OPTIMIZE = -gdwarf-2 -O0 -flto-partition=none -fipa-sra CFLAGS = $(MCFLAGS) $(OPTIMIZE) $(NANOLIB) $(SEMIHOST_LIB) $(DEFS) $(STM32_INCLUDES) CFLAGS += -Wl,-T,STM32F303RETx_FLASH.ld AFLAGS = $(MCFLAGS) CSRC = \ Src/main.c \ Src/stm32f3xx_hal_msp.c \ Src/stm32f3xx_it.c \ Src/system_stm32f3xx.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc_ex.c \ Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_uart.c ASRC = Drivers/CMSIS/Device/ST/STM32F3xx/Source/Templates/gcc/startup_stm32f303xe.s COBJ = $(CSRC:.c=.o) AOBJ = $(ASRC:.s=.o) all: build size build: elf hex lst sym elf: $(PROJECT).elf hex: $(PROJECT).hex lst: $(PROJECT).lst sym: $(PROJECT).sym %.hex: %.elf @echo $(CP) -O ihex $< $@ %.lst: %.elf @echo $(OD) -h -S -C $< > $@ %.sym: %.elf @echo $(NM) -n $< > $@ size: @echo $(SZ) $(PROJECT).hex $(SZ) $(PROJECT).elf $(SZ) -A -x $(PROJECT).elf %.elf: $(AOBJ) $(COBJ) @echo $(CC) $(CFLAGS) $^ -o $@ $(COBJ) : %.o : %.c @echo $(CC) -c $(CFLAGS) $< -o $@ $(AOBJ) : %.o : %.s @echo $(CC) -c $(CFLAGS) $< -o $@ clean: @echo find . -name '*.o' -print -or -name '*.d' -print | xargs rm -f rm -f $(PROJECT).elf $(PROJECT).hex $(PROJECT).lst $(PROJECT).sym flash: $(PROJECT).elf $(OPENOCD)/src/openocd -s $(OPENOCD)/tcl -f board/$(BOARDCNF) -c "program $^ verify reset exit"
手順7.ビルド
$ make
手順8.書き込み
$ make flash
前の10件 | -