STM32單片機(jī) PWM
環(huán)境:
主機(jī):XP
開發(fā)環(huán)境:MDK4.23
MCU:STM32F103CBT6
說明:
使用內(nèi)部8M晶振,倍頻到64M供給TIM3定時(shí)器,PA6(通道1)上產(chǎn)生640K,50%方波
源代碼:
初始化時(shí)鐘:
//初始化RCC時(shí)鐘
voidinit_rcc(void)
{
//將外設(shè)RCC寄存器重設(shè)為缺省值
RCC_DeInit();
//內(nèi)部晶振使能
RCC_HSICmd(ENABLE);
//等待工作穩(wěn)定
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET);
//LSI的啟動(dòng),提供給看門狗時(shí)鐘
RCC_LSICmd(ENABLE);//打開LSI
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);//等待直到LSI穩(wěn)定
if(1)
{
//使能預(yù)取指緩存
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//設(shè)置FLASH存儲(chǔ)器延時(shí)時(shí)鐘周期數(shù)。(設(shè)置為延時(shí)2個(gè)時(shí)鐘周期)
FLASH_SetLatency(FLASH_Latency_2);
//設(shè)置AHB時(shí)鐘(HCLK)(這時(shí)設(shè)置為=系統(tǒng)時(shí)鐘)
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//設(shè)置SDIO的AHB時(shí)鐘(HCLK2)(這時(shí)設(shè)置為=HCLK),64M
RCC_PCLK2Config(RCC_HCLK_Div1);
//設(shè)置APB1外設(shè)時(shí)鐘(HCLK1)(這時(shí)設(shè)置為=HCLK/2),32M
RCC_PCLK1Config(RCC_HCLK_Div2);
//ADCCLK=PCLK2/8,1M
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//PLL的時(shí)鐘來源及倍頻的倍數(shù),此處設(shè)置為64MHz
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_16);
//使能PLL
RCC_PLLCmd(ENABLE);
//檢測(cè)PLL是否就緒
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
//設(shè)置PLL為系統(tǒng)時(shí)鐘
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//檢測(cè)系統(tǒng)的時(shí)鐘源是否是PLL
while(RCC_GetSYSCLKSource()!=0x08);
}
}
初始化IO口和定時(shí)器:
//設(shè)置IO口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//設(shè)置定時(shí)器3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//重新將TImer設(shè)置為缺省值
TIM_DeInit(TIM3);
//采用內(nèi)部時(shí)鐘給TIM3提供時(shí)鐘源
TIM_InternalClockConfig(TIM3);
timInitStruct.TIM_ClockDivision=TIM_CKD_DIV2;
timInitStruct.TIM_Prescaler=0;//計(jì)數(shù)頻率為64M
timInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上計(jì)數(shù)
timInitStruct.TIM_RepetitionCounter=0;
timInitStruct.TIM_Period=100;//這個(gè)值實(shí)際上就是TIMX-》ARR,延時(shí)開始時(shí)重新設(shè)定即可
TIM_TimeBaseInit(TIM3,&timInitStruct);
//設(shè)置PWM輸出
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse=50;
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OC1Init(TIM3,&TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);
//ARR預(yù)裝載緩沖器使能
TIM_ARRPreloadConfig(TIM3,ENABLE);
//開啟定時(shí)器
TIM_Cmd(TIM3,ENABLE);
輸出波形:
評(píng)論
查看更多