FAQ

デバイス(STM32)

SPIの通信データをCRCでチェックできますか?
SPIには独立したCRC生成/検査機能があります。その生成多項式は転送データ長に合ったCRC-8/CRC-16が使えます。CRC-8/CRC-16が固定の製品もありますが、比較的新しいシリーズ(STM32F4シリーズなど)では、ユーザが任意の生成多項式を設定できます。具体的には、SPI CRC 多項式レジスタ(SPI_CRCPR)を設定します。STM32CubeMXでは、Pinoutタブの左欄でSPIを選択して、モードを設定します。次にConfigurationタブからSPIを選択して、Parameter SettingsでData Sizeを設定し、Advanced Parameters欄でCRCをEnableにします。するとCRC Polynomial欄が出ます。デフォルトはX1+X3になっていますので、希望する生成多項式を上書きします。例えばCRC-8(X8+X2+X+1)の場合、X2+X1+X0と書き込みます。これでコード生成すると 「 hspiy.Init.CRCPolynomial = xxx;」(yはSPIの番号、xxxは生成多項式の十進表示)という記述ができます。
内蔵温度センサーを使って、マイコンの周辺温度を測定することはできますか?
STM32シリーズには、温度センサーが内蔵されています。シリコン上の温度を電圧に変換して、内蔵ADCで測定することが可能です。あくまで、シリコン上の温度を測定するものです。マイコン内部のシリコン上の温度と周辺温度は様々な要因で1対1に対応しませんので、マイコンの周辺温度の測定には適しません。したがって、マイコン周辺温度の測定に用いることは、お勧めしていません。使用例としては、マイコンの動作温度をチェックするような用途でお使いいただけます。データシートに記載されているスペックの誤差は比較的大きいですが、実際はマイコン出荷時に既定温度で測定した値がレジスタに保存されており、その値を目安に、ユーザーが実測値を較正できるようになっています。例えば、STM32F091の場合、製品出荷時に、30℃と110℃の時のADCの測定値をTS_CAL1とTS_CAL2に格納しています。ユーザーは、この値を参考にして、実際のADCの測定値と温度の相関を計算することができます。具体的な較正方法の詳細はアプリケーションノートAN3964を参照してください。
SWPIM(Single Wire Protocol Master Interface)とは、どの様な機能ですか?どのような場合に使いますか?
SWPMIは、マイコンにスマートカードを接続するために使用されるインタフェースです。マスターモードで、ETSI TS102613標準で定義されたシングルワイヤプロトコルに準拠して、全二重シングルワイヤ通信インタフェースを可能にします。スマートカードのC6コンタクトでの単線全二重通信は、100キロビット/秒から2メガビット/秒までです。SWPMIを使うと、2メガビット/秒までの全二重通信のためのスマートカードへの容易な単ピン接続が可能になります。STM32は、Class B(VDD = 3 V)またはClass C( VDD = 1.8 V)の両方の動作電圧の供給をサポートしています。ユーザーはどちらかを選択する必要があります。STM32はSWPMI専用の1.8Vレギュレータを内蔵しており、Class B(VDD = 3 V)が選択されても、SWPピンの電圧は常に1.8Vに保たれます。機能・仕様の詳細はリファレンスマニュアルとデータシートをご参照ください。
VDDA(Vref+)の電圧値をチェックする良い方法はありますか?
ADCの入力チャネルに割り当てられている1.2VのVref電圧は、ADCの参照基準電圧ではありません。ADCの測定値の検証用または調整用に使用するために内蔵されています。これを使うと、VDDA(Vref+)の電圧を確認することができます。Vrefの1.2VはBGRを使って生成していますのでVDDA(Vref+)の影響を受けずに常に1.2Vです。もし、VDDA(Vref+)の電圧が減少した時に、この1.2Vを測定すると、通常の時よりも大きな変換値が出てきます。その変換値と1.2Vの比を計算してVDDA(Vref+)の電圧値を計算することが出来ます。
HSI48をシステムロックに使用することはできますか?
STM32L052等の製品ではUSB用にInternal self calibration付きの48MHzの発振器を内蔵しています。HSI48は、特殊なクロックリカバリシステム(CRS)回路によって USBペリフェラルに高精度のクロックを提供することができます。一方で、MCO端子から外部へ48MHzのクロック(または分周したクロック)を出すことが出来ます。このクロックを外付け配線でSTM32のOSC_INに入力して、システムクロックとして使用することが出来ます。ただし、HSI48とHSE_BYPASS/PLLの設定を同時に行ってしまうとエラーになってしまいますので、HSI48を起動して、MCO端子に出力した後にHSE_BYPASS/PLLを設定して、システムクロックをHSE_BYPASS経由のHSI48に切り換える必要があります。また、この時の周波数は、HSE_BYPASSの許容周波数(データシート参照)にする必要があります。また、まちがってHSI48を停止してしまったときの対策として、CSS(クロックセキュリティシステム)を使って、クロックを監視する事をお勧めします。
DSP命令の使い方を教えてください。
CMSISにはDSPというレイヤーがあって、ソースコードはARMより提供されています。例えばIAR殿のEWARMの場合、C:\Program Files (x86)\IAR Systems\Embedded Workbench...\arm\CMSIS\の中に、ドキュメント、ソースコードライブラリ、ヘッダーファイルが入っています。これらを使用するには開発環境の事前設定が必要です。まず、オプション設定のカテゴリC/C++コンパイラで、“ARM_MATH_CM4”をシンボル定義します。次に、オプション設定のカテゴリのリンカでライブラリタグにCMSIS-DSPのlibを追加します。基本的な使い方はドキュメントを読んでください。これらは、STの製品ではなく、コンパイラベンダーからライブラリとして提供されるものなので、ご質問はコンパイラベンダーにお願いしますまた、インターネットでも簡易的なリファレンスがあります。 http://digitalfilter.com/m4ken/cmsisdsp.html
発熱計算は、どのようにすればいいのでしょうか?
マイコンは消費する電力で発熱します。消費電力から、どのくらい発熱し、マイコンの周辺温度からジャンクション温度が何度になるかの計算式は、各製品のデータシートの「Thermal characteristics」の章に記載されています。発熱に関する熱抵抗の値はパッケージ毎に異なります。具体的な値は「Package thermal characteristics」の表に記載されています。周辺温度の最大値TAmaxとジャンクション温度の最大値TJmaxのスペックは、「General operating conditions」の表に記載されていますので、このスペック内でご使用ください。
発振回路LSE(32.768kHz)用の水晶振動子の仕様に条件はありますか?また、推奨振動子はありますか?
LSE(32.768kHz)用の水晶振動子は等価直列抵抗 (ESR:Equivalent Series Resistance) が小さい製品をお使いください。ESRが大きいと、損失が大きくなり、発振特性が安定しない発振不良につながります。ESRの値は、各水晶振動子のカタログに記載されており、目安は50kΩですが、必ず50kΩでなければならないということはありません。各水晶振動子メーカ殿にSTM32用としてマッチングを確認していただいた水晶振動子がいくつかあります。アプリケーションノートAN2867の「Recommended crystal resonators for LSE oscillatorembedded in STM32 microcontrollers」に記載されていますので、参考にしてください。ただし、発振特性はプリント板の寄生容量や抵抗にも依存しますので、お客様のプリント板にマイコンと水晶振動子を付けた状態で、水晶振動子メーカにマッチング評価を依頼する事をお勧めいたします。
USBドライバ(STが提供しているもの)を、WindowsPC向けアプリケーションソフトを開発する際に、そのまま使えますか?
お客様がSTM32シリーズを製品に使用し、かつお客様独自のWindowsPC向けアプリケーションソフトを開発する場合、ST提供のUSBドライバをそのまま利用することは出来ませんが、リセラーサブミッションの適用によって対応可能です。また、お客様固有のUSBのVendorIDを利用する場合、STでは、VID/PIDのサブライセンシングサービスを行っています。お客様がUSB.orgのアカウントに登録済みの場合、お客様向けのPIDを発行させて頂きます。その上で、リセラーサブミッションを適用することで、お客様のVIDおよびPIDに応じたドライバをご提供可能です。こちらは、STのVIDに対するPIDをご提供するサービスで、STが提供するUSBライブラリでは、STのVIDを使用しています。STのUSBライブラリを使用され、かつ、PIDはユーザーのアプリケーションに応じたPIDを取得されたい場合に利用できるサービス(無償)です。
⊿ΣADC(16ビット)がSTM32F37xに搭載されていますが、これ以上の分解能のADCはありますか?
STM32L4/F7シリーズで新たに搭載された⊿Σ変調器向けデジタルフィルターインタフェース(DFSDM)と、外付け⊿Σ変調器を組み合わせると最大24ビット⊿ΣADCを実現できます。最高1024のオーバサンプリング比率を持つ高速Sincフィルタや積分器も内蔵していますので、これらを使用すると、さらに精度を上げることが可能です。多ビット分解能のADCは、微小ノイズでも精度に影響を受けます。ノイズの影響を受けやすい⊿Σ変調器をマイコンから分離し、ノイズに強いデジタル部だけをマイコンに搭載することによって、CPUのノイズの影響を無くした精度の良い多ビット分解能のADCを容易に実現することが可能になりました。様々なサプライヤー(ST, TI, Analog Devices等)の⊿Σ変調器に適応していますので、STM32F37xシリーズで搭載している16ビット⊿ΣADCよりも高分解能、高精度のADCが必要な用途に最適です。
ADC(STM32F103)を最速1MHz(1μs)で変換しようとすると、最速72MHzの周波数が適用できません。対策を教えてください。
ADCを最速1MHz(1μs)で変換する場合は、ADCクロックを14MHzにする必要があります。しかし、動作周波数が72MHzの場合、ADCの動作クロックを分周する回路が2、4、6、8分周しかできないため、14MHzに設定できません。ADCを最速で動作させるには、動作周波数を56MHzに設定して、それを4分周して、14MHzを生成してください。STM32F2以降の製品では、ADCのクロック源、クロック周波数、分周回路等で色々改善されていますので、その様な注意を払う必要はありません。
Flashから命令を実行中に、Flashにデータを書き込むことができますか?
データシート等のマニュアルに「RWW可能」と記載してあるSTM32はFlashから命令を実行中に、Flashにデータを書き込むことができます。しかし、一部の製品では、ハードウエア的にメモリマットと内部バスが共通になっているため、命令実行とデータ書き込みは同時実行ができません。その場合は、RAM上で命令を実行すれば、Flashにデータを書き込むことは可能です。STM32シリーズはRAM上で命令を実行できます。RAMとFlashは異なるハードウエアですので、RAMの命令を実行中にFlashにデータを書き込む事ができます。
GPIOが未使用の場合の処理は、どうすれば良いですか?
未使用のGPIOは電位を固定し、ノイズ等で端子の電位が変動しないようにしてください。
方法としてはいくつかあります。
①入力ハイインピーダンスに設定して、10kΩ~100kΩ程度のプルアップ抵抗やプルダウン抵抗で 電位を固定しておく
②プルアップ抵抗やプルダウン抵抗が内蔵されているGPIOもあります。 これらを利用してプルアップやプルダウンを行う。
③出力端子に設定して、”High”または”Low”を出力しても電位は固定できますが、万が一、事故等で端子が電源と短絡したときに大電流が流れて、マイコンが破壊することが考えられますので、抵抗を介することをお勧めします。 この他に、GPIOの入力バッファをOFFして、ノイズ等による端子電位の変動が、マイコン内部に入ることを防ぐことも出来ます。
④アナログ端子と兼用になっているGPIOはアナログ端子に切り替えます。するとGPIOの入力バッファは OFF(入力信号を遮断)します。
GPIOの立ち上がり、立下りスピードを変更することはできますか?
I/O補正セル機能を使うと、GPIOの高速トグル時の、電源電圧/温度に応じた立上がりまたは立下り時間の調整が可能になります。GPIOの高速動作が必要な場合は、高速スピードに設定し、逆にGPIOの急峻な信号変化により発生する高調波ノイズを抑制したい場合は、低速スピードに設定します。ユーザーがソフトウエアで切り替え可能(デフォルト設定=無効)です。低電力モード時はOFFされます。この機能が使用できる電源電圧範囲には制限があるので、各製品のデータシートをご参照下さい。また、この機能を使用すると、消費電流値は増加します。
I2Cを使用していますが、通信が始まっていないのに、BUSYフラグが立つ場合があります。原因は何が考えられますか?
I2Cのクロックを有効にする前に、I2C端子と共用されているGPIOの設定を行ってください。さらに、その際のGPIOのパラメータの設定順序は、MODERレジスターを設定する前に、AFRレジスターを設定するようにしてください。具体的には、AFRレジスタ→MODERレジスタ→SPEEDRレジスタ→OTYPERレジスタ→PUPDRレジスタの順でGPIOを設定した後にI2Cのクロックを有効にします。この順序を守らないと、通信が始まっていないのに、I2CのBUSYフラグが立つ場合があります。
LCDドライバー(Lシリーズに搭載)の駆動能力を調整することはできますか?
STM32Lには、LCD電源用に内蔵ブースターを搭載していますので、ユーザが外部電源を準備する必要はありません。もちろん、外部電源も使用可能です。また、分圧用の内蔵抵抗を搭載していますので、VLCDに印加された電圧を直接分圧できます。内蔵抵抗には抵抗値の大きなRHと小さいRLと2種類があるので、LCDパネルの大きさ(負荷電流)によって抵抗値を選択することができます。特にSTM32L0xxシリーズでは各抵抗の両端が端子としてユーザーに解放されていますので、その端子に外付抵抗をつけると、LCDパネルの駆動能力を増大することができます。
RTCを時計機能として使用する際の時間の補正方法を教えてください。
RTCの補正方法は製品毎に異なります。例えば、STM32F4のRTCの場合、デジタルでクロックの誤差を校正する手段が2種類(粗校正、スムーズ校正)あります。粗校正は、RTC 校正レジスタ(RTC_CALIBR)を使用します。また、スムーズ較正を使用すると、RTC 周波数は、-487.1 ppm から +488.5 ppm の範囲で、分解能約 0.954 ppm でデジタル的に校正できます。これら 2 種類の校正手法は合わせて使用することは想定されておらず、アプリケーションは 2 種類の操作方法のうち、いずれかを選択する必要があります。RTCの校正の詳細は、アプリケーションノートAN3371(Using the hardware real-time clock (RTC)in STM32 F0, F2, F3, F4 and L1 series of MCUs)を参照してください。
USARTで、既存のシステムと通信したいのですが、通信速度(ボーレート)がわかりません。通信速度を知る方法はありますか?
STM32L0xx,L4xx,F0xx,F3xx,F7xxシリーズ等のUSARTには、自動ボーレート機能が搭載されています。決められた文字列を受信すると、自動的に通信速度を検出し、UARTのボーレートを自動的に設定することができる機能です。具体的な文字は、「最初のビットが‘1’の任意の文字」、「最初のビット列が’10xx”の任意の文字」、「0x7F」、「0x55」の中から選択できます。
USARTの1サンプルビット方式(STM32F4シリーズなどに搭載)とはどんな機能ですか?
STM32F4シリーズでは、受信のクロックバラツキの許容範囲を増やすために、1サンプルビット方式(新機能)を採用しています。ノイズフリーの用途向けですが、クロックバラツキの許容範囲を4.375%まで上げることができます。具体的方法は、USART_CR1のOVER8 ビットを 0、USART_BRRのDIV_Fractionを0、USART_CR1のMビットを0に設定し、USART_CR3のONEBIT ビットに 1 をプログラミングします。詳細はリファレンスマニュアルの「クロック偏差に対する USART レシーバの許容誤差(USART receiver tolerance to clock deviation)」の章を参照してください。
USB機能を外付け水晶振動子無しで使用することは可能ですか?
STM32L0シリーズ他には48MHzRC発振回路のHSI48を内蔵しています。
HSI48は、特殊なクロックリカバリシステム(CRS)回路によってUSBペリフェラルに高精度のクロックを提供することができます。CRSは、参照基準クロックとして、USBSOF信号、LSE(32kHz水晶振動子の 発振回路)、または外部信号を使用することにより動作中のHSI48の周波数を自動的かつ迅速に較正することができます。これにより、USB通信用の水晶振動子を使わなくても、USB通信が可能になります。
WFI/WFE命令で低消費電力モードに入りますが、WFIとWFEで何が違うのでしょうか?
WFIはWait For Interrupt(割り込み待ち)の略です。WFEは、Wait For Event(イベント待ち)の略です。WFIの場合、マイコンが低消費電力モードから復帰する際に、ベクタ割込みコントローラ(NVIC)によって、割込みが認識されて、割り込み処理が始まります。WFEの場合は低消費電力モードからから復帰する際に、、割り込み処理が行われずに、低消費電力モードからの復帰だけが行われます。したがって、低消費電力モードから復帰するときに、WFIを使うか、WFEを使うかを、低消費電力モードに入る際に、ユーザーがコントロールする必要があります。
ウォッチドッグタイマを低消費電力モード時に停止させたいのですが、可能ですか?
ウォッチドッグタイマは、セキュリティ優先で設計されているので、動作を停止するためのビットが備わっていません。一旦スタートすると、ユーザーがソフトウエアで停止することはできません。IWDGは一旦スタートするとLSIを伴って動作を続けます。スタンバイモードでも動作を続けます。したがって、CPUが動作していなくてもIWDGのタイムアウトでマイコンにリセットがかかります。言い換えるとIWDGがタイムアウトする前に定期的にCPUは起き上がって、IWDGをリフレッシュしなくてはなりません。一方、WWDGはクロック源がシステムクロック(PCLK1)なので、システムクロックが停止するストップモードなどでは停止します。CPUの動作と伴ってウォッチドッグタイマを使用したい場合はWWDGをお使いください、低電力モードの時にWWDGのリフレッシュを気にせず使えます。
ウォッチドッグタイマを電源投入と同時にスタートすることはできますか?
STM32シリーズには基本的に2種類のウォッチドッグタイマが搭載されています。独立型ウォッチドッグタイマ(IWDG)とウインドウウォッチドッグタイマ(WWDG)です。IWDGは低速の内蔵発振回路LSIをクロック源とし、WWDGはシステムクロック(PCLK1)をクロック源とします。IWDGはFlashのオプションバイト(ハードウエア)で電源投入と同時にスタートできます。また、ソフトウエアでスタートすることもできます。WWDGはソフトウエアでスタートすることができます。
キャッシュ(STM32F7/H7)で、 Dキャッシュと本体メモリの値が異なっています。原因は何が考えられますか?
STM32F7に搭載されているCortex-M7にはL1 Dキャッシュが搭載されています。また、一方で独立したDMAも搭載しています。Dキャッシュにヒットしたデータは、Dキャッシュで保存されていますが、本体メモリの同じアドレスをDMAが書き換えてしまうと、Dキャッシュと本体メモリの値が異なってしまい。一貫性が保たれなくなります。Dキャッシュと本体メモリのデータの一貫性はハードウエアでは管理しませんので、ユーザが管理しなければなりません。DキャッシュでアクセスするメモリエリアはDMAでアクセスしないか、またはアクセスしても、その際にDキャッシュをクリーン化する必要があります。一方、Iキャッシュは基本的に書き換えませんので、一貫性を管理する必要はありません。
タイマ1/8の出力信号を、ソフトウエアで強制的にHigh/Lowにすることはできますか?
例えば、TIM1_CCMR1 レジスタの OC1M:出力比較 1 モードを100または101に設定すると、、出力比較レジスタとカウンタの比較とは関係なく、ソフトウェアによって直接、各出力比較信号を強制的にハイまたはローレベルにできます。出力比較信号を強制的にハイレベルにするには、対応する TIMx_CCMRi レジスタの OCiMビットに 101 を書き込みます。また、 OCiM ビットに 100 を書き込むことによって、強制的にローにできます。
タイマにエンコーダ機能は搭載されていますか?また、そのエンコーダで4逓倍の2相カウンターが実現が可能ですか?
STM32Fに搭載されているタイマにはエンコーダ機能が搭載されています。特に、STM32F413等に搭載されているLPTIMERは低消費電力タイマというだけでなく、エンコーダ機能を有するものがあります。T1のレベルがHighの時はT2のエッジでカウントアップ、Lowの時はカウントダウンする機や、T1のエッジではカウントダウン、T2のエッジでカウントアップする機能もあります。4逓倍の2相カウンターも実現が可能です。カウンタのアップダウンは、入力信号(T1、T2)をタイマクロックでサンプリングした後、エッジ検出をおこないます。
タイマのPWM信号を出力している最中に、Duty比を変更できますか?
タイマのPWM出力の周期は自動再ロードレジスタで決まり、Duty比はキャプチャ/コンペアレジスタ(CCRx:xはch番号)で決まります。CCRxは一旦設定して、PWM出力が始まった後でも、ソフトウエアで変更可能で、変更した値は即有効になります。書き変わった後、新しいCCRxの値とカウンタの値が一致したときに、PWMの値が(H⇔L)変化します。したがって、PWM出力の最中でもCCRxを書き換えることによってDuty比をソフトウエアで自由に変更することできます。
タイマを使っていますが、1回目のオーバーフローの時間が設定した値になりません。原因は何が考えられますか?
タイマの自動再ロードレジスタはプレロード・レジスタとシャドー・レジスタの2段構成になっています。
プレロード・レジスタの内容は、更新イベントが発生すると、シャドー・レジスタ内へ転送されます更新イベントは、カウンタがオーバー/アンダー・フローに到達した時に発生します。 タイマの初期設定直後は、更新イベントが発生していないので、シャドー・レジスタの値は不定です。その為、最初のオーバー / アンダー・フローは不定期間で発生してしまいます。シャドー・レジスタの値を確定するためには、ソフトウエアでUG(Update Generation)ビットを設定します。UGビットを設定すると、ソフトウエアで更新イベントを発生させることができますので、プレロード・レジスタの内容は、シャドー・レジスタ内へ転送されます。
バックアップドメインをリセットしたいのですが、システムリセットでリセットされません。どうすればリセットできますか?
バックアップドメインは、VBAT端子にバックアップ電源をつなげていれば、電源VDD/VDDAのパワーオンリセットでも、システムリセットでも、リセットはかかりません。バックアップドメインをリセットしたい場合は、ソフトウエアで、RCC_BDCRレジスタ内のBDRSTビットを設定するか、一旦VBAT端子の電源を切って再度立ち上げます。しかし、BKPSRAMはBDRSTビットのリセットに影響されません。逆にこれを利用して、BKPSRAMに決められた値を書いておけば、その値をチェックすることで、どちらのリセットがかかったを判別できます。
フォールトが発生した時の解析方法を教えてください。
フォールトにも色々あります。メモリ管理フォールト、バス管理フォールト、用法フォールト、ハードフォールト、デバッグフォールトです。各々のフォールトはレジスタを持っていて、原因に関連するフラグがあります。フォールトが起きたら、まずこれらフラグをチェックしてください。そして、マニュアルの説明にしたがってフォールトの原因を調べてください。それでも原因が判らない場合は、フォールトの起きる前にCPUが何を行っていたかを調べます。フォールトハンドラ(サービスルーチン)の中でブレークをかけて、その時のスタックの中身を見ます。するとLRの値がスタックされているはずです。LRはサブルーチンコールの戻り値を指します。LRのアドレスの前からサブルーチンコールされてフォールトが起こっています。逆アセンブラでLRのアドレスにジャンプすると、そこがフォールト原因の可能性が高いので、そこから遡って命令をチェックしてください。過去にあった主なフォールトの原因は、不当命令の実行(FlashのWSを間違っていた)、不定値を使って計算しようとした(実装されていないメモリ、レジスタ領域をアクセスした)、サブルーチン内でスタックを壊した(プログラムの作成ミス)、不当なサブルーチンを実行した(プログラムの作成ミス)等があります。原因を見つけるコツは、実際のプログラムはかなり複雑なので、用心深く、しつこく探求することです。
リセット(システムリセット)が生成されてもHSERDYビットがリセット値に戻りません。原因は何が考えられますか?
HSERDYビットは、システムリセットの影響を受けません。HSERDYビットの初期化には、システムリセット生成(HSEONビットクリア)後、HSEオシレータクロックを6サイクル以上入力する必要があります。
リセット解除してマイコンを起動した時に、Flashがブランク状態の場合、端子機能としてリセット状態が維持されていない端子があります。原因は何が考えられますか?
BOOT端子、およびオプションバイトでメインフラッシュメモリをブート領域に設定しても、AN2606 STM32 microcontroller system memory boot modeに記載されているBootloader activation patternsに該当する場合は、システムメモリがブート領域として選択されます。その結果、ブートローダの実行によって、特定の端子群は通信インタフェース機能として設定されます。
リセット機能で、各ペリフェラルを簡単に初期化する方法はありますか?
各周辺モジュールは、ペリフェラルリセットレジスタ(RCC_APBxRSTR)をセットすることで、容易に周辺機能毎に初期化することが可能です。初期化ルーチンで使用するのが一般的ですが、各周辺機能でエラーが発生して、状態を初期化し、再起動する場合にも便利です。例えば、SPI通信でオーバーランエラーが発生し、最初から通信をやり直す場合とか、SDIOのステートマシーンが、エラーを起こしてidleに戻ってしまう場合は、初期化が必要ですので、このレジスタをセットすれば、周辺モジュールのレジスタが簡単に初期値に戻ります。
リセット端子に外部リセットICを接続したら、正常に動作しなくなりました。原因は何が考えられますか?
STM32のリセット端子(NRST)は、内部リセットの出力信号も兼ねていますので、NMOSオープンドレイン構造になっています(各製品のマニュアル参照)。そのため、外部にリセットICをつないで、CMOSプッシュプルでドライブすると、NRST端子がリセットICのPMOSでドライブされて、内部リセットの際にNRST端子がLowにならず、リセットがかからない場合が発生します。外部リセットICをお使いの際は、NMOSオープンドレイン出力でNRSTをドライブするようにしてください。
外部割込みの「レベル割り込み」は使えますか?
外部割込みの「レベル割り込み」はSTM32シリーズのハードウエアではサポートしていません。しかし、「エッジ割り込み」と「端子のレベルチェック」により、「レベル割り込み」相当の機能を実現することが出来ます。例えば、Lowレベル割り込みを実現したい場合は、まず立下りエッジで割り込みを受けて、割り込みサービスルーチンへ飛びます。このサービスルーチンの最後(メインルーチンに戻る直前)に端子のレベルをチェックします。もしLowレベルが維持されている場合は、割り込みペンディングビットを立てます。もし、レベルがHighであれば、ペンディングビットを立てずに、メインルーチンへ戻ります。ペンディングビットが立っているということは、割り込みを受け付けたと同じことですので、再び割り込みサービスルーチンを実行します。この方法を使うと、外部割込み端子がLowを維持し続ける限り、割り込みサービスルーチンが繰り返され、「レベル割り込み」と同じ動作になります。Highレベル割り込みの場合は、この逆、すなわち「立ち上がりエッジ割り込み」と「Highレベルチェック」で実現できます。ただし、レベルをチェックした直後、メインルーチンに戻る前に、端子のレベルが変化した場合は、コードの実行のタイムラグにより若干タイミングがずれますので、ご注意ください。
消費電流(STM32の実際の値)を簡単に測るボードはありますか?
STM32にはDiscoveryとNucleoという2種類のスターターキットが準備されています。 サンプルプログラムをWebからダウンロードして、これらのスターターキットに書き込めば、マイコンはご希望のモードで動作します。DiscoveryとNucleoには電流測定用のピンが設けられていますので、このピンに電流計をつなげば、簡単に電流値が測定できます。
電源のデカップリング(バイパス)コンデンサは、どのように選定すればよいですか?
マニュアルやデータシート、アプリケーションノートの中に、電源のデカップリングコンデンサの種類、 装着箇所、静電容量について記載されています。これらの説明にしたがって選定してください。 基本的に、コンデンサの種類としては、小型で周波数特性に優れ、かつインピーダンスも低いセラミック コンデンサやタンタル電解コンデンサが適しています。配置位置は極力マイコンの電源端子に近い場所を 選んでください。
内蔵発振器HSIの周波数精度をユーザーが調整することはできますか?
ある程度ならばユーザが周波数補正を行うことができます。具体的には次のようにして補正を行います。各デバイスはTA= 25℃時に±1%の精度を保つために、工場出荷時に校正されています。リセットされた後に、工場での校正値はクロックコントロールレジスタRCC_CRのHSICAL[7:0]ビットに格納されます。ユーザ補正は、RCC_CRレジスタのHSITRIM[4:0]ビットを設定することによって行われます。これらのビットで、電圧と温度が変化したときのHSI RC発振周波数変化を補正するようにプログラムを作ることが出来ます。詳細についてはアプリケーションノートAN2868をご覧ください。
発振回路HSEに電磁干渉ノイズを低減させるハードウエアは搭載されていますか?
PLLにスペクトラム拡散クロック生成機能(SSCG)が内蔵されている製品があります。この機能を使うと、デバイスから発生する電磁干渉ノイズ成分の低減が可能です。特性の詳細については、データシートの「PLL spread spectrum clock generation (SSCG) characteristics」セクションを参照してください。この機能はリセット直後は動作していません。ソフトウエアで有効化します。もし、電源投入直後、電磁干渉ノイズ成分の低減が必要な場合は、できる限り早くソフトウエアで有効化する必要があります。
発振回路HSIのデータシートに記載されている周波数誤差は、製品にマイコンを実装した後でも変わりませんか?
データシートに記載されているHSIの周波数誤差は、デバイスの出荷時にキャリブレーションされた値です。ご使用の際、実装時のリフロー等で、熱ストレスや機械的ストレスがデバイスにかかった場合に、HSIの周波数は変化いたします。例えば、STM32F334のデータシートのHSI oscillator characteristicsの表の注意事項に「4.Factory calibrated, parts not soldered」と記載されており、リフロー後の周波数の例は「HSI oscillator accuracy characterization results for soldered parts」の図にに記載されています。また、実装後でも温度や電源電圧でも変化しますので、HSIの周波数精度が必要な用途では、随時キャリブレーションを行ってください。

