DAY5-定时器编程实现,PWM和串口介绍

221 阅读4分钟

3.定时器(TIM2)的库函数编程

在工程中加入定时器的库函数文件

image-20221102114359701

(1)开启定时器时钟

                RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);              

(2)初始化定时器

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
参数:
    TIMx - 哪个定时器
    TIM_TimeBaseInitStruct - 定时器初始化结构
​
typedef struct
{
  uint16_t TIM_Prescaler;         /*!< 预分频的值 0x0000 and 0xFFFF */uint16_t TIM_CounterMode;       /*!< 计数模式 @ref TIM_Counter_Mode */uint32_t TIM_Period;            /*!< 初始计数值 0x0000 and 0xFFFF.  */uint16_t TIM_ClockDivision;     /*!< 时钟因子 @ref TIM_Clock_Division_CKD */uint8_t TIM_RepetitionCounter;  /*!< 直接忽略,高级定时器功能 */
} TIM_TimeBaseInitTypeDef;         

(3)初始化NVIC

NVIC_Init(...);

(4)开启定时器的更新中断

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
参数:
    TIMx - 哪个定时器
    TIM_IT - 哪个中断 TIM_IT_Update
    NewState - 使能/禁止 ENABLE/DISABLE

(5)实现定时器的中断处理函数

void TIM2_IRQHandler(void);
//清楚中断标志
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

(6)启动定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);
参数:
    TIMx - 哪个定时器
    NewState - 使能/禁止 ENABLE/DISABLE

练习:

配置定时器10,将周期设置为200ms,控制D4闪烁

提示:
    中断通道 - TIM1_UP_TIM10_IRQn
    中断处理函数 - TIM1_UP_TIM10_IRQHandler

十六.PWM

1.概念

PWM叫脉冲宽度调制(Pulse Width Modulation),通过编程控制输出方波的频率和占空比(高低电平的比例),广泛应用在测量,通信,功率控制域变换等领域(呼吸灯,点击)。

十六.PWM

1.概念

PWM叫脉冲宽度调制(Pulse Width Modulation),通过编程控制输出方波的频率和占空比(高低电平的比例),广泛应用在测量,通信,功率控制域变换等领域(呼吸灯,点击)。

image.png

PWM由定时器驱动,定时器的周期就是PWM的周期,为了控制高低电平的比例,会在定时器的基础上加上一个比较寄存器,同时需要和IO口结合输出PWM波。

image.png 2.stm32中的PWM

stm32中的PWM属于定时器的功能,通过直接配置定时器就可以使用PWM,除了定时器的基本配置以外,还要加入一个比较计数器确定一个周期内翻转电平的时机,还需要使用GPIO的复用功能输出PWM方波。

PWM方波的高低电平顺序是由极性,PWM模式和计数模式共同决定。极性决定有效电平(默认电平),PWM模式指的是一个周内有效电平和无效电平的顺序。

image.png

image.png

注:只有有定时器复用功能的GPIO口才能输出PWM

3.使用库函数配置PWM将D1设置为呼吸灯

image.png

(1)使能时钟

GPIOF时钟
TIM14时钟

(2)初始化GPIO为复用功能

GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式
GPIO_Init(...);

(3)将定时器14通道1的复用功能映射到GPIOF9

image.png

void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
参数:
    GPIOx - 哪一组GPIO
    GPIO_PinSource - 哪个脚
    GPIO_AF - 哪个复用功能(根据原理图)
    
比如:
GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);    

(4)初始化定时器

TIM_TimeBaseInit(...);

(5)初始化PWM

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
参数:
    TIMx - 哪个定时器
    TIM_OCInitStruct - PWM初始化结构
    
typedef struct
{
  uint16_t TIM_OCMode;        /*!< PWM模式 @ref TIM_Output_Compare_and_PWM_modes */uint16_t TIM_OutputState;   /*!< 输出状态使能 @ref TIM_Output_Compare_State */uint16_t TIM_OutputNState;  /*!< 忽略 */uint32_t TIM_Pulse;         /*!< 比较计数值 0x0000 and 0xFFFF */uint16_t TIM_OCPolarity;    /*!< 极性 @ref TIM_Output_Compare_Polarity */uint16_t TIM_OCNPolarity;   /*!< 忽略 */uint16_t TIM_OCIdleState;   /*!< 忽略  */uint16_t TIM_OCNIdleState;  /*!< 忽略  */
} TIM_OCInitTypeDef;    

(6)使能PWM的预装载和重重载功能

TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM14, ENABLE);

(7)启动定时器

TIM_Cmd(...);
​
//如果是高级定时器(TIM1 TIM8),需靠打开另一个开关
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
参数:
    TIMx - TIM1 或者 TIM8
    NewState - ENABLE/DISABLE

(8)根据需要调节PWM的占空比

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint32_t Compare1);
参数:
    TIMx - 哪个定时器
    Compare1 - 比较计数值

练习:

使用TIM1的通道4去控制D4作为呼吸灯

TIM1是高级定时器
通道4

十七.串口

1.通信的基本概念

(1)串行通信和并行通信

image.png

串行通信只有一个数据通道,一次传输一位数据。适用于传输距离较长,速度要求不是很高的场合。

并行通信有多个数据通道,一次传输多位数据。适用于传输距离较短,速度要求比较高的场合。

(2)单工,半双工和全双工

image.png

单工:数据只能沿着一个方向单向传输

半双工:数据可以双向传输,但是不能同时进行

全双工:数据可以同时双向传输

(3)通信速度

单位时间内传输的比特数表示传输速度,叫做波特率(bps)

(4)通信协议(串口)

通信协议指的是通信双方约定好的数据格式。

image.png

2.串口的硬件连接

UART ----------- 通用异步收发器

USART --------- 通用同步/异步收发器

image.png

3.stm32的串口开发

(1)原理图

image.png USB调试串口连接到了CPU的PA9 PA10,它们具有串口复用功能

作业:

分别配置以下定时器,完成指定效果

定时器1控制D1,100ms闪烁
定时器2控制D2,300ms闪烁
定时器3控制D3,500ms闪烁
定时器8控制读取MQ2传感器,2s读取一次,超标用蜂鸣器报警
​
1 8 ----- APB2 ----- 168M
2 3 ----- APB1 ----- 84M