天天看點

STM32F407--通用定時器通用定時器

通用定時器

通用定時器溢出中斷

通用定時器 反轉輸出

定時器配置檔案

// TIM4_ch1_PD12   定時器4_通道1

// 映射 在引腳  PD12 上面


void Tim4_ch1_PD12_AF()
{
	GPIO_InitTypeDef     GPIO_InitStructure;         //基本引腳結構體
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);   //引腳時鐘結構體初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;        //引腳 PD12
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;     //複用到TIM4 通道1上面。
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;   //推挽輸出  
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //翻轉速度100M
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;  //上拉
	GPIO_Init(GPIOD, &GPIO_InitStructure);        //初始化GPIO 
	GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);   //複用配置 
}


void  Tim4_ch1_init()
{
	TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;   //定時器基本結構體
	TIM_OCInitTypeDef   TIM_OCInitStructure;           //定時器比較輸出結構體
	NVIC_InitTypeDef    NVIC_InitStructure;            //中斷配置結構體

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);  //定時器4的時鐘
    Tim4_ch1_PD12_AF();

	TIM_TimeBaseStructure.TIM_Period =0xffff;    //設定在下一個更新事件裝入活動的自動重裝載寄存器周期的值	 
	TIM_TimeBaseStructure.TIM_Prescaler =84-1;   //設定用來作為TIMx時鐘頻率除數的預分頻值  不分頻   168M
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計數模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根據TIM_TimeBaseInitStruct中指定的參數初始化TIMx的時間基數機關



	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Toggle;     // 比較輸出模式:反轉輸出
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;   //比較輸出使能
	TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Disable;   //互補比較使能
    TIM_OCInitStructure.TIM_Pulse=0xffff;  //脈沖寬度
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;    //輸出極性為高
	TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;   //指定空閑狀态下的TIM輸出比較pin狀态
	TIM_OC1Init(TIM4, &TIM_OCInitStructure);             //根據TIM_OCInitStruct中指定的參數初始化外設TIMx	

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); 
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; 
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);



	TIM_OC1FastConfig(TIM4,TIM_OCFast_Enable);           //快速比較使能
	TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Disable);    //禁止TIM1在CCR上的預裝載寄存器,這裡很重要不要使能啊
	TIM_CCxCmd(TIM4,TIM_Channel_1,TIM_CCx_Enable);       //啟用TIM捕獲比較通道x。
	TIM_ITConfig(TIM4, TIM_IT_CC1,ENABLE);               //啟用指定的TIM中斷。

	TIM_Cmd(TIM4, ENABLE);                     //使能TIM1
}





int tim_count = 0;
void TIM4_IRQHandler(void)   
{
	if(  TIM_GetITStatus( TIM4 , TIM_IT_CC1) != RESET)
	{ 
		TIM_ClearITPendingBit(TIM4,TIM_IT_CC1);
		tim_count=TIM_GetCapture1(TIM4);   		//得到通道1的計數數值。
		TIM_SetCompare1(TIM4,tim_count+1000);  	//設定新的CCR 值,新的比較數值。
	}
}






           

主函數

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//設定系統中斷優先級分組2
	delay_init(168);  //初始化延時函數
	LED_Init();				//初始化LED端口
  uart_init(115200);

  Tim4_ch1_init();   //隻是這裡一句即可!!!!

	while(1)
	{
		LED0=!LED0;//DS0翻轉
		delay_ms(2);//延時200ms
	};
}

           
STM32F407--通用定時器通用定時器

通用定時器産生PWM