デバイス(STM8)

SPIの通信データをCRCでチェックできますか?
SPIには独立したCRC生成/検査機能があります。その生成多項式は転送データ長に合ったCRC-8が使えます。CRC-8が固定の製品もありますが、STM8Lシリーズなどでは、ユーザが任意の生成多項式を設定できます。
内蔵温度センサーを使って、マイコンの周辺温度を測定することはできますか?
STM8Lシリーズには、温度センサーが内蔵されています。シリコン上の温度を電圧に変換して、内蔵ADCで測定することが可能です。あくまで、シリコン上の温度を測定するものです。マイコン内部のシリコン上の温度と周辺温度は様々な要因で1対1に対応しませんので、マイコンの周辺温度の測定には適しません。したがって、マイコン周辺温度の測定に用いることは、お勧めしていません。使用例としては、マイコンの動作温度をチェックするような用途でお使いいただけます。
VDDA(Vref+)の電圧値をチェックする良い方法はありますか?
STM8Lシリーズだけですが、1.2VのVREFINT電圧があります。ADCの入力チャネルに割り当てられている1.2VのVREFINT電圧は、ADCの参照基準電圧ではありません。ADCの測定値の検証用または調整用に使用するために内蔵されています。これを使うと、VDDA(Vref+)の電圧を確認することができます。VREFINTの1.2VはBGRを使って生成していますのでVDDA(Vref+)の影響を受けずに常に1.2Vです。もし、VDDA(Vref+)の電圧が減少した時に、この1.2Vを測定すると、通常の時よりも大きな変換値が出てきます。その変換値と1.2Vの比を計算してVDDA(Vref+)の電圧値を計算することが出来ます。
発熱計算は、どのようにすればいいのでしょうか?
マイコンは消費する電力で発熱します。消費電力から、どのくらい発熱し、マイコンの周辺温度からジャンクション温度が何度になるかの計算式は、各製品のデータシートの「Thermal characteristics」の章に記載されています。発熱に関する熱抵抗の値はパッケージ毎に異なります。具体的な値は「Thermal characteristics」の表に記載されています。周辺温度の最大値TAmaxとジャンクション温度の最大値TJmaxのスペックは、「General operating conditions」の表に記載されていますので、このスペック内でご使用ください。
発振回路LSE用の水晶振動子の仕様に条件はありますか?また、推奨振動子はありますか?
LSE用の水晶振動子は等価直列抵抗 (ESR:Equivalent Series Resistance) が小さい製品をお使いください。ESRが大きいと、損失が大きくなり、発振特性が安定しない発振不良につながります。ESRの値は、各水晶振動子のカタログに記載されております。各水晶振動子メーカ殿にSTM8用としてマッチングを確認していただいた水晶振動子がいくつかあります。アプリケーションノートAN2867の「Some recommended crystals for STM8AF/AL/S microcontrollers」に記載されていますので、参考にしてください。ただし、発振特性はプリント板の寄生容量や抵抗にも依存しますので、お客様のプリント板にマイコンと水晶振動子を付けた状態で、水晶振動子メーカにマッチング評価を依頼する事をお勧めいたします。
GPIOが未使用の場合の処理は、どうすれば良いですか?
未使用のGPIOは電位を固定し、ノイズ等で端子の電位が変動しないようにしてください。
方法としてはいくつかあります。
①入力ハイインピーダンスに設定して、10kΩ~100kΩ程度のプルアップ抵抗やプルダウン抵抗で 電位を固定しておく
②プルアップ抵抗やプルダウン抵抗が内蔵されているGPIOもあります。 これらを利用してプルアップやプルダウンを行う。
③出力端子に設定して、”High”または”Low”を出力しても電位は固定できますが、万が一、事故等で端子が電源と短絡したときに大電流が流れて、マイコンが破壊することが考えられますので、抵抗を介することをお勧めします。 この他に、GPIOの入力バッファをOFFして、ノイズ等による端子電位の変動が、マイコン内部に入ることを防ぐことも出来ます。
④アナログ端子と兼用になっているGPIOはアナログ端子に切り替えます。するとGPIOの入力バッファは OFF(入力信号を遮断)します。
GPIOの立ち上がり、立下りスピードを変更することはできますか?
可能です。例えばSTM8L15xの場合、2MHz / 10MHz相当の傾きに設定可能です。
LCDドライバー(Lシリーズに搭載)の駆動能力を調整することはできますか?
STM8Lには、LCD電源用に内蔵ブースターを搭載していますので、ユーザが外部電源を準備する必要はありません。もちろん、外部電源も使用可能です。また、分圧用の内蔵抵抗を搭載していますので、VLCDに印加された電圧を直接分圧できます。内蔵抵抗には抵抗値の大きなRHと小さいRLと2種類があるので、LCDパネルの大きさ(負荷電流)によって抵抗値を選択することができます。
WFI/WFE命令で低消費電力モードに入りますが、WFIとWFEで何が違うのでしょうか?
WFIはWait For Interrupt(割り込み待ち)の略です。WFEは、Wait For Event(イベント待ち)の略です。WFIの場合、マイコンが低消費電力モードから復帰する際に、割込みが認識されて、割り込み処理が始まります。WFEの場合は低消費電力モードからから復帰する際に、、割り込み処理が行われずに、低消費電力モードからの復帰だけが行われます。したがって、低消費電力モードから復帰するときに、WFIを使うかWFEを使うかを、低消費電力モードに入る際に、ユーザーがコントロールする必要があります。
ウォッチドッグタイマを電源投入と同時にスタートすることはできますか?
STM8シリーズには基本的に2種類のウォッチドッグタイマが搭載されています。独立型ウォッチドッグタイマ(IWDG)とウインドウウォッチドッグタイマ(WWDG)です。IWDGは低速の内蔵発振回路LSIをクロック源とし、WWDGはシステムクロックをクロック源とします。どちらもFlashのオプションバイト(ハードウエア)で電源投入と同時にスタートできます。また、ソフトウエアでスタートすることもできます。
タイマ1の出力信号を、ソフトウエアで強制的にHigh/Lowにすることはできますか?
出力モード(TIM1_CCMRi レジスタの CCiS ビット=00)では、出力比較レジスタとカウンタの比較とは関係なく、ソフトウェアによって直接、各出力比較信号を強制的にハイまたはローレベルにできます。出力比較信号を強制的にアクティブレベルにするには、対応する TIM1_CCMRi レジスタの OCiMビットに 101 を書き込みます。OCiREF は強制的にハイになり(OCiREF は常にアクティブハイ)、OCi 出力は CCiP の極性ビットに応じて強制的にハイまたはローになります。たとえば、CCiP = 0(OCi アクティブハイ)の場合、OCi は強制的にハイになります。OCiREF 信号は、TIMx_CCMRx レジスタの OCiM ビットに 100 を書き込むことによって、強制的にローにできます。
タイマのPWM信号を出力している最中に、Duty比を変更できますか?
タイマのPWM出力の周期は自動再ロードレジスタで決まり、Duty比はキャプチャ/コンペアレジスタ(CCRx:xはch番号)で決まります。CCRxは一旦設定して、PWM出力が始まった後でも、ソフトウエアで変更可能で、変更した値は即有効になります。書き変わった後、新しいCCRxの値とカウンタの値が一致したときに、PWMの値が(H⇔L)変化します。したがって、PWM出力の最中でもCCRxを書き換えることによってDuty比をソフトウエアで自由に変更することできます。
リセット端子に外部リセットICを接続したら、正常に動作しなくなりました。原因は何が考えられますか?
STM8のリセット端子(NRST)は、内部リセットの出力信号も兼ねていますので、NMOSオープンドレイン構造になっています(各製品のマニュアル参照)。そのため、外部にリセットICをつないで、CMOSプッシュプルでドライブすると、NRST端子がリセットICのPMOSでドライブされて、内部リセットの際にNRST端子がLowにならず、リセットがかからない場合が発生します。外部リセットICをお使いの際は、NMOSオープンドレイン出力でNRSTをドライブするようにしてください。
消費電流(STM8の実際の値)を簡単に測るボードはありますか?
STMにはDiscovery8というスターターキットが準備されています。 サンプルプログラムをWebからダウンロードして、これらのスターターキットに書き込めば、マイコンはご希望のモードで動作します。Discoveryには電流測定用のピンが設けられていますので、このピンに電流計をつなげば、簡単に電流値が測定できます。
消費電流を容易に計算できるツールはありますか?
STM8CubeMXは、PC上で動作するSTM8の設定ツールで、設定レポートを生成できるグラフィカル・ツールです。その機能のひとつに消費電流を計算できるシミュレーション機能も含まれます。STM8CubeMXを開けていただき、デバイスを指定して次に進みます。「Pinout」タブの同じ並びにある「Power Consumption Calculator」タブを選択します。左側に使用環境(電源電圧、動作温度等)、電源の種類(電池の種類、容量)を入力し、メイン画面で、動作周波数、使用する周辺機能等を入力すると、自動的に消費電流を計算します。各低電力モードにも対応しています。さらに、電池の容量にしたがって、電池の寿命計算も可能です。低電力アプリケーションには非常に便利な機能ですので、是非ご活用ください。
電源のデカップリング(バイパス)コンデンサは、どのように選定すればよいですか?
マニュアルやデータシート、アプリケーションノートの中に、電源のデカップリングコンデンサの種類、 装着箇所、静電容量について記載されています。これらの説明にしたがって選定してください。 基本的に、コンデンサの種類としては、小型で周波数特性に優れ、かつインピーダンスも低いセラミック コンデンサやタンタル電解コンデンサが適しています。配置位置は極力マイコンの電源端子に近い場所を 選んでください。
発振回路HSIのデータシートに記載されている周波数誤差は、製品にマイコンを実装した後でも変わりませんか?
データシートに記載されているHSIの周波数誤差は、デバイスの出荷時にキャリブレーションされた値です。ご使用の際、実装時のリフロー等で、熱ストレスや機械的ストレスがデバイスにかかった場合、また、温度や電源電圧でもHSIの周波数は変化いたします。HSIの周波数精度が必要な用途では、ソフトウエアで随時キャリブレーションを行ってください。

