|
閱讀了ALIENTEK MINI板的PWM實(shí)驗(yàn)例程,感覺可以簡化一下,簡化后如下:
(其中工程里面的delay.c和delay.h可以在配套光盤里找也可以網(wǎng)上下載)
--------------------------------------------------------------
初始化文件,可以隨意命名,在此命名為Timer3PWM.c
--------------------------------------------------------------
#include "stm32f10x.h"
//arr:自動(dòng)重裝值 psc:時(shí)鐘預(yù)分頻數(shù)
void TIM3_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能定時(shí)器3時(shí)鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|
RCC_APB2Periph_AFIO,ENABLE);//使能GPIO和服用功能時(shí)鐘
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7; //PWM輸出在PA7
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//復(fù)用推挽輸出
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIO
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_8; //PA8連DS0
//為防止PA8的輸出干擾DS0的顯示,應(yīng)配置PA8為浮空輸入
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr;//設(shè)置自動(dòng)重裝載周期值
TIM_TimeBaseStructure.TIM_Prescaler = psc;//設(shè)置預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//設(shè)置時(shí)鐘分割
TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//初始化TIM3
TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM2; //選擇PWM模式2
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; //輸出極性高
TIM_OC2Init(TIM3,&TIM_OCInitStructure);//初始化外設(shè)TIM3OC2
TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能預(yù)裝載寄存器
TIM_Cmd(TIM3,ENABLE); //使能TIM3
}
void NVIC_Config(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:
// 2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
}
-----------------------------------------------------------------------------
主函數(shù),命名為main.c
-----------------------------------------------------------------------------
#include"stm32f10x.h"
#include "delay.h"
#include "timer3PWM.h"
void main(void)
{
u16 ledpwmval = 0;
u8 dir = 1;
delay_init(72);//時(shí)鐘延時(shí)初始化
TIM3_PWM_Init(899,0);//PWM頻率72000/900 = 8KHz
NVIC_Config();//設(shè)置NVIC中斷分組
while(1)
{
delay_ms(10);
if(dir)
ledpwmval++;
else
ledpwmval--;
if(ledpwmval > 300)
dir = 0;
if(ledpwmval == 0)
dir = 1;
TIM_SetCompare2(TIM3,ledpwmval);
}
}
(記得把PA7和PA8短接)
|
|