1. 程式人生 > 其它 >二__一、stm32 TIM2 重對映

二__一、stm32 TIM2 重對映

技術標籤: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); }