TIMER輸出PWM源代碼
由于我現(xiàn)在手上的奮斗開(kāi)發(fā)板是將PB.5接到LED上,因此需要使用TIM3的CH2通道,并且要進(jìn)行引腳重映像。打開(kāi)TIM3之后,PWM輸出,使得LED點(diǎn)亮,通過(guò)改變PWM_cfg()中的占空比可以調(diào)節(jié)LED的亮度。
#include “stm32f10x_lib.h”
void RCC_cfg();
void GPIO_cfg();
void TIMER_cfg();
void PWM_cfg();
//占空比,取值范圍為0-100
int dutyfactor = 50;
int main()
{
int Temp;
RCC_cfg();
GPIO_cfg();
TIMER_cfg();
PWM_cfg();
//使能TIM3計(jì)時(shí)器,開(kāi)始輸出PWM
TIM_Cmd(TIM3, ENABLE);
while(1);
}
void RCC_cfg()
{
//定義錯(cuò)誤狀態(tài)變量
ErrorStatus HSEStartUpStatus;
//將RCC寄存器重新設(shè)置為默認(rèn)值
RCC_DeInit();
//打開(kāi)外部高速時(shí)鐘晶振
RCC_HSEConfig(RCC_HSE_ON);
//等待外部高速時(shí)鐘晶振工作
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if(HSEStartUpStatus == SUCCESS)
{
//設(shè)置AHB時(shí)鐘(HCLK)為系統(tǒng)時(shí)鐘
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//設(shè)置高速AHB時(shí)鐘(APB2)為HCLK時(shí)鐘
RCC_PCLK2Config(RCC_HCLK_Div1);
//設(shè)置低速AHB時(shí)鐘(APB1)為HCLK的2分頻
RCC_PCLK1Config(RCC_HCLK_Div2);
//設(shè)置FLASH代碼延時(shí)
FLASH_SetLatency(FLASH_Latency_2);
//使能預(yù)取指緩存
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//設(shè)置PLL時(shí)鐘,為HSE的9倍頻 8MHz * 9 = 72MHz
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
//使能PLL
RCC_PLLCmd(ENABLE);
//等待PLL準(zhǔn)備就緒
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
//設(shè)置PLL為系統(tǒng)時(shí)鐘源
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//判斷PLL是否是系統(tǒng)時(shí)鐘
while(RCC_GetSYSCLKSource() != 0x08);
}
//開(kāi)啟TIM3的時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//開(kāi)啟GPIOB的時(shí)鐘和復(fù)用功能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
}
void GPIO_cfg()
{
GPIO_InitTypeDef GPIO_InitStructure;
/******初始化連接LED的引腳PB5*************/
//部分映射,將TIM3_CH2映射到PB5
//
GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
//選擇引腳5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
//輸出頻率最大50MHz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
void TIMER_cfg()
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//重新將Timer設(shè)置為缺省值
TIM_DeInit(TIM3);
//采用內(nèi)部時(shí)鐘給TIM3提供時(shí)鐘源
TIM_InternalClockConfig(TIM3);
//預(yù)分頻系數(shù)為0,即不進(jìn)行預(yù)分頻,此時(shí)TIMER的頻率為72MHz
TIM_TimeBaseStructure.TIM_Prescaler = 0;
//設(shè)置時(shí)鐘分割
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//設(shè)置計(jì)數(shù)器模式為向上計(jì)數(shù)模式
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
//設(shè)置計(jì)數(shù)溢出大小,每計(jì)7200個(gè)數(shù)就產(chǎn)生一個(gè)更新事件,即PWM的輸出頻率為10kHz
TIM_TimeBaseStructure.TIM_Period = 7200 - 1;
//將配置應(yīng)用到TIM3中
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
}
void PWM_cfg()
{
TIM_OCInitTypeDef TimOCInitStructure;
//設(shè)置缺省值
TIM_OCStructInit(&TimOCInitStructure);
//PWM模式1輸出
TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
//設(shè)置占空比,占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100%
TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100;
//TIM輸出比較極性高
TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
//使能輸出狀態(tài)
TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
//TIM3的CH2輸出
TIM_OC2Init(TIM3, &TimOCInitStructure);
//設(shè)置TIM3的PWM輸出為使能
TIM_CtrlPWMOutputs(TIM3,ENABLE);
}
評(píng)論