
#include "led.h" #include "delay.h" #include "key.h" #include "sys.h" #include "usart.h" #include "timer.h" //ALIENTEK战舰STM32开发板实验9 //PWM输出实验 //技术支持:www.openedv.com //广州市星翼电子科技有限公司 void sendback(void) {unsigned char t;for(t=0;t<myusart.recount;t++){USART_SendData(USART1, myusart.rcbuf[t]);//向串口1发送数据while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } } void Com_Handle(void) {unsigned long long arr=0;unsigned int psc=0;//数据格式判断if((myusart.rcbuf[0]!= 0xaa) || (myusart.rcbuf[myusart.recount-1]!=0xff))//头码是否为0xaa,结束码是否为0xff {return;}else{//如何处理四个数据,四字节转成一个数//00 00 A0 28arr=(myusart.rcbuf[1]<<24)+(myusart.rcbuf[2]<<16)+ (myusart.rcbuf[3]<<8) + myusart.rcbuf[4];psc=5000; //占空比50%=5000/10000; set_pwm1(arr,psc);//是否需要回复,发什么回复什么 sendback();}}int main(void) { delay_init(); //延时函数初始化 NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_Init(); //LED端口初始化 // TIM3_PWM_Init(900-1,0); //不分频。PWM频率=72000k/900=80KhzTIM3_PWM_Init(3-1,250-1); // TIM2_Int_Init(999,71); //1mswhile(1){if(myusart.reflag>0){Com_Handle();//收到什么回复什么; myusart.recount=0;myusart.reflag=0;}} }

//TIM3 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM3_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // 使能GPIOB时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);// 配置IO模式GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 复用推挽复用输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化TIM3的计数模式、分频值、重装载值等TIM_TimeBaseStructure.TIM_Period = arr; //ARRTIM_TimeBaseStructure.TIM_Prescaler = psc; //PSCTIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;// 向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/*TIM3_CH1输出占空比为20%的PWM波的定时配置*/TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 选择定时器模式:TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;// 比较输出使能TIM_OCInitStructure.TIM_Pulse = (arr+1)/2; //CCRTIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;// 输出极性:TIM输出比较极性高TIM_OC1Init(TIM3, &TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);// 使能TIM3在OC1上的预装载寄存器 TIM_Cmd(TIM3, ENABLE);//使能TIM3时钟 }void set_pwm1(unsigned long long arr,unsigned int psc)//例如set_pwm1(41000,1000);// 这样就是41KHZ,10% 1000/10000=10% {double T_ARR,DPwm_CCR2;unsigned int PWM_Per=0,TIM1_CCR1=0;// T_ARR=(double)72000000/arr; T_ARR=(double)288000/arr; DPwm_CCR2=(double)(T_ARR * psc)/10000;T_ARR=T_ARR+0.5;//四舍五入算法DPwm_CCR2=DPwm_CCR2+0.5;//四舍五入算法// PWM_Config_step((u16)T_ARR, (u16)DPwm_CCR2, 1);PWM_Per = (unsigned int)T_ARR;TIM1_CCR1 =DPwm_CCR2;TIM_SetAutoreload(TIM3,PWM_Per-1);TIM_SetCompare1(TIM3,TIM1_CCR1-1);}