通用定時器
通用定時器溢出中斷
通用定時器 反轉輸出
定時器配置檔案
// 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
};
}
通用定時器産生PWM