|
#include "pbdata.h"
u16 fre;
void RCC_Configuration(void);
void GPIO_Configuration(void);
void TIM8_Configuration();
void Delay (uint32_t nCount)
{
for(; nCount != 0; nCount--);
}
int main(void)
{
u16 arr=42000;
u16 led_dt = arr/2;
RCC_Configuration(); //系統(tǒng)時(shí)鐘初始化
GPIO_Configuration();//端口初始化
TIM8_Configuration(arr);//定時(shí)器和pwm配置
while(1)
{
TIM_SetCompare3(TIM8,led_dt); //用的是TIM3的通道2,輸出PWM 送到相應(yīng)的寄存器中 //滿占空比為900
TIM_SetCompare3(TIM8, 20);
GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED 發(fā)光
Delay(0x2ffff);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//LED 熄滅
Delay(0x2ffff);
}
}
void RCC_Configuration(void)
{
SystemInit();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);//這個(gè)是必須的,仿真軟件必須的
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//端口復(fù)用,一定在APB2的時(shí)鐘線
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
}
void GPIO_Configuration(void)
{
}
void TIM8_Configuration(arr)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
TIM_OCInitTypeDef TIM_OCInitStructure; //PWM的結(jié)構(gòu)體
GPIO_InitTypeDef GPIO_InitStructure;
//PWM
GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //通過PWM控制,端口為復(fù)用方式輸出
GPIO_Init(GPIOC,&GPIO_InitStructure);
//GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1,ENABLE);//TIM3 復(fù)用功能部分映射,可以此找到對(duì)應(yīng)的管腳
//關(guān)于部分映射可以參考“STM32參考手冊(cè)”119面
//定時(shí)器初始化
TIM_TimeBaseStruct.TIM_Period=arr;//初值
TIM_TimeBaseStruct.TIM_Prescaler=2;//預(yù)分頻
//不分頻,在晶振為72MHz的情況下,定時(shí)器執(zhí)行到899后即會(huì)溢出,表示計(jì)數(shù)滿
TIM_TimeBaseStruct.TIM_ClockDivision=0;
TIM_TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//向上
TIM_TimeBaseInit(TIM8,&TIM_TimeBaseStruct);
//TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;
//pwm初始化
//TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; //使用模式1
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //使能位
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
//設(shè)置輸出極性,一定注意
//TIM_OCInitStructure.TIM_Pulse = 20;
TIM_OC2Init(TIM8,&TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable); //與裝載使能,不會(huì)說執(zhí)行一次后就不執(zhí)行了
TIM_CtrlPWMOutputs(TIM8,ENABLE); //MOE 主輸出使能
TIM_ARRPreloadConfig(TIM8, ENABLE);
TIM_Cmd(TIM8,ENABLE);
}
/*PWM不是中斷,所以不需要設(shè)置中斷優(yōu)先級(jí) */
|
|