2024年5月12日日曜日

STM32で1bit DAC出力できるかな(3)動かすとresetがかかる原因はoption byteだった

秋月でSTM32C011J4M7という8ピンマイコンを買いました.@140円.
これでも32bitCPUでTIMER, UART, ADC, DMAなどが一通り入ってます.
これを使って1bit DAC型のsin波発生器を作ろうとしています.

このCPUに火入れしたのですが、鬼のようにトラブりました.

1bit streamを出力するのにI2Sを使います.
I2Sはdata,clk,lrckを出力しますが、dataのみ使います.
1bit DACですから、dataをLPFすれば正弦波が出てきます.

I2Sの動かし方はこうです.
 1)1波分のsin tableを用意する
 2)sin table→I2Sへdata転送するのはDMAでやる
 3)DMAはsin tableをcyclicに永久巡回する

STM32のlibrary関数でI2S+DMAを起動します.こんなの.
 HAL_I2S_Transmit_DMA(&I2S, &buffer, 1000);
しかし、この関数を起動したとたんに、STM32にresetがかかってしまいます.

なんつうゲロなbugだと思ったのですが、原因はbugというよりもoption byteの工場出荷値でした.
・reset pinとI2S pinが共通pinである
・GPIOでI2Sに機能設定したらreset機能はoffにされると思ったらそれはちがう
・reset機能はGPIOをいじっても生きたまま
・reset機能はoption byteで別途殺す必要がある
・option byteの工場出荷設定ではresetが生きている
・ゆえにI2Sを使うならoption byteを変更する必要がある
・さもないと、I2Sが動き出した途端にCPUがresetしちゃう

この不幸な仕様はI2Sのみならず、4pinを何かしらの機能に使ったら生じますから要注意です.

それではoption byteの変え方を説明します.
STM32CubeIDEでは出来ないと思います.
STM32CubePrigrammerを使います.たぶんこちら
起動してconnectして、操作します.
 ①OBを押す
 ②NRST_MODEを3から2に変更
 ③Applyを押す
これでよし.

2へ    4へ

かしこ

4 件のコメント:

  1. >option byteの工場出荷値でした
    まぁ、「Reset Function」は、
    ・Hardware Configuration
    の範疇だから、「option byte じゃないと、変更できない」のは、正解と言えば正解なんですが・・・
    ※どの機能を、どのピンに割り当てるか?と言うのは、かなりメーカーの癖が出るところなので、例えばこの「Reset 端子」は、「死んでも単独ピンにしてる」メーカーもありますね。まぁ、STMは、「多機能を優先」したんだろうな、「何でもできる」ことが優先。
    多分、「パワーオンリセット」があるから、「無くてもおk」と言う判断なのでしょう。
    (逆に、「パワーオンリセット」を信頼してないメーカーは、「絶対に」外部Reset端子が使えるようにしてる。)
    だったら、
    ・Software Configuration
    で、殺せるようにしとけよ、とは思いますが。
    (Arduino は、確か関数で、動的に「入力・出力」が、切り替えられるようになってたハズ。ESP系も、そうですが。)

    返信削除
    返信
    1. STM32CubeIDEにoption byte設定機能があればサクサク解決したでしょうけど、別のtoolが必要なのはニクイぜ.

      I2SはSPI回路を流用しています.
      STM32の癖で、SPIとresetの機能が同居したpinがよくある気がしています.
      以前SPIで勝手に停まってしまう系の問題が生じて迷宮入りになってしまったのですが、それも同じ原因かもしれません.

      削除
  2. >「パワーオンリセット」
    ちなみに、「外付けコンデンサ」とか無いのに、どうやって「パワーオンリセット」を実現しているか、ご存じでしょうか?
    これは、実際の、とある「ワンチップCPUの設計者」の方から聞いた話なんですが、
    回路の一部だけ「ドーピングの量」を変えて、必ず、電源の立ち上がりで、一定期間
    。ハイ(または、ロー)になる
    回路を形成するのだそうです。これを聞いて、
    ・ここだけ、全く「デジタル」じゃ無いですねー
    と言ったら、「まさにそうなんです!」と、言われました。しかも、
    ・電源の立ち上がり波形によっては、リセットに失敗するんですよねー
    とも、仰ってました。(まぁ、実際はそういうことは殆ど無いとも言ってましたが。)
    ※なので、このCPUは「リセット端子」だけは、マルチプレクスせずに「独立」した端子になってました(笑)
    ※現在のプロセスでも、同様にやっているかは分からないです。これは、オリジナルのZ80が「現役だった」頃の話なので。最近は、チップの中に「巨大な容量」を形成することなど、容易くなってきているので、モノによっては、ホントに、
    ・コンデンサの充放電でリセットを掛けてる
    ICも有るのではないかと思います。
    ※「IC内蔵コンデンサ」だけで、「フィルタ回路」が組めるアナログICとか、実際にあるし。プロセスの進化は恐るべしです。

    返信削除
    返信
    1. へーっ、また器用なことを
      昔からポリシリコンで小さいキャパシタを作る方向性かと思ってました

      digital CMOSプロセスで増幅もするんだからプロセス屋さんは働き者です

      削除