STM32單片機 PWM
環境:
主機:XP
開發環境:MDK4.23
MCU:STM32F103CBT6
說明:
使用內部8M晶振,倍頻到64M供給TIM3定時器,PA6(通道1)上產生640K,50%方波
源代碼:
初始化時鐘:
//初始化RCC時鐘
voidinit_rcc(void)
{
//將外設RCC寄存器重設為缺省值
RCC_DeInit();
//內部晶振使能
RCC_HSICmd(ENABLE);
//等待工作穩定
while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)==RESET);
//LSI的啟動,提供給看門狗時鐘
RCC_LSICmd(ENABLE);//打開LSI
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);//等待直到LSI穩定
if(1)
{
//使能預取指緩存
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
//設置FLASH存儲器延時時鐘周期數。(設置為延時2個時鐘周期)
FLASH_SetLatency(FLASH_Latency_2);
//設置AHB時鐘(HCLK)(這時設置為=系統時鐘)
RCC_HCLKConfig(RCC_SYSCLK_Div1);
//設置SDIO的AHB時鐘(HCLK2)(這時設置為=HCLK),64M
RCC_PCLK2Config(RCC_HCLK_Div1);
//設置APB1外設時鐘(HCLK1)(這時設置為=HCLK/2),32M
RCC_PCLK1Config(RCC_HCLK_Div2);
//ADCCLK=PCLK2/8,1M
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
//PLL的時鐘來源及倍頻的倍數,此處設置為64MHz
RCC_PLLConfig(RCC_PLLSource_HSI_Div2,RCC_PLLMul_16);
//使能PLL
RCC_PLLCmd(ENABLE);
//檢測PLL是否就緒
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);
//設置PLL為系統時鐘
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
//檢測系統的時鐘源是否是PLL
while(RCC_GetSYSCLKSource()!=0x08);
}
}
初始化IO口和定時器:
//設置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);
//設置定時器3
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//重新將TImer設置為缺省值
TIM_DeInit(TIM3);
//采用內部時鐘給TIM3提供時鐘源
TIM_InternalClockConfig(TIM3);
timInitStruct.TIM_ClockDivision=TIM_CKD_DIV2;
timInitStruct.TIM_Prescaler=0;//計數頻率為64M
timInitStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上計數
timInitStruct.TIM_RepetitionCounter=0;
timInitStruct.TIM_Period=100;//這個值實際上就是TIMX-》ARR,延時開始時重新設定即可
TIM_TimeBaseInit(TIM3,&timInitStruct);
//設置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預裝載緩沖器使能
TIM_ARRPreloadConfig(TIM3,ENABLE);
//開啟定時器
TIM_Cmd(TIM3,ENABLE);
輸出波形:
評論
查看更多