原文鏈接:https://blog.csdn.net/abcvincent/article/details/95250994
當要控制步進電機或其他通過控制器輸入脈衝控制電機的時候,需要能根據需求調整的脈衝數量等;STM32中發出脈衝一般有兩種方式:1)利用定時中斷輸出脈衝,但是間隔的延時會影響其他主程序的進程,當控制多個電機的時候就非常不可取;2)利用PWM脈寬調製,並通過主從定時器進行設定,好處是不佔用主程序時鐘,且能精準控制;
主從模式主要設置如下幾個函數,比如設置定時器1爲主,定時器1爲從的時候:
///*///////定時器3主模式設置///////*/
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
//設置或者重置 TIMx 主/從模式
//TIMx: x 可以是 2, 3 或者 4,來選擇 TIM 外設
//TIM_MasterSlaveMode:定時器主/從模式,TIM 主/從模式使能
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
//選擇 TIMx 觸發輸出模式
//TIMx: x 可以是 2, 3 或者 4,來選擇 TIM 外設
//TIM_TRGOSource:觸發輸出模式
//TIM_TRGOSource_Update:使用更新事件作爲觸發輸出
///*///////定時器1從模式設置///////*/
TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);//TIM3主連接TIM1,TIM_TS_ITR2
TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_External1);// 等同 TIM1->SMCR|=0x07 //設置從模式寄存器
// TIM2->SMCR|=0x07;
其中/TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);中的參數需要注意,參考手冊查對應的可用連接,如下:
如上必須選擇對應的ITR參數;
下面貼出代碼:
其中在主函數main.c,循環前加如下代碼即可,代表產生1KH的PWM,8K脈衝後停止 :
Pulse_output(1000,8000);//1KHZ,8000個脈衝
對應的頭文件中添加如下:
void Pulse_output(u32 Cycle,u32 PulseNum);//入口函數
void TIM1_config(u32 Cycle);//1爲主模式
void TIM2_config(u32 PulseNum);//2爲從模式
//void TIM3_config(u32 PulseNum);//3爲主模式
//void TIM4_config(u32 Cycle);//4爲從
//void TIM3_config(u32 PulseNum);//3爲從模式
//void TIM4_config(u32 Cycle);//4爲主模式
//void TIM1_config(u32 PulseNum);//1爲從模式
//void TIM3_config(u32 Cycle);//3爲主模式
1)/***定時器1主模式,定時器2從模式***/
/***定時器1主模式,定時器2從模式***/
void TIM1_config(u32 Cycle)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO設置,創建結構體
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定時器設置結構體
TIM_OCInitTypeDef TIM_OCInitStructure; //pwm波對應設置結構體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_TIM1 , ENABLE); //開啓時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11; //TIM1_CH4 PA11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //複用推輓輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = Cycle-1;
TIM_TimeBaseStructure.TIM_Prescaler =71; //設置用來作爲TIMx時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS= Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; //重複計數,一定要=0!!!
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //裝載
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈衝寬度調製模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_Pulse = Cycle/2-1; //設置待裝入捕獲寄存器的脈衝值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //裝載通道1,PA8
TIM_OC2Init(TIM1, &TIM_OCInitStructure); //裝載通道2,PA9,被串口占用
TIM_OC4Init(TIM1, &TIM_OCInitStructure); //裝載通道4,PA11
TIM_SelectMasterSlaveMode(TIM1, TIM_MasterSlaveMode_Enable);
//設置或者重置 TIMx 主/從模式
//TIMx: x 可以是 2, 3 或者 4,來選擇 TIM 外設
//TIM_MasterSlaveMode:定時器主/從模式,TIM 主/從模式使能
TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);
//選擇 TIMx 觸發輸出模式
//TIMx: x 可以是 2, 3 或者 4,來選擇 TIM 外設
//TIM_TRGOSource:觸發輸出模式
//TIM_TRGOSource_Update:使用更新事件作爲觸發輸出(TRGO)
// TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能或者失能 TIMx 在 CCR3 上的預裝載寄存器
// TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); //使能或者失能 TIMx 在 CCR3 上的預裝載寄存器
TIM_ARRPreloadConfig(TIM1, ENABLE); // 使能或者失能 TIMx 在 ARR 上的預裝載寄存器
//允許或禁止在定時器工作時向ARR的緩衝器中寫入新值,以便在更新事件發生時載入覆蓋以前的值
}
/***定時器2從模式***/
void TIM2_config(u32 PulseNum)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //對應結構體聲明
NVIC_InitTypeDef NVIC_InitStructure; //NVIC 對應結構體聲明
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_TimeBaseStructure.TIM_Period = PulseNum-1;
TIM_TimeBaseStructure.TIM_Prescaler =0;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);//選擇 TIMx 輸入觸發源,TIM 內部觸發 0
TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_External1 );// 等同 TIM2->SMCR|=0x07 //設置從模式寄存器
// TIM2->SMCR|=0x07; //設置從模式寄存器
TIM_ITConfig(TIM2,TIM_IT_Update,DISABLE); //
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//入口設定函數
void Pulse_output(u32 Cycle,u32 PulseNum)
{
TIM2_config(PulseNum);//裝載
TIM_Cmd(TIM2, ENABLE);//使能
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);//清除TIMx 的中斷待處理位
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //使能或者失能指定的 TIMx 中斷
TIM1_config(Cycle); //裝載
TIM_Cmd(TIM1, ENABLE);//使能
TIM_CtrlPWMOutputs(TIM1, ENABLE); //高級定時器一定要加上,主輸出使能
}
//中斷處理函數
void TIM2_IRQHandler(void)
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) // TIM_IT_CC1
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); // 清除中斷標誌位
TIM_CtrlPWMOutputs(TIM1, DISABLE); //主輸出使能
TIM_Cmd(TIM1, DISABLE); // 關閉定時器
TIM_Cmd(TIM2, DISABLE); // 關閉定時器
TIM_ITConfig(TIM2, TIM_IT_Update, DISABLE);
}
}
2)/***定時器3主模式,定時器1從模式***/,這個代碼由於是高級定時器1爲從稍有不同
//定時器3主模式,定時器1從模式
//PWM輸出
void TIM3_config(u32 Cycle)
{
GPIO_InitTypeDef GPIO_InitStructure;//GPIO設置,創建結構體
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定時器設置結構體
TIM_OCInitTypeDef TIM_OCInitStructure; //pwm波對應設置結構體
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //開啓時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //開啓時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //TIM_CH1和T
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //複用推輓輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = Cycle-1;
TIM_TimeBaseStructure.TIM_Prescaler =71; //設置用來作爲TIMx時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS= Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈衝寬度調製模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_Pulse = Cycle/2-1; //設置待裝入捕獲寄存器的脈衝值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //通道
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //通道
///*///////定時器3主模式設置///////*/
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
//設置或者重置 TIMx 主/從模式
//TIMx: x 可以是 2, 3 或者 4,來選擇 TIM 外設
//TIM_MasterSlaveMode:定時器主/從模式,TIM 主/從模式使能
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
//選擇 TIMx 觸發輸出模式
//TIMx: x 可以是 2, 3 或者 4,來選擇 TIM 外設
//TIM_TRGOSource:觸發輸出模式
//TIM_TRGOSource_Update:使用更新事件作爲觸發輸出
///*///////定時器1從模式設置///////*/
TIM_SelectInputTrigger(TIM1, TIM_TS_ITR2);//TIM3主連接TIM1,TIM_TS_ITR2
TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_External1);// 等同 TIM1->SMCR|=0x07 //設置從模式寄存器
// TIM2->SMCR|=0x07;
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //通道1使能
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //通道2使能
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能或者失能 TIMx 在 ARR 上的預裝載寄存器
}
/***定時器1從模式***/
void TIM1_config(u32 PulseNum)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//TIMx初始化結構體
NVIC_InitTypeDef NVIC_InitStructure; //NVIC結構體
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1 , ENABLE); //使能TIM1時鐘
TIM_TimeBaseStructure.TIM_Period = PulseNum-1; //設置自動重裝載週期值
TIM_TimeBaseStructure.TIM_Prescaler =0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//tim1必須加這句不然沒反應
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //
TIM_ITConfig(TIM1,TIM_IT_Update,DISABLE); //使能中斷
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn ; //全局中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
//入口函數
void Pulse_output(u32 Cycle,u32 PulseNum)
{
TIM1_config(PulseNum);
TIM_Cmd(TIM1, ENABLE);
TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
TIM3_config(Cycle);
TIM_Cmd(TIM3, ENABLE);
}
//中斷函數
void TIM1_UP_IRQHandler(void)//tim的中斷函數比較特殊,注意區別比其他多個UP
{
if (TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) // TIM_IT_CC1
{
TIM_ClearITPendingBit(TIM1,TIM_IT_Update); // 清除中斷標誌位
TIM_CtrlPWMOutputs(TIM1, DISABLE); //主輸出使能
TIM_Cmd(TIM3, DISABLE); // 關閉定時器
TIM_Cmd(TIM1, DISABLE); // 關閉定時器
TIM_ITConfig(TIM1, TIM_IT_Update, DISABLE); //關閉
}
}
3)/***定時器3主模式,定時器4從模式***/
//定時器3主模式,定時器4從模式
//PWM輸出
void TIM3_config(u32 Cycle)
{
GPIO_InitTypeDef GPIO_InitStructure;//GPIO設置,創建結構體
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定時器設置結構體
TIM_OCInitTypeDef TIM_OCInitStructure; //pwm波對應設置結構體
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //開啓時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //開啓時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; //TIM_CH1和T
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //複用推輓輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = Cycle-1;
TIM_TimeBaseStructure.TIM_Prescaler =71; //設置用來作爲TIMx時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS= Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈衝寬度調製模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_Pulse = Cycle/2-1; //設置待裝入捕獲寄存器的脈衝值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //通道
TIM_OC2Init(TIM3, &TIM_OCInitStructure); //通道
/*///////定時器3主模式設置///////*/
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
//設置或者重置 TIMx 主/從模式
//TIMx: x 可以是 2, 3 或者 4,來選擇 TIM 外設
//TIM_MasterSlaveMode:定時器主/從模式,TIM 主/從模式使能
TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);
//選擇 TIMx 觸發輸出模式
//TIMx: x 可以是 2, 3 或者 4,來選擇 TIM 外設
//TIM_TRGOSource:觸發輸出模式
//TIM_TRGOSource_Update:使用更新事件作爲觸發輸出(TRG
/*///////定時器4從模式設置///////*/
TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);//TIM3主連接TIM4,TIM_TS_ITR2
TIM_SelectSlaveMode(TIM4,TIM_SlaveMode_External1);// 等同 TIM2->SMCR|=0x07 //設置從模式寄存器
// TIM2->SMCR|=0x07;
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); //通道1使能
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //通道2使能
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能或者失能 TIMx 在 ARR 上的預裝載寄存器
}
/***定時器4從模式***/
void TIM4_config(u32 PulseNum)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_TimeBaseStructure.TIM_Period = PulseNum-1; //設置自動重裝載週期值
TIM_TimeBaseStructure.TIM_Prescaler =0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
// TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);//TIM3主連接TIM4,TIM_TS_ITR2
// TIM_SelectSlaveMode(TIM4,TIM_SlaveMode_External1);// 等同 TIM2->SMCR|=0x07 //設置從模式寄存器
// // TIM2->SMCR|=0x07;
TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; //全局中斷
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void Pulse_output(u32 Cycle,u32 PulseNum)
{
TIM4_config(PulseNum);
TIM_Cmd(TIM4, ENABLE);
TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
TIM3_config(Cycle);
TIM_Cmd(TIM3, ENABLE);
}
void TIM4_IRQHandler(void)
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) // TIM_IT_CC1
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update); // 清除中斷標誌位
TIM_CtrlPWMOutputs(TIM4, DISABLE); //主輸出使能
TIM_Cmd(TIM3, DISABLE); // 關閉定時器
TIM_Cmd(TIM4, DISABLE); // 關閉定時器
TIM_ITConfig(TIM4, TIM_IT_Update, DISABLE);
}
}
4)/***定時器4主模式,定時器3從模式***/
//定時器4主模式,定時器3從模式
//PWM輸出
void TIM4_config(u32 Cycle)
{
GPIO_InitTypeDef GPIO_InitStructure;//GPIO設置,創建結構體
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//定時器設置結構體
TIM_OCInitTypeDef TIM_OCInitStructure; //pwm波對應設置結構體
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //開啓時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //開啓時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM2_CH2 PB7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //複用推輓輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = Cycle-1;
TIM_TimeBaseStructure.TIM_Prescaler =71; //設置用來作爲TIMx時鐘頻率除數的預分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //設置時鐘分割:TDTS= Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上計數模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //選擇定時器模式:TIM脈衝寬度調製模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_Pulse = Cycle/2-1; //設置待裝入捕獲寄存器的脈衝值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性
TIM_OC2Init(TIM4, &TIM_OCInitStructure);
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);
TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Update);
TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM4, ENABLE);
}
/***定時器3從模式***/
void TIM3_config(u32 PulseNum)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseStructure.TIM_Period = PulseNum-1; //設置自動重裝載週期值
TIM_TimeBaseStructure.TIM_Prescaler =0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);
TIM_SelectSlaveMode(TIM3,TIM_SlaveMode_External1 );// 等同 TIM2->SMCR|=0x07 //設置從模式寄存器
// TIM2->SMCR|=0x07;
TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void Pulse_output(u32 Cycle,u32 PulseNum)
{
TIM3_config(PulseNum);
TIM_Cmd(TIM3, ENABLE);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM4_config(Cycle);
TIM_Cmd(TIM4, ENABLE);
}
void TIM3_IRQHandler(void)
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) // TIM_IT_CC1
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中斷標誌位
TIM_CtrlPWMOutputs(TIM3, DISABLE); //主輸出使能
TIM_Cmd(TIM4, DISABLE); // 關閉定時器
TIM_Cmd(TIM3, DISABLE); // 關閉定時器
TIM_ITConfig(TIM3, TIM_IT_Update, DISABLE);
}
}