【藍橋杯嵌入式】4_TIM

1、定時器中斷

定時器的分類:
在這裏插入圖片描述
通用定時器框圖:
在這裏插入圖片描述
定時器和總線對應關係:
在這裏插入圖片描述
實驗:在LCD屏幕上每秒滾動顯示字符。

配置步驟:
(1)、TIM3 時鐘使能。
(2)、初始化定時器參數,設置自動重裝值,分頻係數,計數方式等
(3)、設置 TIM3_DIER 允許更新中斷。
(4)、TIM3 中斷優先級設置。
(5)、允許 TIM3 工作,也就是使能 TIM3。
(6)、編寫中斷服務函數。

TIM.c:

#include "Headfile.h"
u8 TimCount = 0;
//Tout = (ARR+1)(PSC+1)/Tclk 時間計算公式
void Timer3InteruptInit(u16 arr, u16 psc){
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	//(1)、TIM3 時鐘使能。
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3時鐘
	//(2)、初始化定時器參數,設置自動重裝值,分頻係數,計數方式等
	TIM_TimeBaseInitStructure.TIM_Period = arr;//自動重裝值
	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;//分頻係數
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//計數方式
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//設置時鐘分割
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	//(3)、設置 TIM3_DIER 允許更新中斷。
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
	//(4)、TIM3 中斷優先級設置。
	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寄存器
	//(5)、允許 TIM3 工作,也就是使能 TIM3。
	TIM_Cmd(TIM3,ENABLE);
	
}
//(6)、編寫中斷服務函數。
void TIM3_IRQHandler(void){
	if(TIM_GetFlagStatus(TIM3,TIM_FLAG_Update) == SET){
		TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
	}
	TimCount ++;
	LCD_DisplayStringLine(Line4 ,&(TimCount));
	
}



main.c:

#include "Headfile.h"

//Main Body
int main(void)
{
	SysTick_Config(SystemCoreClock/1000);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	Timer3InteruptInit(9999,7199);//1s
	LEDInit();
	Delay_Ms(100);
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	LCD_DisplayStringLine(Line4 ,(unsigned char *)"    Hello,world.   ");
	LCD_Clear(Blue);
	

	while(1);
}


2、定時器輸出PWM

TIM3重映射表:
在這裏插入圖片描述
兩種PWM_OC_MODE:
PWM1模式:向上計數時,一旦TIMx_CNT<TIMx_CCR3時通道3爲有效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR1時通道3爲無效電平。
則爲有效電平(OC1REF=1)。
PWM2模式:在向上計數時,一旦TIMx_CNT<TIMx_CCR3時通道3爲無效電平;在向下計數時,一旦TIMx_CNT>TIMx_CCR3時通道3爲有效電平。
(有效電平是高電平還是低電平可以在TIM_OCPolarity設置。)

下面是PWM2模式(有效電平是高電平)示意圖:
在這裏插入圖片描述

實驗:LD1、LD2(PC8、PC9)呼吸燈交替閃爍。

配置步驟:
(1)開啓 TIM3 時鐘以及複用功能時鐘,配置 PB8、PB9 爲複用輸出。
(2)、設置 TIM3_CH3 TIM3_CH4 重映射到 PB8、PB9 上。
(3)、初始化 TIM3,設置 TIM3 的 ARR 和 PSC。
(4)、設置 TIM3_CH3(4) 的 PWM 模式,使能 TIM3 的 CH3 (4)輸出。
(5)、修改 TIM3_CCR3、TIM3_CCR4 來控制佔空比。

TIM.c:

#include "Headfile.h"

void Timer3PWMInit(u16 arr, u16 psc){
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	//(1)開啓 TIM3 時鐘以及複用功能時鐘,配置 PB8、PB9 爲複用輸出。
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3時鐘
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOC,ENABLE);
	//(2)、設置 TIM3_CH3  TIM3_CH4 重映射到 PB8、PB9 上。
	GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//通過Datasheet可知PC8和PC9對應TIM3PWM輸出爲完全重映射
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOC,&GPIO_InitStructure);
	
	//(3)、初始化 TIM3,設置 TIM3 的 ARR 和 PSC。
	TIM_TimeBaseInitStructure.TIM_Period = arr;
	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	//PC8 PWM輸出設置TIM3_CH3
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;							//PWM輸出模式
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//比較輸出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;			//輸出極性高
	TIM_OC3Init(TIM3,&TIM_OCInitStructure);												
	//(4)、設置 TIM3_CH3 的 PWM 模式,使能 TIM3 的 CH3 輸出。
	TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);
	//PC9 PWM輸出設置TIM3_CH4
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
	TIM_OC4Init(TIM3,&TIM_OCInitStructure);
	//(4)、設置 TIM3_CH4 的 PWM 模式,使能 TIM3 的 CH4 輸出。
	TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);
	//
	TIM_Cmd(TIM3,ENABLE);
}


main.c:

#include "Headfile.h"

int main(void)
{
	u16 led0pwmval = 0;
	u8 dir = 1;
	SysTick_Config(SystemCoreClock/1000);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //設置NVIC中斷分組2:2位搶佔優先級,2位響應優先級
	LEDInit();
	//閃燈
	Delay_Ms(200);
	LEDCmd(Bit_SET);
	GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC) & 0x00FF);
	LEDCmd(Bit_RESET);
	Delay_Ms(200);
	LEDCmd(Bit_SET);
	GPIO_Write(GPIOC,GPIO_ReadOutputData(GPIOC) | 0xFF00);
	LEDCmd(Bit_RESET);
	//
	LEDCmd(Bit_SET);
	Timer3PWMInit(899,99);//72000000/900/1000=800Hz  ω=72MHz/arr/psc
	
//	STM3210B_LCD_Init();
//	LCD_Clear(Blue);
//	LCD_SetBackColor(Blue);
//	LCD_SetTextColor(White);
	
	
	while(1){
		
 		Delay_Ms(10);	 
		if(dir)led0pwmval++;
		else led0pwmval--;

 		if(led0pwmval>300)dir=0;
		if(led0pwmval==0)dir=1;	
		//(5)、修改 TIM3_CCR3、TIM3_CCR4 來控制佔空比。		
		TIM_SetCompare3(TIM3,led0pwmval);				//LD1
		TIM_SetCompare4(TIM3,301-led0pwmval);		//LD2
	}	 
}



3、定時器複用功能重印象表

Tips:藍橋板子上使用的是64腳。
在這裏插入圖片描述在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章