完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1、RCC相关: APB2启动时钟项: RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, RCC_APB2Periph_ALL APB2启动函数: RCC_APB2PeriphClockCmd(XX,ENABLE); APB1启动时钟项: RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_ALL APB1启动函数: RCC_APB2PeriphClockCmd(XX,ENABLE); AHB启动时钟项: RCC_AHBPeriph_DMA1 RCC_AHBPeriph_DMA2 RCC_AHBPeriph_SRAM RCC_AHBPeriph_FLITF RCC_AHBPeriph_CRC RCC_AHBPeriph_FSMC RCC_AHBPeriph_SDIO AHB启动函数: RCC_AHBPeriphClockCmd (XX,ENABLE); 2、GPIO相关: GPIO模式: GPIO_Mode_AIN:模拟输入 GPIO_Mode_IN_FLOATING:浮空输入 GPIO_Mode_IPD:下拉输入 GPIO_Mode_IPU:上拉输入 GPIO_Mode_Out_OD:开漏输出 GPIO_Mode_Out_PP:推挽输出 GPIO_Mode_AF_OD:复用开漏输出 GPIO_Mode_AF_PP:复用推挽输出 GPIO速度: GPIO_Speed_2MHz GPIO_Speed_10MHz GPIO_Speed_50MHz GPIO引脚声明: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x; x:1~15或者all GPIO初始化函数: GPIO_Init(GPIOx, &GPIO_InitStructure); x:A~G 注:需要定义GPIO结构体变量,GPIO_InitTypeDef GPIO_InitStructure; 3、PWM相关 #include "timer.h" #include "led.h" #include "usart.h" // //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK战舰STM32开发板 //定时器 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2012/9/4 //版本:V1.1 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All rights reserved //******************************************************************************** //V1.1 20120904 //1,增加TIM3_PWM_Init函数。 //2,增加LED0_PWM_VAL宏定义,控制TIM3_CH2脉宽 // //通用定时器3中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设 } //定时器3中断服务程序 void TIM3_IRQHandler(void) //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 LED1=!LED1; } } //TIM4 PWM部分初始化 //PWM输出初始化 PB6 没有映射 //arr:自动重装值 //psc:时钟预分频数 void TIM4_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟 //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); //Timer2部分重映射 TIM4_CH1->PB6 没有映射 //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形 GPIOB.6 没有映射 重映射的端口remap GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO PB.6 //GPIO_SetBits(GPIOB,GPIO_Pin_6); //PB.6 输出高 //初始化TIM4 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM2 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High 接高电平极性为高 接低电平输出极性为低TIM_OCPolarity_Low TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 CH1 TIM_OC1PreloadConfig // CH1的PWM脉冲波形 TIM_CtrlPWMOutputs(TIM4,ENABLE); //⑤MOE 主输出使能 非高级定时器可省略 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR1上的预装载寄存器 TIM4 CH1 TIM_ARRPreloadConfig(TIM4, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器 非高级定时器可省略 TIM_Cmd(TIM4, ENABLE); //使能TIM4 } //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_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 PC7 //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5 重映射的端口remap GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOC.7 重映射的端口remap GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO //初始化TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIM3 } |
|
|
|
1、RCC相关: APB2启动时钟项: RCC_APB2Periph_AFIO, RCC_APB2Periph_GPIOA, RCC_APB2Periph_GPIOB, RCC_APB2Periph_GPIOC, RCC_APB2Periph_GPIOD, RCC_APB2Periph_GPIOE, RCC_APB2Periph_GPIOF, RCC_APB2Periph_GPIOG, RCC_APB2Periph_ADC1, RCC_APB2Periph_ADC2, RCC_APB2Periph_TIM1, RCC_APB2Periph_SPI1, RCC_APB2Periph_TIM8, RCC_APB2Periph_USART1, RCC_APB2Periph_ADC3, RCC_APB2Periph_ALL APB2启动函数: RCC_APB2PeriphClockCmd(XX,ENABLE); APB1启动时钟项: RCC_APB1Periph_TIM2, RCC_APB1Periph_TIM3, RCC_APB1Periph_TIM4, RCC_APB1Periph_TIM5, RCC_APB1Periph_TIM6, RCC_APB1Periph_TIM7, RCC_APB1Periph_WWDG, RCC_APB1Periph_SPI2, RCC_APB1Periph_SPI3, RCC_APB1Periph_USART2, RCC_APB1Periph_USART3, RCC_APB1Periph_USART4, RCC_APB1Periph_USART5, RCC_APB1Periph_I2C1, RCC_APB1Periph_I2C2, RCC_APB1Periph_USB, RCC_APB1Periph_CAN1, RCC_APB1Periph_BKP, RCC_APB1Periph_PWR, RCC_APB1Periph_DAC, RCC_APB1Periph_ALL APB1启动函数: RCC_APB2PeriphClockCmd(XX,ENABLE); AHB启动时钟项: RCC_AHBPeriph_DMA1 RCC_AHBPeriph_DMA2 RCC_AHBPeriph_SRAM RCC_AHBPeriph_FLITF RCC_AHBPeriph_CRC RCC_AHBPeriph_FSMC RCC_AHBPeriph_SDIO AHB启动函数: RCC_AHBPeriphClockCmd (XX,ENABLE); 2、GPIO相关: GPIO模式: GPIO_Mode_AIN:模拟输入 GPIO_Mode_IN_FLOATING:浮空输入 GPIO_Mode_IPD:下拉输入 GPIO_Mode_IPU:上拉输入 GPIO_Mode_Out_OD:开漏输出 GPIO_Mode_Out_PP:推挽输出 GPIO_Mode_AF_OD:复用开漏输出 GPIO_Mode_AF_PP:复用推挽输出 GPIO速度: GPIO_Speed_2MHz GPIO_Speed_10MHz GPIO_Speed_50MHz GPIO引脚声明: GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x; x:1~15或者all GPIO初始化函数: GPIO_Init(GPIOx, &GPIO_InitStructure); x:A~G 注:需要定义GPIO结构体变量,GPIO_InitTypeDef GPIO_InitStructure; 3、PWM相关 #include "timer.h" #include "led.h" #include "usart.h" // //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK战舰STM32开发板 //定时器 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2012/9/4 //版本:V1.1 //版权所有,盗版必究。 //Copyright(C) 广州市星翼电子科技有限公司 2009-2019 //All rights reserved //******************************************************************************** //V1.1 20120904 //1,增加TIM3_PWM_Init函数。 //2,增加LED0_PWM_VAL宏定义,控制TIM3_CH2脉宽 // //通用定时器3中断初始化 //这里时钟选择为APB1的2倍,而APB1为36M //arr:自动重装值。 //psc:时钟预分频数 //这里使用的是定时器3! void TIM3_Int_Init(u16 arr,u16 psc) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能 NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIMx外设 } //定时器3中断服务程序 void TIM3_IRQHandler(void) //TIM3中断 { if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 { TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 LED1=!LED1; } } //TIM4 PWM部分初始化 //PWM输出初始化 PB6 没有映射 //arr:自动重装值 //psc:时钟预分频数 void TIM4_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟 //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM2, ENABLE); //Timer2部分重映射 TIM4_CH1->PB6 没有映射 //设置该引脚为复用输出功能,输出TIM4 CH1的PWM脉冲波形 GPIOB.6 没有映射 重映射的端口remap GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO PB.6 //GPIO_SetBits(GPIOB,GPIO_Pin_6); //PB.6 输出高 //初始化TIM4 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM2 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High 接高电平极性为高 接低电平输出极性为低TIM_OCPolarity_Low TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 CH1 TIM_OC1PreloadConfig // CH1的PWM脉冲波形 TIM_CtrlPWMOutputs(TIM4,ENABLE); //⑤MOE 主输出使能 非高级定时器可省略 TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR1上的预装载寄存器 TIM4 CH1 TIM_ARRPreloadConfig(TIM4, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器 非高级定时器可省略 TIM_Cmd(TIM4, ENABLE); //使能TIM4 } //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_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 PC7 //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5 重映射的端口remap GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOC.7 重映射的端口remap GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; //TIM_CH2 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIO //初始化TIM3 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高 TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器 TIM_Cmd(TIM3, ENABLE); //使能TIM3 } |
|
|
|
//TIM2 PWM部分初始化
//PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM2_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟 //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设和AFIO复用功能模块时钟 //GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2, ENABLE); //Timer2部分重映射 TIM2_CH1->PA0 没有映射 //设置该引脚为复用输出功能,输出TIM2 CH1的PWM脉冲波形 GPIOA.0 重映射的端口remap 没有映射 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO //GPIO_SetBits(GPIOA,GPIO_Pin_0); //PB.5 输出高 //初始化TIM2 TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位 //初始化TIM2 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性高TIM_OCPolarity_High 接高电平极性为高 接低电平输出极性为低TIM_OCPolarity_Low TIM_OC1Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM2 CH1 TIM_OC1PreloadConfig // CH1的PWM脉冲波形 TIM_CtrlPWMOutputs(TIM2,ENABLE); //⑤MOE 主输出使能 非高级定时器可省略 TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器 TIM2 CH1 TIM_ARRPreloadConfig(TIM2, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器 非高级定时器可省略 TIM_Cmd(TIM2, ENABLE); //使能TIM2 } //TIM1 PWM部分初始化 //高级定时器 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM1_PWM_Init(u16 arr,u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// ①使能 tim1 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //①使能 GPIO 外设时钟使能 //设置该引脚为复用输出功能,输出 TIM1 CH1 的 PWM 脉冲波形 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为 TIMx 时钟频率除数的预分频值 不分频 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //②初始化 TIMx TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //脉宽调制模式 2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高 TIM_OC1Init(TIM1, &TIM_OCInitStructure); //③初始化外设 TIMx TIM_CtrlPWMOutputs(TIM1,ENABLE); //⑤MOE 主输出使能 TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1 预装载使能 TIM_ARRPreloadConfig(TIM1, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器 TIM_Cmd(TIM1, ENABLE); //④使能 TIM1 } 4、ADC相关 最好需要重新初始化:ADC_DeInit(ADCx); ADC工作模式选择: ADC_Mode_Independent:独立工作 ADC_Mode_RegInjecSimult:混合同步+注入同步 ADC_Mode_RegSimult_AlterTrig:混合同步+交替触发 ADC_Mode_InjecSimult_FastInterl:混合同步+快速交替 ADC_Mode_InjecSimult_SlowInterl:混合同步+慢速交替 ADC_Mode_InjecSimult:注入同步 ADC_Mode_RegSimult:规则同步 ADC_Mode_FastInterl:快速交替 ADC_Mode_SlowInterl:慢速交替 ADC_Mode_AlterTrig:交替触发 通过ADC_InitStructure.ADC_Mode = XX进行赋值 ADC扫描使能: ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC连续 /单次模式选择: ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC转换控制方式: ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//有软件控制转换 ADC数据对齐方式:ADC_DataAlign_Right:右对齐 / ADC_DataAlign_Right:左对齐 ADC_InitStructure.ADC_DataAlign =XX ADC转换通道数: ADC_InitStructure.ADC_NbrOfChannel = X // X=1~16 ADC初始化函数: ADC_Init(ADCx, &ADC_InitStructure); 注:在开始要定义结构体变量 ADC_InitTypeDef ADC_InitStructure 是否使能ADCx DMA : ADC_DMACmd(ADCx, ENABLE); 使能ADCx: ADC_Cmd(ADCx, ENABLE); 初始化ADC1校准寄存器: ADC_ResetCalibration(ADCx); 检测ADC1校准寄存器初始化是否完成: while(ADC_GetResetCalibrationStatus(ADCx)); 开始校准ADC1: ADC_StartCalibration(ADCx); 检测是否完成校准: while(ADC_GetCalibrationStatus(ADCx)); ADC1转换软件启动: ADC_SoftwareStartConvCmd(ADCx, ENABLE); |
|
|
|
5、DMA相关:
复位通道: DMA_DeInit(DMAy_Channelx);//复位DMAy通道x,y=1时,x=1~7;y=2时,x=1~5 定义外设基地址,全局变量: DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//地址自己定义 如:#define ADC1_DR_Address ((u32)0x4001244C) 定义DMA存储器地址,全局变量u32 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; //定义DMA通道存储器地址 如:volatile unsigned short int ADC_ConvertedValue[8]; DMA外设方向: DMA_InitStructure.DMA_DIR = XX; DMA_DIR_PeripheralSRC:外设为数据传输的来源,DMA_DIR_PeripheralDST:外设为数据传输的目的地 DMA传输数量寄存器值,即缓存大小,单位由MemoryDataSize或PeripheralDataSize决定: DMA_InitStructure.DMA_BufferSize = x; //定义DMA缓冲区大小x,如8通道ADC,则x就为8 DMA外设地址寄存器变不变: DMA_InitStructure.DMA_PeripheralInc = x; DMA_PeripheralInc_Disable:外设地址寄存器不变 DMA_PeripheralInc_Enable:外设地址寄存器递增 DMA内存地址寄存器变不变: DMA_InitStructure.DMA_MemoryInc = X; DMA_MemoryInc_Disable:内存地址寄存器不变 DMA_MemoryInc_Enable:内存地址寄存器递增 外设数据宽度: DMA_InitStructure.DMA_PeripheralDataSize = X; DMA_PeripheralDataSize_Byte 数据宽度为8位 DMA_PeripheralDataSize_HalfWord 数据宽度为16位 DMA_PeripheralDataSize_Word 数据宽度为32位 存储器数据宽度: DMA_InitStructure.DMA_MemoryDataSize = X; DMA_MemoryDataSize_Byte 数据宽度为8位 DMA_MemoryDataSize_HalfWord 数据宽度为16位 DMA_MemoryDataSize_Word 数据宽度为32位 模式选择: DMA_InitStructure.DMA_Mode =x; DMA_Mode_Circular: 循环模式 DMA_Mode_Normal:正常模式 通道软件优先级设置: DMA_InitStructure.DMA_Priority =x; DMA_Priority_VeryHigh 最高优先级 DMA_Priority_High 高优先级 DMA_Priority_Medium 中优先级 DMA_Priority_Low 低优先级 DMA内存到内存的传输使能: DMA_InitStructure.DMA_M2M = x DMA_M2M_Enable:使能 DMA_M2M_Disable:未使能 DMA初始化函数: DMA_Init(DMAy_Channelx , &DMA_InitStructure); DMA通道使能函数: DMA_Cmd(DMAy_Channelx , ENABLE); //使能DMA通道1 注:在开始要定义结构体变量 DMA_InitTypeDef DMA_InitStructure 6、NVIC相关: 优先级组设定: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x); NVIC_PriorityGroup_0: 0 bits for pre-emption priority 4 bits for subpriority NVIC_PriorityGroup_1: 1 bits for pre-emption priority 3 bits for subpriority NVIC_PriorityGroup_2: 2 bits for pre-emption priority 2 bits for subpriority NVIC_PriorityGroup_3: 3 bits for pre-emption priority 1 bits for subpriority NVIC_PriorityGroup_4: 4 bits for pre-emption priority 0 bits for subpriority 设置中断: NVIC_InitStructure.NVIC_IRQChannel =x; ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt*/ USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */ USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */ CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt*/ CAN1_SCE_IRQn = 22, /*! EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts*/ TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt*/ TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt*/ TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt*/ TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt*/ TIM2_IRQn = 28, /*!< TIM2 global Interrupt */ TIM3_IRQn = 29, /*!< TIM3 global Interrupt */ TIM4_IRQn = 30, /*!< TIM4 global Interrupt*/ I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt*/ I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt*/ I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */ I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */ SPI1_IRQn = 35, /*!< SPI1 global Interrupt*/ SPI2_IRQn = 36, /*!< SPI2 global Interrupt*/ USART1_IRQn = 37, /*!< USART1 global Interrupt*/ USART2_IRQn = 38, /*!< USART2 global Interrupt*/ USART3_IRQn = 39, /*!< USART3 global Interrupt*/ EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts*/ RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt*/ USBWakeUp_IRQn = 42, /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */ TIM8_BRK_IRQn = 43, /*!< TIM8 Break Interrupt */ TIM8_UP_IRQn = 44, /*!< TIM8 Update Interrupt*/ TIM8_TRG_COM_IRQn = 45, /*!< TIM8 Trigger and Commutation Interrupt TIM8_CC_IRQn = 46, /*!< TIM8 Capture Compare Interrupt*/ ADC3_IRQn = 47, /*!< ADC3 global Interrupt*/ FSMC_IRQn = 48, /*!< FSMC global Interrupt */ SDIO_IRQn = 49, /*!< SDIO global Interrupt*/ TIM5_IRQn = 50, /*!< TIM5 global Interrupt*/ SPI3_IRQn = 51, /*!< SPI3 global Interrupt*/ UART4_IRQn = 52, /*!< UART4 global Interrupt */ UART5_IRQn = 53, /*!< UART5 global Interrupt */ TIM6_IRQn = 54, /*!< TIM6 global Interrupt */ TIM7_IRQn = 55, /*!< TIM7 global Interrupt */ DMA2_Channel1_IRQn = 56, /*!< DMA2 Channel 1 global Interrupt*/ DMA2_Channel2_IRQn = 57, /*!< DMA2 Channel 2 global Interrupt */ DMA2_Channel3_IRQn = 58, /*!< DMA2 Channel 3 global Interrupt*/ DMA2_Channel4_5_IRQn = 59, /*!< DMA2 Channel 4 and Channel 5 global Interrupt*/ 设置抢占优先级: NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =X; //抢占优先级 X 设置子优先级为: NVIC_InitStructure.NVIC_IRQChannelSubPriority =X; //抢占优先级 X 使能中断: NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能 NVIC初始化函数: NVIC_Init(&NVIC_InitStructure); 注:在开始时需要定义结构体变量NVIC_InitTypeDef NVIC _InitStructure; 6、USART相关: USART波特率选择: USART_InitStructure.USART_BaudRate =XX; //波特率为XX bps 数据位位数选择: USART_InitStructure.USART_WordLength = USART_WordLength_Xb; //X为8或者9,即8位或者9位数据位 停止位位数选择: USART_InitStructure.USART_StopBits = USART_StopBits_1; //停止位1位 #define USART_StopBits_1 ((uint16_t)0x0000) #define USART_StopBits_0_5 ((uint16_t)0x1000) #define USART_StopBits_2 ((uint16_t)0x2000) #define USART_StopBits_1_5 ((uint16_t)0x3000) 有无校验位选择: USART_InitStructure.USART_Parity = USART_Parity_No; //无校验位 #define USART_Parity_No ((uint16_t)0x0000) #define USART_Parity_Even ((uint16_t)0x0400) #define USART_Parity_Odd ((uint16_t)0x0600) 有无硬件流控选择: USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件流控 #define USART_HardwareFlowControl_None ((uint16_t)0x0000) #define USART_HardwareFlowControl_RTS ((uint16_t)0x0100) #define USART_HardwareFlowControl_CTS ((uint16_t)0x0200) #define USART_HardwareFlowControl_RTS_CTS ((uint16_t)0x0300) 模式选择: USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 #define USART_Mode_Rx ((uint16_t)0x0004) #define USART_Mode_Tx ((uint16_t)0x0008) 配置串口参数函数: USART_Init(USARTx, &USART_InitStructure); USARTx 可选:USART1, USART2, USART3, UART4 or UART5 注:在开始时需要定义结构体变量USART_InitTypeDef USART_InitStruct; 使能接收中断: USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); 使能发送缓冲空中断: USART_ITConfig(USARTx, USART_IT_TXE, ENABLE); 使能发送完成中断: USART_ITConfig(USARTx, USART_IT_TC, ENABLE) 使能USART: USART_Cmd(USARTx, ENABLE); |
|
|
|
只有小组成员才能发言,加入小组>>
2775 浏览 9 评论
2488 浏览 16 评论
3056 浏览 1 评论
8012 浏览 16 评论
3575 浏览 18 评论
2684浏览 6评论
6646浏览 6评论
1478浏览 4评论
486浏览 4评论
1111浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 粤ICP备14022951号 )
GMT+8, 2023-9-30 04:41 , Processed in 0.853583 second(s), Total 69, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 深圳华秋电子有限公司
电子发烧友 (电路图) 粤公网安备 44030402000349 号 电信与信息服务业务经营许可证:粤 B2-20160233