一、 实验简介(实验目的)
使用 TIM3 的通道 2,把通道 2 重映射到 PB5,产生 PWM 来控制 DS0 的亮度。
二、 实验设备(实验设备及用到的模块)
1.电脑:window10及以上
2.开发板名称:正点原子战舰V3 STM32F103开发板
3.模块名称:KEY模块、LED模块、TIMER模块
4.数据通信方式及设备:指示灯 DS0、定时器 TIM3
三、 实验原理(软硬件全面阐述)
1.芯片该部分工作原理
(1).KEY部分对应芯片引脚
在战舰 STM32 开发板上的按键 KEY0 连接在引脚PE4 上、KEY1 连接在引脚PE3 上、KEY2 连接在引脚PE2 上、WK_UP 连接在引脚PA0 上。
(2).LED部分对应芯片引脚
在战舰 STM32 开发板上的LED0连接的引脚是PB5,LED1连接的引脚是PE5。
2.模块工作原理、电路图等
(1).KEY的STM32连接原理图
如上图电路图所示,KEY0、KEY1 和 KEY2 都接地都是是低电平有效,而 WK_UP接的是VCC3.3所以是高电平有效,并且外部都没有上下拉电阻,所以需要在 STM32 内部设置上下拉。
(2).LED的STM32连接原理图
通过位带操作 PB5 输出高低电平从而控制 LED0。
3. 用到的库函数阐述
(1)、设置比较值函数:
void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);
(2)、使能输出比较预装载:
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
(3)、使能自动重装载的预装载寄存器允许位:
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);
(4)、控制寄存器1(TIMx_CR1)
(5)、DMA中断使能寄存器(TIMx_DIER)
(6)、定时器参数初始化:
VoidTIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct);
(7)、定时器使能函数:
void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState)
(8)、定时器中断使能函数:
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
(9)、状态标志位获取和清除
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
(10)、PWM输出库函数
4. 关键程序分析
(1).在timer.c中配置 AFIO 相关寄存器的时候,必须先开启辅助功能时钟。
(2).在main.c的死循环while(1)中,我们将 led0pwmval 这个值设置为 PWM 比较值,也就是通过led0pwmval 来控制 PWM 的占空比,然后控制 led0pwmval 的值从 0 变到 300,然后又从 300 变到 0,如此循环,因此 DS0 的亮度也会跟着从暗变到亮,然后又从亮变到暗。
四、 程序分析(程序总体介绍,模块设计)
1. 程序总体概述
1)开启 TIM3 时钟以及复用功能时钟,配置 PB5 为复用输出。
2)设置 TIM3_CH2 重映射到 PB5 上。
3)初始化 TIM3,设置 TIM3 的 ARR 和 PSC。
4)设置 TIM3_CH2 的 PWM 模式,使能 TIM3 的 CH2 输出。
5)使能 TIM3。
6)修改 TIM3_CCR2 来控制占空比。
2. 各个模块阐述
(1).LED模块:小灯初始化并使能时钟
(2).KEY模块:按键初始化,设置响应优先级
(3).TIMER模块:实现定时器中断
3.程序分析总结
① 使能定时器3和相关IO口时钟。
RCC_APB1PeriphClockCmd();//使能定时器3时钟
RCC_APB2PeriphClockCmd();//使能GPIOB时钟
② 初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
③这里是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,
所以需要开启AFIO时钟。同时设置重映射。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
④ 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
⑤ 初始化输出比较参数:TIM_OC2Init();
⑥ 使能预装载寄存器: TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
⑦ 使能定时器。TIM_Cmd();
⑧ 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();