一、 实验简介(实验目的)

使用 TIM3 的通道 2,把通道 2 重映射到 PB5,产生 PWM 来控制 DS0 的亮度。


二、 实验设备(实验设备及用到的模块)

1.电脑:window10及以上

2.开发板名称:正点原子战舰V3 STM32F103开发板

3.模块名称:KEY模块、LED模块、TIMER模块

4.数据通信方式及设备:指示灯 DS0、定时器 TIM3


三、 实验原理(软硬件全面阐述)

1.芯片该部分工作原理

(1).KEY部分对应芯片引脚

PWM输出实验_PWM输出

在战舰 STM32 开发板上的按键 KEY0 连接在引脚PE4 上、KEY1 连接在引脚PE3 上、KEY2 连接在引脚PE2 上、WK_UP 连接在引脚PA0 上。

(2).LED部分对应芯片引脚

PWM输出实验_引脚_02

在战舰 STM32 开发板上的LED0连接的引脚是PB5,LED1连接的引脚是PE5。


2.模块工作原理、电路图等

(1).KEY的STM32连接原理图

PWM输出实验_PWM输出_03

如上图电路图所示,KEY0、KEY1 和 KEY2 都接地都是是低电平有效,而 WK_UP接的是VCC3.3所以是高电平有效,并且外部都没有上下拉电阻,所以需要在 STM32 内部设置上下拉。

(2).LED的STM32连接原理图

PWM输出实验_初始化_04

通过位带操作 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)

PWM输出实验_PWM输出_05

(5)、DMA中断使能寄存器(TIMx_DIER)

PWM输出实验_PWM输出_06

(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输出库函数

PWM输出实验_寄存器_07


4. 关键程序分析

(1).在timer.c中配置 AFIO 相关寄存器的时候,必须先开启辅助功能时钟。

PWM输出实验_引脚_08

(2).在main.c的死循环while(1)中,我们将 led0pwmval 这个值设置为 PWM 比较值,也就是通过led0pwmval 来控制 PWM 的占空比,然后控制 led0pwmval 的值从 0 变到 300,然后又从 300 变到 0,如此循环,因此 DS0 的亮度也会跟着从暗变到亮,然后又从亮变到暗。

PWM输出实验_初始化_09


四、 程序分析(程序总体介绍,模块设计)

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();