詳細なタイマー
タイマー(タイマー)は、タイミングUSART送信データ、タイミングデータ等を取得ADとして最も基本的な機能、の時間です。タイマーが使用される場合、GPIOは非常に豊富な機能を実現することができると結合し、出力波形を生成することができ、入力信号のパルス幅を測定することができます。生産PWMモータ制御用タイマの状態は、工業用制御方法では一般的であり、この知識は必要洞察力です。
STM32F4xxシリーズコントローラは、二つの高度な制御タイマ、10の汎用タイマと二つの基本的なタイマーがあります。
ここで、プリAPB1分周比1がクロック周波数である場合に分周比で割った共通のタイマクロック周波数は、APB1を決定し、クロック周波数は、共通タイマAPB1に等しい倍さもなければAPB1クロックです。
クロックソース
クロックソース、カウントしなければならないタイマーを達成するために、内部クロックから、実質的に唯一のタイマクロックを、汎用タイマーおよび高度な制御は、他のタイマースタンバイモードからの外部クロック・ソースまたは直接を選択することができます。私たちは、すべてのタイマーのTIMPREビットクロック周波数を設定RCC専用クロック・レジスタ(RCC_DCKCFGR)を設定することができ、我々は一般的に、ビット0のデフォルト値に設定ので、テーブル選択可能90MHzの最大のタイマクロック、すなわち、基本的なタイマー内部クロック90MHzのの(CK_INT)周波数。ベーシック・タイマは、内部クロックを使用することができ TIM6 TIM7制御1(TIMx_CR1)CEN位置1、ベーシック・タイマが開始されると、クロック・ソースを登録し、プリスケーラがCK_INTである場合、および。高度クロックソース制御汎用タイマー等、外部クロックコントローラ、タイマー、他のパターン、より複雑に来ることができるため。
関数の使用SystenInitの初期化は、クロック周波数のそれぞれは、以下の通りである:
SYSCLK = 72M
AHBクロック72M =
APB1クロック= 36M
APB1分割係数= AHB / APB1 = 2 SO
クロック周波数は、それによって利用可能なCK_INT 2 * 36M = 72Mです。
与えることを算出したPSCプリスケーラを通過するため、最終的な周波数カウンタの必要性
カウンター
基本的なタイマカウント処理は三つの主要れるレジスタの内容、必要とするカウンタ(TIMx_CNTとして)登録、プリスケーラレジスタ(TIMx_PSC) 、(TIMx_ARRで)オートリロードレジスタを、3つのレジスタは、16桁の有効数字、すなわち、あります値は0から65535まで設定することができます。
タイマー期間が計算されます
メイン時刻によって生成されたタイミングイベントTIMx_PSCとTIMx_ARRは、 2つのレジスタ値、タイマーの即ち期間を決定しました。例えば、我々は、2つの特定のレジスタの値がどのように設定するには、タイマー1秒のサイクルを必要としますか?
0 TIMx_CNTから数えたときに仮定、我々値9999を登録TIMx_ARR最初のセットは、すなわち、ちょうどこの時のクロックソースが正確1Sタイミング期間において100USの期間を得ることがあれば、次いで、生成されたイベント9999 10,000カウントの合計に等しいです。
次の質問を配置のでレジスタ値TIMx_PSC CK_CNT出力100US期間(10000Hz)クロックということです。CK_PSCプリスケーラ入力クロックは、プリスケーラ値(9000から1)を満足することができるように、90MHzのです。
詳細なタイマ初期化構造
typedef struct
{
uint16_t TIM_Prescaler; // 预分频器
uint16_t TIM_CounterMode; // 计数模式
uint32_t TIM_Period; // 定时器周期
uint16_t TIM_ClockDivision; // 时钟分频
uint8_t TIM_RepetitionCounter; // 重复计算器
} TIM_TimeBaseInitTypeDef;
(1)TIM_Prescaler:タイマプリスケーラは、クロックプリスケーラレジスタTIMx_PSCの値を設定し、ソース・クロック・タイマーであり、これを介して、提供されます。0〜65535で設定することができ、1から65536部門が達成しました。なぜ、プリスケーラに従事するシステム・クロック周波数が速すぎるので、それはほとんどの人がそう除算、非常に高速タイマーを立って、タイマーに彼のクロック周波数を任せることはできないことを、90MHzのああ、あります少し少なめに、より多くの何もありません。
(2)TIM_CounterMode:タイマカウントが、配向モードの三種類の中心ダウンカウントアップし、カウントしました。基本的なタイマーはすなわちのみTIMx_CNTは、0からインクリメントされ、初期化する必要はない、だけカウントアップされます。
(3)TIM_Period:タイマー期間は、実際の値は自動的にリロードシャドウレジスタイベント発生に、更新を登録するために設定されています。これは、0〜65535の範囲で設定することができます。
自動リロードレジスタ値:たとえば、あなたは彼を排出した後、水で満たされたバケツ内の水をオンにしたいです。どのくらいの水需要を超える水が行うには?設定値、ドロップドロップドロップが100,000を超えていた彼を与える、それが排水取ります。排水後10,000滴が、排出した後、充填されたリセットドロップ...
(4)TIM_ClockDivision:クロック周波数は、クロックタイマー設定CK_INTデジタルフィルタのサンプリングクロック周波数と分周比は、この機能は、基本的なタイマーではありません設定されていません。
(5)TIM_RepetitionCounter:リピートカウンタ、レジスタが非常に容易にPWM出力の数を使用して制御することができる高度な制御専用レジスタ・ビットです。ここで設定されていません。
プログラムの設定
汎用タイマー設定、及び(TIM3の例では)次のステップに分け、対応する割り込みを生成します
- TIM3クロックが有効
- TIM3_ARRと設定値TIM3_PSC
- セットTIM3_DIERは、割り込みの更新を許可しました
- TIM3の労働許可証
- グループの設定割り込みTIM3
- 割り込みサービスルーチンを書きます
void TIM3_Int_Init()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
TIM_TimeBaseStructure.TIM_Prescaler =7199; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率
TIM_TimeBaseStructure.TIM_Period = 4999; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_ITConfig(TIM3, TIM_IT_Update,ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIMx外设
}
あなたはAPB1バス周辺機器属しタイマー、基本的なタイマーを使用する前に、タイマクロックをオンにする必要があります。APB1周辺バスクロック= 72M。
我々は自動的にリロードクロックを設定するタイマ値レジスタ4999 ARR設けPSCクロックプリスケーラレジスタ値7199、カウンタの駆動:CK_CNT = APB1Periph /(7199 + 1)= 72M / 7200 = 10K、 1 / CK_CNT = 0.0001s = 0.1ms:時間カウンタに等しい = 100US、 0から4999までカウントは、割り込みは、割り込み時間の時間を発生した場合:100US 5000 0.0001s = 5000 = 0.5秒= 500msのは半分秒です。
void TIM3_IRQHandler(void) //TIM3中断
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源
LED1=!LED1;
}
}
TIM3割り込みフラグをクリアした場合TIM3は、割り込みが発生したかどうかを判断するためにif文、TIM_GetITStatus()関数で起動するには、この割り込みサービス・ルーチンは、割り込みが発生します。LED1が逆に点灯しましょう。
int main(void)
{
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2
LED_Init(); //初始化与LED连接的硬件接口
TIM3_Int_Init(); //10Khz的计数频率,计数到5000为500ms
while(1)
{
LED0=!LED0;
delay_ms(200);
}
}
まず、優先パケット2割り込み遅延機能初期化の主な機能は、LEDに接続されたハードウェア・インタフェースを初期化し、タイマ3が初期化されます。これまでのところ、LED0は0.5秒ごとについて反転します。同時に、我々はLED1灯機能は、比較を行うためにそれを反転しながら、0.2秒で比較を行う必要があります。
今、私たちはLED0が0.2msのは、それを反転されていないかどうかを確認するためにKeil社のシミュレーションを使用し、LED1は0.5msのは、それを反転です。
デバッグツール1.設定のKeil社のシミュレーション。
2.試運転、デバッグインタフェース、オープンロジック解析ウィンドウ、および設定PWM出力ピン入力した後、
フルスピードで3. [実行]を、オシロスコープ観測
明確LED0が0.5msのは、一度反転している見ることができます。
4.別の構成LED1同様と反転0.2msの、同じコンフィギュレーション・プログラムについてであることが判明。
概要:主に分周比とリロード値をクリアするとき、私たちは、タイマーを使用しています。2つの決定したが、あなたはタイマー、タイマー機能を使用したいなら、あなたが他のSTM32をしたいどのくらいのタイミングで、その後ブレイクして、それはライン上でコードを書くために直接割り込みサービス機能の内部には、適切な処置を行う必要があるどのくらいのタイミングあまりにも、ライン上の応答のあなたのサービス機能に直接何かをやっています。タイマーとカウンタ、タイマ、ああカウンタがあります。あなたある程度オーバーフローの最初のカウント、カウントが達成されていないが、それをタイミング?初心者のように、もつれません。