3.定时器(TIM2)的库函数编程
在工程中加入定时器的库函数文件
(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),通过编程控制输出方波的频率和占空比(高低电平的比例),广泛应用在测量,通信,功率控制域变换等领域(呼吸灯,点击)。
PWM由定时器驱动,定时器的周期就是PWM的周期,为了控制高低电平的比例,会在定时器的基础上加上一个比较寄存器,同时需要和IO口结合输出PWM波。
2.stm32中的PWM
stm32中的PWM属于定时器的功能,通过直接配置定时器就可以使用PWM,除了定时器的基本配置以外,还要加入一个比较计数器确定一个周期内翻转电平的时机,还需要使用GPIO的复用功能输出PWM方波。
PWM方波的高低电平顺序是由极性,PWM模式和计数模式共同决定。极性决定有效电平(默认电平),PWM模式指的是一个周内有效电平和无效电平的顺序。
注:只有有定时器复用功能的GPIO口才能输出PWM
3.使用库函数配置PWM将D1设置为呼吸灯
(1)使能时钟
GPIOF时钟
TIM14时钟
(2)初始化GPIO为复用功能
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式
GPIO_Init(...);
(3)将定时器14通道1的复用功能映射到GPIOF9
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)串行通信和并行通信
串行通信只有一个数据通道,一次传输一位数据。适用于传输距离较长,速度要求不是很高的场合。
并行通信有多个数据通道,一次传输多位数据。适用于传输距离较短,速度要求比较高的场合。
(2)单工,半双工和全双工
单工:数据只能沿着一个方向单向传输
半双工:数据可以双向传输,但是不能同时进行
全双工:数据可以同时双向传输
(3)通信速度
单位时间内传输的比特数表示传输速度,叫做波特率(bps)
(4)通信协议(串口)
通信协议指的是通信双方约定好的数据格式。
2.串口的硬件连接
UART ----------- 通用异步收发器
USART --------- 通用同步/异步收发器
3.stm32的串口开发
(1)原理图
USB调试串口连接到了CPU的PA9 PA10,它们具有串口复用功能
作业:
分别配置以下定时器,完成指定效果
定时器1控制D1,100ms闪烁
定时器2控制D2,300ms闪烁
定时器3控制D3,500ms闪烁
定时器8控制读取MQ2传感器,2s读取一次,超标用蜂鸣器报警
1 8 ----- APB2 ----- 168M
2 3 ----- APB1 ----- 84M