STM32自学笔记第五天:深入理解与应用
================Systick定时器======================================
一、定时器
定时器:芯片内部用于计数从而得到时长(定时)的外设
二、Systick定时器
Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。常用来做延时,或者实时系统的心跳时钟。这样可以节省MCU资源,不用浪费一个定时器。比如uCOS中,分时复用,需要一个最小的时间戳,一般在STM32+UCOS系统中,都采用Systick做uCOS心跳时钟。
Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。
频率单位换算:
1GHZ = 1000MHZ = 1000 000KHZ = 1000 000 000HZ
1HZ:一秒产生一个脉冲 一个脉冲数一个数
三、SysTick定时器的寄存器
一共4个Systick寄存器
CTRL SysTick 控制和状态寄存器
LOAD SysTick 自动重装载除值寄存器
VAL SysTick 当前值寄存器
CALIB SysTick 校准值寄存器
==============STM32通用定时器======================================
一、STM32定时器分类
高级定时器 (TIM1 TIM8)
通用定时器 (TIM2 TIM3 TIM4 TIM5 TIM9 TIM10 TIM11 TIM12 TIM13 TIM14)
基本定时器 (TIM6 TIM7)
二、通用定时器特性
通用 TIMx 定时器具有以下特性:
● 16 位( TIM3 和 TIM4)或 32 位( TIM2 和 TIM5) 递增、递减和递增/递减自动重载计
数器。
● 16 位可编程预分频器,用于对计数器时钟频率进行分频 (即运行时修改),分频系数介
于 1 到 65536 之间。
● 多达 4 个独立通道,可用于:
— 输入捕获
— 输出比较
— PWM 生成(边沿和中心对齐模式)
— 单脉冲模式输出
● 使用外部信号控制定时器且可实现多个定时器互连的同步电路。
● 发生如下事件时生成中断/DMA 请求:
— 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
— 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
— 输入捕获
— 输出比较
三、通用定时器的计数模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
②向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生
一个计数器向下溢出事件。
③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向
下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
四、定时器时钟频率
挂APB1定时器:TIM2 TIM3 TIM4 TIM5 TIM6 TIM7 TIM12 TIM13 TIM14
挂APB2定时器:TIM1 TIM8 TIM9 TIM10 TIM11
STM32F405xx/07xx 和 STM32F415xx/17xx 的定时器时钟频率由硬件自动设置。分为两种
情况:
1. 如果 APB 预分频器为 1,定时器时钟频率等于 APB 域的频率。
2. 否则,等于 APB 域的频率的两倍 (×2)。
挂在APB1定时器时钟频率为:42MHZX2 = 84MHZ
挂在APB2定时器时钟频率为:84MHZX2 = 168MHZ
五、定时器4配置流程
1、能定时器时钟。
RCC_APB1PeriphClockCmd();
2、初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit();
3、启定时器中断,配置NVIC。
NVIC_Init();
4、设置 TIM4_DIER 允许更新中断
TIM_ITConfig();
5、使能定时器。
TIM_Cmd();
6、编写中断服务函数。
TIMx_IRQHandler();
函数说明
/**
* @brief Initializes the TIMx Time Base Unit peripheral according to
* the specified parameters in the TIM_TimeBaseInitStruct.
* @param TIMx: where x can be 1 to 14 to select the TIM peripheral.
* @param TIM_TimeBaseInitStruct: pointer to a TIM_TimeBaseInitTypeDef structure
* that contains the configuration information for the specified TIM peripheral.
* @retval None
*/
//定时器初始化
void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)
TIM_TypeDef* TIMx:选定定时器
typedef struct
{
uint16_t TIM_Prescaler; //预分频
uint16_t TIM_CounterMode; //计数模式
uint32_t TIM_Period; //定时周期 重装载值
uint16_t TIM_ClockDivision; //分频因子
} TIM_TimeBaseInitTypeDef;
====================================PWM=================================
一、什么是PWM
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,
是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
二、PWM的占空比
占空比是指在一个脉冲循环内,通电时间(有可能是高电平,有可能低电平)相对于总时间所占的比例。
三、LED0灯PWM控制流程如下
1、理解电路原理
LED0连接PF9
LED0连接在TIM14通道1(TIM14_CH1)
2、使能定时器14和相关IO口时钟。
使能定时器14时钟:RCC_APB1PeriphClockCmd();
3、使能GPIOF时钟:
RCC_AHB1PeriphClockCmd ();
4、初始化IO口为复用功能输出。
函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
5、GPIOF9复用映射到定时器14
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
6、初始化定时器:ARR,PSC等:
TIM_TimeBaseInit();
7、初始化输出比较参数:
TIM_OC1Init();
8、使能预装载寄存器:
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);
9、使能自动重装载的预装载寄存器允许位
TIM_ARRPreloadConfig(TIM14,ENABLE);
10、使能定时器。
11、不断改变比较值CCRx,达到不同的占空比效果:
TIM_SetCompare1();