STM32 重新理解GPIO配置以及配置PWM波輸出
阿新 • • 發佈:2019-02-16
最近做了個SD卡BOOTLOARDER程式。在測試過程中,想到可以利用板子的LED燈進行螢火蟲燈的製作,通過BOOTLOARDER將APP檔案下載到板子裡面檢視LED燈的閃爍。可能是因為太過自信,這麼個小程式能搞不定,所以並沒有仔細閱讀DATASHEET,導致最終費了半天時間才查出原因。
此為引子,便有了這篇文章。
我的板子LED燈引腳為PB5,引腳功能為:
該引腳TIM3_CH2為REMAP功能,引腳配置如下:
GPIO_InitTypeDef GPIO_InitStructure; /*配置時鐘*/ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能TIM3時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE); //使能GPIOB以及複用功能時鐘 /*配置PB5引腳*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB5複用為TIM3的通道2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); /*TIM3區域性複用功能開啟 在TIM3的區域性複用開啟時,PB5會被複用為TIM3_CH2*/ GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3 , ENABLE);
在定時器重對映說明中查到TIM3_CH2在PB5中是部分重對映,所以使用GPIO_PartialRemap_TIM3:
/*------------------------------------------------------------------- TIM3CLK=72MHz 預分頻係數Prescaler=2 經過分頻 定時器時鐘為24MHz 根據公式 通道輸出佔空比=TIM3_CCR2/(TIM_Period+1),可以得到TIM_Pulse的計數值 捕獲/比較暫存器2 TIM3_CCR2= CCR2_Val -------------------------------------------------------------------*/ TIM3_TimeBaseStructure.TIM_Prescaler = 2; //預分頻器TIM3_PSC=3 TIM3_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //計數器向上計數模式 TIM3_CR1[4]=0 TIM3_TimeBaseStructure.TIM_Period =24000; //自動重灌載暫存器TIM3_APR 確定頻率為1KHz TIM3_TimeBaseStructure.TIM_ClockDivision = 0x0; //時鐘分頻因子 TIM3_CR1[9:8]=00 TIM3_TimeBaseStructure.TIM_RepetitionCounter = 0x0; TIM_TimeBaseInit(TIM3,&TIM3_TimeBaseStructure); //寫TIM3各暫存器引數 TIM3_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2 TIM3_CCMR1[14:12]=111 在向上計數時, //一旦TIMx_CNT<TIMx_CCR1時通道1為無效電平,否則為有效電平 TIM3_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //輸入/捕獲2輸出允許 OC2訊號輸出到對應的輸出引腳PB5 TIM3_OCInitStructure.TIM_Pulse = CCR2_Val; //確定佔空比,這個值決定了有效電平的時間。 TIM3_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性 低電平有效 TIM3_CCER[5]=1; TIM_OC2Init(TIM3, &TIM3_OCInitStructure); TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); TIM_Cmd(TIM3,ENABLE); //啟動定時器3 TIM3_CR1[0]=1;
至此,各配置結束,以下只要配置系統時鐘,使其在一定時間間隔中斷,改變佔空比。