ソフトウェア開発環境

DSP命令(Cortex-M4やM7)を使うときの統合開発ツールの設定方法を教えてください。
CMSISにはDSPというレイヤーがあって、ソースコードはARMより提供されています。
これらを使用するには開発環境の事前設定が必要です。まず、オプション設定のカテゴリC/C++コンパイラで、 “ARM_MATH_CM4”をシンボル定義します。次に、オプション設定のカテゴリのリンカでライブラリタグにCMSIS-DSPのlibを追加します。
使い方の詳細はドキュメントを読んでください。これらは、STの製品ではなく、コンパイラベンダーから ライブラリとして提供されるものなので、ご質問はコンパイラベンダーにお願いします。
JTAGバウンダリスキャン機能を持った開発ツールはありますか?
ARM DS-5やMDK-ARMは、JTAG ICE接続時にJTAGバウンダリースキャンを実施してコア内部のCoreSightシステムにアクセスしますが、回路全体を含むJTAGバウンダリースキャンを行う機能はツール自体には含まれていません。また、IAR殿のツールでもJTAGバウンダリスキャン機能は提供していません。専用機器および、ソフトウェアが必要となります。ARMのConnect Service(マイARM)のアカウントをお持ちであれば、「https://silver.arm.com/browse/BX008」からRealView ICE RDDI Packages (BX008-DA-10019)というライブラリ群をダウンロードすることが可能ですこちらがARMから現状提供されている唯一のJTAGバウンダリースキャンを、お客様が記述したソフトウェアから実施できるものになります。このライブラリをソフトウェアから呼び出すことでTDIからデータをドライブして、TDOからキャプチャすることが可能となります。詳細な説明につきましては、ダウンロード後zipファイルを解凍していただきますと、「include\html」フォルダ内に生成されるドキュメントに記載があります。同フォルダ内の「index.html」をご参照ください。IAR殿、Keil殿以外の日本のメーカでJTAGバウンダリースキャンをサポートしている会社は以下になります。特殊電子回路株式会社http://www.tokudenkairo.co.jp/jtag/tech/。アンドールhttp://www.andor.jp/jtag/whyjtag.html
スタック(ポインタ)をソフトウエア開発時に統合開発ツールで管理することはできますか?
可能です。例えば、実際の内蔵RAMの容量サイズから、使用可能な最大スタックサイズを超えるような状況場合を知りたい場合、2つの方法があります。それは、ビルド時点で、見積もりを表示する機能とデバッグ時点でブレークする機能です。ビルド前に各ツールで決められたタグにチェックをしておくと、ビルドした際にマップファイルなどに、スタックの想定使用量が表示されます。一方、デバッグ時に、スタックがオーバフローを起こす直前でブレークをかける方法もあります。具体的な方法は各統合開発ツールの使い方をご参照ください。
消費電流(STM32)を知りたいのですが、実デバイスが未入手です。何か概算を計算する良い方法はありますか?
STM32CubeMXは、PC上で動作するソフトウェア設定ツール(初期設定のC言語生成ツール)です。その機能のひとつに消費電流を計算できるシミュレーション機能も含まれます。STM32CubeMXを開けていただき、デバイスを指定して次に進みます。そして、「Pinout」タブの同じ並びにある「PowerConsumptionCalculator」タブを選択します。左側に使用環境(電源電圧、動作温度等)、電源の種類(電池の種類、容量)を入力し、メイン画面で、動作周波数、使用する周辺機能等を入力すると、自動的に消費電流を計算します。各低電力モードにも対応しています。さらに、電池の容量にしたがって、電池の寿命計算も可能です。低電力アプリケーションには非常に便利な機能ですので、是非ご活用ください。

