主程序
#include "sys.h" #include "PWM.h" #include "USART3_TIM2.h" #include "string.h" #include "delay.h" char *str_light = "LIGHT:"; unsigned char PWM_BUF = 0; PWM初始化,USART3初始化,TIM2初始化 int main(void) { PWM_Init(); USART3_TIM2_Init(115200); delay_init(); while(1) { if(RX_SATA == 1) { if(strstr(RX_BUF,str_light) != 0) { PWM_BUF = (RX_BUF[6]-0x30)*10+(RX_BUF[7]-0x30); TIM_SetCompare1(TIM1,PWM_BUF); } RX_SATA = 0; count = 0; memset(RX_BUF,0,strlen(RX_BUF)); } } }
PWM初始化以及TIM1管脚设计
#include "PWM.h" void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //初始化PA8管脚为复用推挽式输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化定时器1的时基单元 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE); //配置定时器周期 TIM_TimeBaseStructure.TIM_Period = (100-1); TIM_TimeBaseStructure.TIM_Prescaler = (72-1); TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, & TIM_TimeBaseStructure); //使能定时器1 TIM_Cmd(TIM1,ENABLE); //初始化PWM输出配置 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset; TIM_OC1Init(TIM1,&TIM_OCInitStructure); //使能PWM外设 TIM_CtrlPWMOutputs(TIM1,ENABLE); //激活CCR寄存器 TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable); //激活ARR寄存器 TIM_ARRPreloadConfig(TIM1,ENABLE); }
TIM2与串口的定义
#include "USART3_TIM2.h" u8 count = 0; u8 RX_SATA = 0;//0表示接受未完成,1表示接受完成 char RX_BUF[10] = {0}; void USART3_TIM2_Init(u32 bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //开启用GPIOB和复用功能的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE); //开启USART3的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //PB10->TX 配置为复用推挽式输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); //PB11->RX 配置为浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = bound; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART3, &USART_InitStructure); USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//配置串口为中断模式 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_Cmd(USART3,ENABLE); USART_ClearFlag(USART3,USART_FLAG_TC); //2.使能定时器时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //配置定时器周期 TIM_TimeBaseStructure.TIM_Period = (100-1); TIM_TimeBaseStructure.TIM_Prescaler = (7200-1); TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, & TIM_TimeBaseStructure); //使能定时器2的中断 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); //配置定时器2的中断优先级 NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //使能定时器2 TIM_Cmd(TIM2,DISABLE); } void USART3_IRQHandler(void) { USART_ClearFlag(USART3,USART_FLAG_RXNE); RX_BUF[count] = USART_ReceiveData(USART3); count++; TIM_SetCounter(TIM2,0); TIM_Cmd(TIM2,ENABLE); } void TIM2_IRQHandler(void) { TIM_ClearFlag(TIM2,TIM_FLAG_Update); TIM_Cmd(TIM2,DISABLE); RX_SATA = 1; }
图片效果