STM32F407 基本まとめシリーズ (1)

I.はじめに

突然间想记录一下这些简单实用的东西,因为我发现曾经拥有的、奇妙的抑或是一些引以为豪、熟练的不能再熟练的东西终将会变成脑海中一种自我良好的感觉,当要提取出来用到的时候才发现你依旧是那个小白白,依旧要重新来过。技术时代,时间宝贵,方向远比努力重要,只有更优秀才能更优秀。
本章记录的都是一些超级简单,很基础却也是很有用的东西,旨在帮助那些和我一样曾经迷茫、陷入其中的人,当然有大佬批评指教一下最好。
刚开始记录因此东西杂乱无章,没关系,好的文章是要经过不断地不断地修改才能出来的。记录的东西不详尽没有固定时间,没关系,烂开头好过一动不动(其实是懒)。记录的东西很低级,没关系,都是从新手入门过来然后在来回之间反复横跳(哼,瞧不起谁)。

2. STM32F407 の基礎知識 (整理中)

1 周辺機器設定関連

1.1 GPIO の使用

シングルチップマイコン入門の第一歩はレジスタを使ってランプを点灯させることですが、点灯動作のレジスタコードは以下のとおりです

	/*开启 GPIOF 时钟,使用外设时都要先开启它的时钟*/
	RCC_AHB1ENR |= (1<<5);		
	/*PF6 MODER6 = 01b 输出模式*/
	GPIOF_MODER |= (1<<2*6);	
	/*PF6 OTYPER6 = 0b 推挽模式*/
	GPIOF_OTYPER |= (0<<1*6);
	/*PF6 OSPEEDR6 = 11b 速率100MHz*/
	GPIOF_OSPEEDR |= (3<<2*6);
	/*PF6 PUPDR6 = 01b 上拉模式*/
	GPIOF_PUPDR |= (1<<2*6);	
	/*PF6 BSRR寄存器的 BR6置1,使引脚输出低电平*/
	GPIOF_BSRR |= (1<<16<<6);

このプロセスは、ペリフェラル クロックをオンにすることです -> コンフィギュレーション モード レジスタ (入力または出力) -> 出力タイプ レジスタ (これがコンフィギュレーション出力モードに必要な場合) -> 出力速度レジスタ (要件がない場合は通常は最大値を開きます) → プルダウンレジスタ(一般的にプルアップはハイレベル、プルダウンはローレベル) → リセットレジスタの設定(端子を直接ハイレベル、ローレベルとして操作)

1.2 タイマPWM波

構成プロセス

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//TIM时钟配置结构体
TIM_OCInitTypeDef TIM_OCInitStructure;//TIM PWM配置结构体
GPIO_InitTypeDef GPIO_InitStructure; //GPIO配置结构体
// 开启定时器相关的GPIO 外设时钟*/
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA,ENABLE);//GPIO时钟
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM3,ENABLE);//TIM3定时器时钟
 /* 指定引脚复用功能*/
 GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3);//功能复用,注意这里GPIO_PinSource6和GPIO_Pin_6不能混淆。这个函数和GPIO_Init()先后无所谓。
 /* 定时器功能引脚初始化*/
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//GPIO_PuPd_NOPULL;//上拉下拉无所谓 都可以
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
 GPIO_Init(GPIOA, &GPIO_InitStructure);
/* ================== 时基结构体初始化=================== */
 // 累计TIM_Period+1 个计数后产生一个更新或者中断
 // 当定时器从0 计数到1023,即为1024 次,为一个定时周期
 TIM_TimeBaseStructure.TIM_Period = 1024-1;
 // 高级控制定时器时钟源TIMxCLK = HCLK=42MHz
 // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHz
 TIM_TimeBaseStructure.TIM_Prescaler = 420-1;
 // 时钟分频,在计算死区时间的时候会用到
 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
 // 计数方式
 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
 // 重复计数器,这里没使用
 TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
 // 初始化定时器TIMx, x[1,8]
 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

 /* ================== 输出结构体初始化=================== */
 // 配置为PWM 模式1,先输出高电平,达到比较值的时候再改变电平
 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
 // 主输出使能
 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
 // 配置比较值
 TIM_OCInitStructure.TIM_Pulse = 0;
 // 主输出高电平有效
 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
 // 通道初始化	
TIM_OC1Init(TIM3, &TIM_OCInitStructure);
 // 使能通道重装载
 TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
// 使能定时器
 TIM_Cmd(TIM3, ENABLE);
// 主动输出使能
// TIM_CtrlPWMOutputs(TIM3, ENABLE);