ハードウェア開発環境

STM32マイコンのOrCADのシンボルはありますか?
各製品の紹介のページでCad Symbol Libraryを公開しています。 こちらにはOrCADシンボルは含まれていませんが、ダウンロードしたLibrary内のReadme.txtにある"How to use .bxl files"を参照して、リンクされているサイトよりbxl拡張子のファイルをOrCADシンボルに変換してください。
Nucleo/DiscoveryボードをPCにつないでも認識されません。対応方法を教えてください。
Nucleo/Discoveryボードには、ST純正の開発ツールのST-Link/V2が実装されています。このST-Linkのファームウェアが古い場合、PCを認識しない等の不具合が発生します。単体のST-Link/V2も同様ですが、ST-Link/V2のファームウェアは常に最新のバージョンでお使いいただく事を推奨いたします。アップデートの方法はいたって簡単です。最新版は以下のURLから実行ファイルをダウンロードしていただいて、それを展開後にWindowsフォルダの下の"ST-LinkUpgrade.exe"をST-Link/V2を接続した状態で実行してください。アップデート中は絶対にST-Link/V2を抜かないでください。http://www.st.com/content/st_com/en/products/embedded-software/development-tool-software/stsw-link007.html
低消費電力モードを書き込んだデバイスにST-LINKを接続すると、接続した時点でデバイスが低消費電力モードに 入って、ST-Linkがつながりません。解決策はありますか?
その様な場合はST-Link Utilityを使って解決することができます。 ST-Linkをつないだ状態でST-Link Utilityを開けて、「Target]メニュ→「Settings」→「Mode」と進みます。 ここで「Connect Under Reset」を選択すると、「Enable debug in Low power mode」にチェックが入ります。 チェックが入らなかったら、自分でチェックしてください。 これで低消費電力モードに入ってしまったマイコンでも、コードを書き換えて、デバッグモードに入ることが できます。 また、これと同じ機能は、Cortex-Mをサポートしている統合ツールでも可能なものがありますので、 具体的使い方は、ツールサプライヤーにご確認ください。