STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
20240516追:
秋月さんよりNUCLEO-H563ZI販売開始です!!
20240516追:
クリスマス直前ですがわずかな時間を見つけて少しでもSTM32H5を使った
記事を書き残していきます…その先に何があるのかわからなくとも…!
すでにFatFsのSTM32H5への移植例はアップロードしておりますので今回も
これをもとに解説を進めていきますよぅ!
今回は基本中の基本、GPIOのほかにCortex-M33というかSTM32H5を使う人の
所見殺しポイントの回避とかを紹介してまいります。
●GPIOのレジスタがちょっと合理化
これはSTM32L5からなのですがGPIO出力のビットセット/リセットのレジスタ
(BSRR/BRR)が別々のアドレスに設定されております。
これは何気に良い改良だと思います。STM32F1とかの古い品種では上位16bit
がBRRで下位16bitがBSRRでひとまとまりになっており、HALに振り回されて
非常に使いづらくオーバーヘッドも多いので実行速度・コードサイズ的に
とても不利な代物でした。
で、ねむいさんは例えばSTM32F4のHALライブラリを使った作例とかではこんな
感じの構造体を作ってキャストしなおしてアクセスする手法でGPIOのビット
セット&リセットを簡潔にやってきましたが、たまにソースコードちゃんと
読まない方々からBRRなんてないからこのプログラムは動かないのでは?とか
質問もらうのですがほんとにBRRが定義されてないのならそもそもビルド通らん
やろうがぁああああ!!ちゃんとstm32f4xx_hal_conf.hの一番下のところ読めや
あああぁぁあぁあ!!!11!1
はぁはぁ…失礼…話を戻しますがSTM32H5・STM32L5以降ではそういう
小手先の手間も省けてBRR/BSRRられるようになりましたので安心です♥
●ビルド途中でGCCがセグメンテーションフォルトして死ぬ
なんでやねん
どうしたらよいのだ私は…
具体的に言うとGCC12でstm32h5xx_hal_dma_ex.cを最適化レベル-O2以降で
コンパイルしたらセグフォ死します…何やっても先に進めません
ねむいさんより先にSTM32H5触れた方も所見殺しの罠にかかっておられ
ました…やはり初物はエラッタからライブラリに至るまで罠が満載…
ねむいさんは苦しみ紛れに屁をこいたような対策でセグフォ死の罠を
回避を行うことで対策しております。ちなみに現在リリースされている
GCC13では対策されて-O2にしても落ちなくなったので安心です☆
ねむいさんはSTM32H5のDMA対応ですっっごく時間食われましたがその半分
くらいはセグフォ問題で捕まりました…F**K!
●DACを使用したりUniqueIDを読みだそうとしたらHardFaultって死ぬ
だからなんでやねん
L5だと全く問題なかったのに…!
その理由はUIDレジスタのアドレスの変更に理由があります。
STM32L5ではこれらのレジスタは0x0BFA0590だったのですがSTM32H5では
0x08FFF800以降に変更されており、このアドレス領域はフラッシュメモリが
存在するアドレス(0x08000000)と同じであり命令実行を前提としている
そうなので普通の使い方ではIキャッシュを有効にすると思いますが有効に
してUIDレジスタがある0x08FFF800にアクセスした瞬間に命令領域にデータ
アクセスしようとしたと判断されてHardFaultして死にます!
もっと凶悪なのがHALライブラリのDACライブラリ中でパッケージデータを
判別して使用するチャネルを設定するコードがあり、そのパッケージを判別
するレジスタも0x08FFF800以降に存在するので何も対策してないと上記の例と
同じようにHardFaultして容赦なく死にます!!
STM32のフォーラムでは罠にかかった犠牲者がすでにちらほら出ております…
で、対策なのですがMPUを使用して0x08FFF800あたりのアドレスを読み出し
オンリー&命令実行禁止設定にしてあげればよいです。具体的には下記の
コードになります。
static void MPU_Config(void)
{
MPU_Region_InitTypeDef MPU_InitStruct;
MPU_Attributes_InitTypeDef MPU_AttributesInit;
/* Configure region for UID,PACKAGE,FLASHSIZE and other registers */
/* Disable MPU */
HAL_MPU_Disable();
/* Define readonly access via MPU */
MPU_AttributesInit.Number = MPU_ATTRIBUTES_NUMBER0;
MPU_AttributesInit.Attributes = MPU_NOT_CACHEABLE;
HAL_MPU_ConfigMemoryAttributes(&MPU_AttributesInit);
MPU_InitStruct.Enable = MPU_REGION_ENABLE;
MPU_InitStruct.BaseAddress = 0x08FFF800UL; /* UID ADDRESS and others */
MPU_InitStruct.LimitAddress = 0x08FFFFFFUL;
MPU_InitStruct.AccessPermission = MPU_REGION_ALL_RO;
MPU_InitStruct.AttributesIndex = MPU_ATTRIBUTES_NUMBER0;
MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
MPU_InitStruct.Number = MPU_REGION_NUMBER0;
MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;
HAL_MPU_ConfigRegion(&MPU_InitStruct);
/* Enable MPU (any access not covered by any enabled region will cause a fault) */
HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}
なお、マニュアルにもあらかじめMPU使っておけよと匂わせておりますが
こんなん初見で絶対わかりませんよぅ!!!
人にソースコードよく見ろと言っておきながら自分のことは棚に上げて
言うのもアレですがマニュアル相当読み込まないとマジで気づきません。
STM32L5から特に何も考えずスライド移植したら罠にかかって爆死する
パタンがH5では多いので気を付けましょう(経験者バイアス)
それとこうならないようにマニュアルはちゃんと読みましょうorz
20240205追:
STM32H5の地雷踏まないようなMPU設定の仕方が公式で
ようやく公開されています…最初から公表しろ〜〜〜〜!!!!!!
20240205追:
そんなわけでいくつもの罠が待ち受けているSTM32H5ですがこれからも
未知の罠が待ち受けているでしょう。しかしアーリーアダプタな戦士たちは
それに臆せず果敢に進んでいくのです…!!
そして先にも紹介しましたがFatFsのSTM32H5への移植例はおきぱですでに
公開しております。ちょっと気が早いですが先行して2024年版に更新
しておりますのでヨロシク!!
-
免責・連絡先は↑のリンクを
↓SNSもやってます↓
powered by まめわざ- ARM/STM32 (117)
- OpenOCD (27)
- ARM/NxP (34)
- ARM/Cypress (5)
- ARM/Others (3)
- ARM/Raspi (1)
- AVR (13)
- FPGA (4)
- GPS/GNSS (19)
- MISC (80)
- STM8 (2)
- Wirelessなアレ (16)
- おきぱ (1)
- ブラウザベンチマーク (28)
- 日本の自然歩道 (25)
- STM32U0はぢめました
⇒ ねむい (08/07) - STM32U0はぢめました
⇒ ひかわ (07/28) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ ねむい (05/17) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ どじょりん (05/16) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ どじょりん (05/16) - いろいろ試す61(と今年の反省会)
⇒ ねむい (01/02) - いろいろ試す61(と今年の反省会)
⇒ ひかわ (01/02) - いろいろ試す61(と今年の反省会)
⇒ ひかわ (01/01) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ ねむい (12/31) - STM32H5を使ってみる3 -待ち受ける初見殺しの罠たち-
⇒ ひかわ (12/31)
- September 2024 (1)
- August 2024 (1)
- July 2024 (1)
- June 2024 (1)
- May 2024 (1)
- April 2024 (1)
- March 2024 (1)
- February 2024 (2)
- January 2024 (1)
- December 2023 (4)
- November 2023 (2)
- October 2023 (2)
- September 2023 (1)
- August 2023 (2)
- July 2023 (1)
- June 2023 (2)
- May 2023 (3)
- April 2023 (1)
- March 2023 (1)
- February 2023 (1)
- January 2023 (1)
- December 2022 (2)
- November 2022 (1)
- October 2022 (1)
- September 2022 (1)
- August 2022 (1)
- July 2022 (1)
- June 2022 (1)
- May 2022 (1)
- April 2022 (1)
- March 2022 (1)
- February 2022 (1)
- January 2022 (1)
- December 2021 (2)
- November 2021 (2)
- October 2021 (1)
- September 2021 (1)
- August 2021 (1)
- July 2021 (1)
- June 2021 (1)
- May 2021 (1)
- April 2021 (1)
- March 2021 (1)
- February 2021 (1)
- January 2021 (1)
- December 2020 (3)
- November 2020 (1)
- October 2020 (1)
- September 2020 (1)
- August 2020 (1)
- July 2020 (1)
- June 2020 (2)
- May 2020 (1)
- April 2020 (1)
- March 2020 (1)
- February 2020 (1)
- January 2020 (1)
- December 2019 (3)
- November 2019 (1)
- October 2019 (1)
- September 2019 (2)
- August 2019 (1)
- July 2019 (1)
- June 2019 (1)
- May 2019 (1)
- April 2019 (1)
- March 2019 (1)
- February 2019 (1)
- January 2019 (1)
- December 2018 (3)
- November 2018 (2)
- October 2018 (1)
- September 2018 (1)
- August 2018 (1)
- July 2018 (1)
- June 2018 (1)
- May 2018 (1)
- April 2018 (2)
- March 2018 (1)
- February 2018 (1)
- January 2018 (1)
- December 2017 (2)
- November 2017 (2)
- October 2017 (1)
- September 2017 (1)
- August 2017 (1)
- July 2017 (1)
- June 2017 (1)
- May 2017 (1)
- April 2017 (1)
- March 2017 (2)
- February 2017 (2)
- January 2017 (2)
- December 2016 (7)
- November 2016 (2)
- October 2016 (2)
- September 2016 (1)
- August 2016 (1)
- July 2016 (1)
- June 2016 (1)
- May 2016 (2)
- April 2016 (1)
- March 2016 (2)
- February 2016 (1)
- January 2016 (1)
- December 2015 (3)
- November 2015 (1)
- October 2015 (3)
- September 2015 (2)
- August 2015 (2)
- July 2015 (3)
- June 2015 (3)
- May 2015 (4)
- April 2015 (2)
- March 2015 (4)
- February 2015 (1)
- January 2015 (3)
- December 2014 (3)
- November 2014 (2)
- October 2014 (1)
- September 2014 (2)
- August 2014 (2)
- July 2014 (3)
- June 2014 (2)
- May 2014 (1)
- April 2014 (1)
- March 2014 (4)
- February 2014 (4)
- January 2014 (3)
- December 2013 (5)
- November 2013 (4)
- October 2013 (3)
- September 2013 (2)
- August 2013 (2)
- July 2013 (2)
- June 2013 (3)
- May 2013 (2)
- April 2013 (2)
- March 2013 (2)
- February 2013 (2)
- January 2013 (3)
- December 2012 (4)
- November 2012 (2)
- October 2012 (2)
- September 2012 (4)
- August 2012 (1)
- July 2012 (3)
- June 2012 (2)
- May 2012 (3)
- April 2012 (3)
- March 2012 (2)
- February 2012 (3)
- January 2012 (3)
- December 2011 (5)
- November 2011 (3)
- October 2011 (2)
- September 2011 (2)
- August 2011 (2)
- July 2011 (2)
- June 2011 (2)
- May 2011 (2)
- April 2011 (2)
- March 2011 (2)
- February 2011 (2)
- January 2011 (3)
- December 2010 (7)
- November 2010 (1)
- October 2010 (1)
- September 2010 (1)
- August 2010 (3)
- July 2010 (4)
- May 2010 (1)
- April 2010 (2)
- March 2010 (2)
- February 2010 (2)
- January 2010 (3)
- December 2009 (3)
- November 2009 (8)
- October 2009 (7)
- September 2009 (5)
- August 2009 (4)
- July 2009 (6)
- June 2009 (7)
- May 2009 (14)
- January 1970 (1)
Copyright(C) B-Blog project All rights reserved.
Comments
ねむいさん
へかわ->ひかわ まちがえました
c103 12/31 2日目 日曜日 東T46b iceでお待ちしてます
ひかわさまこんばんは、ねむいです。
"おいた"したコメントはちゃんと摘まんでおきましたので
ご安心ください…
寒暖差が激しいので体調にはお気をつけて、ご武運を祈っております…!
ねむいさん こんにちは
気にしないことイラストをもってきたメイド服ねむいさんがいつかくると淡い期待をいだきながらc103です 一日目は、失敗しながらクリアしました
ひかわさま、今年もコミケおつかれさまでした〜
よいお年を〜
初めまして。
昨年、発売と同時にNUCLEO-H503RB/H563ZIを購入しましたが、H563ZIのほうだけ-O2が原因不明のセグフォでずっと悩んでおりました。
(STM32duinoを使用)
が、おそらく原因はこれだろうと思います。
有益な情報ありがとうございました。
追記
> ねむいさんより先にSTM32H5触れた方
私が投げたIssuesでした笑
どじょりん様初めまして、ねむいです。
お互いひどい災難を被ってしまいましたね…
しかし私たちの苦労が後に続く方々の役にたつことを信じております…!
ついでですが記事中のMPUの設定ですがOTP領域もカバーできるよう
更新しましたので参考にしてください。
Post a Comment