全体的なプロセスは、GPIO、TIM クロックを開く -> GPIO パラメーターを構成する (関数が多重化されているかどうかに注意) -> TIM タイマー パラメーターを構成する (主に分周とカウント、つまり入力クロックとカウント期間) -> TIM タイマー PWM wave 設定 (デューティ サイクル、モード、高レベルと低レベル、チャネルを含む) -> 機能オープン

1.3 外部水晶発振器パラメータの変更

ボードごとに水晶発振器が異なる場合があり、変更が必要な箇所は次のとおりです。

まず、stm32f4xx.h ファイルの HSE_VALUE (外部高速クロック) を変更し、次に
ここに画像の説明を挿入
system_stm32f4xx.c の PLL_M (フェーズ ロック ループ分周係数) を変更します。1
ここに画像の説明を挿入
秒は速い場合もあれば遅い場合もあります。

2 言語と使用環境関連

2.1 C/C++

プロジェクトにヘッダー ファイルを追加すると、C/C++ 混合コンパイルが表示され、ファイルのコンパイル方法を変更する必要があります。時々、
この種の問題が発生します。非常に奇妙です。明らかに、ヘッダー ファイルを追加して F12 を押すと、対応するファイルにジャンプすることもできます。関数. それはエラーを報告するだけです. 逆に、この種の問題については、呼び出される可能性のあるヘッダー ファイルの価格タイプの設定の問題を検討してください (C/C++ 混合コンパイルによって引き起こされます)。 c ファイルの種類を
ここに画像の説明を挿入
c++ ソース ファイルに設定し、メインで bsp_led.h を呼び出します。bsp_led.h に対応するソース ファイルは bsp_led.c で、その種類は c ソース ファイルです。コンパイル後、上記のエラーが発生します。 。(C++ ソース ファイル タイプに変更するだけで、将来的には C++ モジュラー アイデアが必然的に使用されることになります)
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

2.2 F407 スタートアップファイル

時々、別のF4チップを移植したプロジェクトでスタートアップファイルが異なっている場合がありますが、その際にスタートアップファイルを差し替えるかどうかで悩むことになります。実際の測定値を置き換える必要はなく、魔法の杖のマクロ定義を変更するだけで
ここに画像の説明を挿入
ここに画像の説明を挿入
問題ありません。魔法の杖オプションの C/C++ で定義を変更するだけです。429 のスタートアップ ファイルは次のように使用されます。を使用する場合、407 のマクロ定義が定義されます。
ここに画像の説明を挿入

3 テスト検証関連

3.1 PWM 設定 IO ピン

PWM 波形 IO ピンを設定してプルアップまたはプルダウン、またはプルしないように設定します。効果はありませんが、波形は引き続き出力されます (最初は波形のレベルが異なる可能性があります)。

3.2 一般的な IO ピン

測定ピンを多重化した後は、ピンセットリセット関数の使用は無効 //GPIO_SetBits()|GPIO_ResetBits() となり、関数多重化は個別にのみ操作可能なスイッチと同等になります。
ここに画像の説明を挿入
いくつかのチュートリアルによると、GPIO のプルアップ モード設定とプルダウン モード設定のデフォルト レベルは異なりますが、このコードを実行した後も、IO ピンはまだレベルなし (0v や 3.3v ではありません) の状態です。必要がある場合に最適です。手動でセットするか、後でリセットするだけです。
ここに画像の説明を挿入

4 トラブルシューティング関連

4.1 信頼性の高いデバッグのためのヒント

ハードウェア回路が正常であることを確認するための重要なデバッグ スキル。私はかつて、トップレベルのロジック調査からボトムレベルの IO 構成まで、プログラムのデバッグに数時間を費やし、最終的にコアの外部回路に問題があることを発見しました。ボード。複数の基板を用意して比較検証することも可能です。
問題が長期間確認されていない場合は、考えられるすべての問題を 1 つずつリストアップして記録するのが最善です。大きな問題から小さな問題まで、簡単な問題から難しい問題まで、明確なアイデアを持ってください。LED は 2 つ配置できます。通信を示す通信ポート
。産業グレードの通信モジュールには双方向の送信および受信インジケータが装備されているため、問題が発生した場合はインジケータを見て、外側または内側の問題をすぐに特定できます。

3. スモールエンディング

前边说的很虚,其实就是最近帮朋友看一个定时器输出PWM的基础问题,我找了半天没给人家解决,不仅啪啪打脸而且引发了一系列调试问题把我陷进去了【泪流满面】,最终我发现我连一个灯都点不起来,沮丧的亚批(可以想象一下一个单片机程序员半夜坐在那里在台灯的照射下对着电脑发呆)。星光不问赶路人,好在最后发现了问题(嘿嘿)。
要多开源记录一些东西帮自己的同时也是帮别人。

4. 参考文献

ヌル

おすすめ

転載: blog.csdn.net/weixin_43058521/article/details/119481542