【STM32】STM32Cube.IDE使用時にクロック周波数を変更するとコードが異常割り込みにジャンプしてしまう

1 はじめに

これはプロジェクト中に偶然発見された問題です。実際には、同様に実行できるより複雑なプロジェクトもありますが、後で、新しい単純なプロジェクトは実行できないが、同じより複雑なプロジェクトは実行できることがわかりました。ということは、同僚はもともとその問題の場所を知らなかったということです。私は解決策を見つけましたが、その後忘れてしまい、見つけることができませんでした。しかし、再び遭遇して解決したので、忘れないようにここに記録します。それをまた。

2. 問題点と再現方法

新しいプロジェクトを作成し、クロックを 40MHz などの少し高い値に設定し、ペリフェラルを設定するだけで、コードを生成した後、実行されずにスタックしてしまいます。

if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE4) != HAL_OK)
  {
    
    
    Error_Handler();
  }

操作できない

3. 問題解決のプロセス

STM32Cube.IDE ソフトウェアを使用する場合、クロック構成でクロック ツリーを構成してメイン周波数を変更することができます。

ここに画像の説明を挿入します

クロック ツリーのデフォルトのメイン周波数は 4M です (私が使用しているチップでは、チップごとにデフォルトのクロック ツリー構成が異なる場合があります)。40M を超えるメイン周波数に変更すると、プログラムが暴走します。 DeBug は段階的に実行されます。プログラムがこの関数でスタックしていることに気づいたとき

ここに画像の説明を挿入します

意味はわかりませんが、メインの内部電圧レギュレータの出力電圧を設定していると推測できます。

  if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE4) != HAL_OK)
  {
    
    
    Error_Handler();
  }

実はこの機能はHALライブラリにも詳しく紹介されています。

ここに画像の説明を挿入します
ここに画像の説明を挿入します

皆さんへの翻訳です(私はCET-4に合格していないクズなので、Youdao辞書で翻訳しましたorz)

===============================================================================

#####电源控制功能#####

===============================================================================

[. .]

介绍控制电源的功能。



[. .]

(+) STM32U5系列器件嵌入两个稳压器:一个LDO(线性

电压调节器)和一个SMPS(降压转换器)并联

为数字外设SRAM1, SRAM2, SRAM3提供VCORE电源

SRAM4和嵌入式闪存。



(+) SMPS允许降低功耗,但有些

外围设备可能会受到SMPS产生的噪声的干扰,

要求应用程序在运行时切换到LDO

外围设备才能达到最佳性能。



(+) LDO和SMPS稳压器有两种模式:主稳压器模式

(当需要性能时使用),和低功率调节器模式。LDO

或SMPS可用于所有电压缩放范围,并在所有停止

模式。



(+)复位后,稳压器为LDO,范围为4。切换到SMPS

提供更低的消耗,特别是在高VDD电压。它是

可以从LDO切换到SMPS,或者从SMPS切换到LDO

任何范围,通过配置REGSEL位。建议进行切换

在改变电压范围之前,首先要到SMPS。



(+)当退出停止或待机模式时,稳压器与

进入低功耗模式时。电压量程为范围4(+)两个稳压器可以提供四种不同的电压(电压缩放)

并可在停止模式下运行。

电压缩放范围可以是以下值之一:

(++)电压输出刻度1:1V2

=;当系统时钟频率高达160mhz时使用

(++)电压输出刻度2:1V1

=;当系统时钟频率不超过100mhz时使用

(++)电压输出刻度3:1V0

=;当系统时钟频率高达50mhz时使用

(++)电压输出刻度4:0V9

=;当系统时钟频率高达24mhz时使用



@endverbatim

* @ {
    
    

* /



/ * *

* @brief配置主内部稳压器输出电压来实现

*性能和功耗之间的权衡。

* @param voltagscaling:指定稳压器输出电压刻度。

*该参数可以是以下值之一:

* @arg @ref PWR_REGULATOR_VOLTAGE_SCALE1:稳压输出刻度1*提供1.2 V的典型输出电压。

*当系统时钟频率高达160mhz时使用。

* @arg @ref PWR_REGULATOR_VOLTAGE_SCALE2:稳压输出刻度2*提供1.1 V的典型输出电压。

*当系统时钟频率高达100mhz时使用。

* @arg @ref PWR_REGULATOR_VOLTAGE_SCALE3:稳压器电压输出刻度3*提供1.0 V的典型输出电压。

*当系统时钟频率高达50mhz时使用。

* @arg @ref PWR_REGULATOR_VOLTAGE_SCALE4:稳压输出刻度4*提供0.9 V的典型输出电压。

*当系统时钟频率高达24mhz时使用。

* @注意在移动到电压缩放2之前,必须确保

*系统频率在50mhz到100mhz之间。

* @注意在移动到电压缩放3之前,必须确保

*系统频率在24mhz到50mhz之间。

* @注意在移动到电压缩放4之前,必须确保

*系统频率低于24mhz。

* @检索HAL状态。

* /

 

現時点では問題は見つかりませんでしたが、システム周波数を 40 に変更すると、IDE によって自動生成されたコード内の rang 値が 1 になることがわかりますが、ライブラリの指示に従って、 3になる

ここに画像の説明を挿入します

これは、実際にはメイン周波数の変更に成功せず、その過程で奇妙な問題が発見されたことを意味します。

ここに画像の説明を挿入します
SystemPower_Config この関数は実際には空です画像の説明を追加してください

これは未構成のシステム電源ですか? そのため、メイン周波数の変更に失敗しました。ここにはコードは書かれていません。IDE によって自動的に生成されます。新しい機能の場合、IDE はエラーを起こす可能性がありますが、最も基本的な理由は、エラーを起こす理由がないため、特定の構成手順が欠落しているはずだと思い、構成内を検索し、最終的に最も可能性の高い構成オプションを見つけました。

ここに画像の説明を挿入します
それはおそらく電源セキュリティと権限を意味しますか?開いてみると、プログラムはフリーズせずスムーズに動作することがわかったので、メイン周波数を変更するにはこの権限が必要なのではないかと思い、手動で開くだけですが、コードに戻ると、実際に、

ここに画像の説明を挿入します

この関数はまだ空ですが、既存の実行可能なプロジェクトを比較すると、コンテンツがあることがわかりました。
ここに画像の説明を挿入します

具体的な構成を比較した結果、元のプロジェクトではこの場所に低電力スイッチが設定されていたことが判明したため、SystemPower_Configこの機能は低電力消費を制御するために特別に使用されていると推測されます。最初からの可能性があります。低電力の設定方法を探していたときに、Privilege attributes他の人がチェックしているのを見てこのオプションにチェックを入れたためです。偶然この問題に遭遇したわけではありませんが、幸いなことに現在は解決されています。

ここに画像の説明を挿入します

また、範囲範囲の他の部分では、システムのメイン周波数が 40M に設定されている場合でも、PWR_REGULATOR_VOLTAGE_SCALE1

ここに画像の説明を挿入します
テストが複数の範囲を変更する場合、値は 1 から 4 の間でのみ変化し、2/3 にはジャンプしません。具体的には、オンラインで結果が見つかりません。理由を知っている人がいたら、ディスカッションを共有してください。

おすすめ

転載: blog.csdn.net/Daears/article/details/130501173