STM32研究ノート(12)

STM32F103ZET6タイマー割り込み実験



序文

STM32の学習は3つのバージョンに分けることができます。
1.登録バージョン
2.ライブラリ関数バージョン
3.HALライブラリバージョン
個人的な理由により、STM32を学習するためにライブラリ関数バージョンを選択します。


ヒント:ソフトウェアのインストールなどの問題は説明されません!

1.タイマーの基本原理

1.リソースの紹介

ここに画像の説明を挿入
ここに画像の説明を挿入

2.一般的なタイマー機能

ここに画像の説明を挿入
ここに画像の説明を挿入

3.カウントモードの概要

ここに画像の説明を挿入

4.動作原理

ここに画像の説明を挿入

2.関連レジスタ

1.制御レジスタ1(TIMx_CR1)

ここに画像の説明を挿入

2. DMA /割り込みイネーブルレジスタ(TIMx_DIER)

ここに画像の説明を挿入

3.プリスケーラレジスタ(TIMx_PSC)

ここに画像の説明を挿入

4.自動リロードレジスタ(TIMx_ARR)

ここに画像の説明を挿入

5.向流値レジスタ(TIMx_CNT)

ここに画像の説明を挿入

3つの操作手順

1.オーバーフロー時間の計算

ここに画像の説明を挿入

ここに画像の説明を挿入

2.操作手順

ここに画像の説明を挿入

第四に、プログラムのソースコード

1.timer.h

コードは次のように表示されます。

#ifndef __TIMER_H
#define __TIMER_H

#include "sys.h"

void TIM3_Int_Init(u16 arr,u16 psc);

#endif

2.timer.c

コードは次のように表示されます。

#include "timer.h"
#include "led.h"

void TIM3_Int_Init(u16 arr,u16 psc)
{
    
    
	TIM_TimeBaseInitTypeDef IM_TimeBaseInitstr;
	NVIC_InitTypeDef NVIC_Initstr;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//定时器时钟使能
	
	IM_TimeBaseInitstr.TIM_Period=arr;
	IM_TimeBaseInitstr.TIM_Prescaler=psc;
	IM_TimeBaseInitstr.TIM_CounterMode=TIM_CounterMode_Up;
	IM_TimeBaseInitstr.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInit(TIM3, &IM_TimeBaseInitstr);//初始化时钟
	
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//开启定时器中断
	
	NVIC_Initstr.NVIC_IRQChannel=TIM3_IRQn;
	NVIC_Initstr.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Initstr.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_Initstr.NVIC_IRQChannelSubPriority=2;
	NVIC_Init(&NVIC_Initstr);//配置NVIC
	
	TIM_Cmd(TIM3, ENABLE);//使能定时器
}
void TIM3_IRQHandler(void)//中断服务函数
{
    
    
	if(TIM_GetITStatus(TIM3, TIM_IT_Update)==SET)
	{
    
    
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除更新中断标志
		LED1=!LED1;
	}
}

3.main.c

コードは次のように表示されます。

#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "beep.h"
#include "key.h"
#include "timer.h"

int main(void)
{
    
    
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	delay_init();
    LED_Init();
	Beep_Init();
	KEY_Init();
	TIM3_Int_Init(4999,7199);//间隔500ms
	while(1)
	{
    
    
		LED2=!LED2;
		delay_ms(200);
	}
}

5.実験結果

LED1ステータス反転、間隔500ms;(タイマー)
LED2ステータス反転、間隔200ms;(遅延)


総括する

付着する!

おすすめ

転載: blog.csdn.net/weixin_44935259/article/details/112812487