二__一、stm32 TIM2 重對映
阿新 • • 發佈:2020-12-30
技術標籤:32
stm32 TIM2 重對映
設定TIM2埠時候,先在手冊中查詢 TIM2_CH埠配置:
在手冊中可以看到:
stm32的TIM2的埠使用組合有下面四種:
1.當不重對映時,預設TIM2四個的IO口是PA0、PA1、PA2、PA3
2.要使用PA15、PB3、PA2、PA3的埠組合,要呼叫下面的語句進行部分重對映:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //重對映必須要開AFIO時鐘
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE);
3.要使用PA0、PA1、PB10、PB11的埠組合,要呼叫下面的語句進行部分重對映:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //重對映必須要開AFIO時鐘
GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2, ENABLE);
4.要使用PA15、PB3、PB10、PB11的埠組合,要呼叫下面的語句進行完全重對映:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //重對映必須要開AFIO時鐘
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
同時還要禁用JTAG功能,PA15、PB3、PB10、PB11才會正常輸出。
完全對映埠配置函式:
/**************************************************************************
函式功能:把TIM2初始化為編碼器介面模式
入口引數:無
返回 值:無
**************************************************************************/
void Encoder_Init_TIM2(u16 arr,u16 psc)//CH1-PA15 CH2-PB3 CH3-PB10 CH4-PB11 重對映
{
//1) 定義相關結構體:
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
//2) 使能相關時鐘:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// 需要使能AFIO時鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);//使能定時器2的時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PA埠時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//使能PB埠時鐘
GPIO_PinRemapConfig(GPIO_FullRemap_TIM2, ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //禁止JTAG功能,把PB3,PB4作為普通IO口使用
//3) 初始化 GPIO:(用於AB相,脈衝計數)
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; //埠配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據設定引數初始化GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //埠配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空輸入
GPIO_Init(GPIOB, &GPIO_InitStructure); //根據設定引數初始化GPIOB
//4) 設定並初始化定時器 TIM2:
TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
TIM_TimeBaseStructure.TIM_Prescaler = psc; // 預分頻器
TIM_TimeBaseStructure.TIM_Period = arr; //設定計數器自動重灌值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//選擇時鐘分頻:不分頻
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;TIM向上計數
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
//5) 設定並初始化定時器編碼器:
TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);//使用編碼器模式3
TIM_ICStructInit(&TIM_ICInitStructure);
TIM_ICInitStructure.TIM_ICFilter = 10;
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_ClearFlag(TIM2, TIM_FLAG_Update);//清除TIM的更新標誌位
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
//Reset counter
TIM_SetCounter(TIM2,0);
//6) 使能定時器:
TIM_Cmd(TIM2, ENABLE);
}