STM32学习(十三)
通用定时器简介
- 通用定时器有TIM2、TIM3、TIM4、TIM5
- 16位递增、递减、中心对齐计数器(0~65535)
- 16位预分频器(1~65536)
- 可用于触发DAC、ADC
- 在更新事件、触发事件、输入捕获、输出比较时,会产生中断/DMA请求。
- 4个独立通道,可用于:输入捕获、输出比较、输出PWM、单脉冲模式
- 使用外部信号控制定时器且可实现多个定时器(级联:用一个定时器的溢出事件来驱动下一个定时器进行计数)互连的同步电路。
- 支持编码器和霍尔传感器电路等。
通用定时器框图
通用定时器具备基本定时器所有功能
通用定时器时钟源:内部时钟,内部触发输入时钟,外部时钟模式1、外部时钟模式2
- 时钟源
- 控制器
- 时基单元(计数器)
- 输入捕获——测量脉冲时间
- 捕获/比较(公共)
- 输出比较
4和6部分的通道是分时复用,配置通道为输入就4部分生效,配置通道为输出就6部分生效。
计数器时钟源
- 内部时钟(CK_INT),来自外设总线APB提供的时钟。
- 外部时钟模式1:外部输入引脚(TIx),来自定时器通道1或者通道2引脚的信号。TI1F_ED是双边沿检测信号,TI1FP1和TI2FP2是单边沿检测信号。
- 外部时钟模式2:外部触发输入(ETR),来自可以复用为TIMx的ETR的IO引脚。
- 内部触发输入(ITRx),用于与芯片内部其它通用/高级定时器级联、
通用计数器时钟源设置方法
外部时钟模式1
- TIMx_SMCR的SMS[2:0]设置为111,外部时钟模式1被选中,且ECE设置为0.
外部时钟模式2
使用一个定时器作为另一个定时器的预分频器
RTC(Real Time Clock)
实时时钟,本质是一个计数器,计数频率通常为秒(1Hz),专门用来记录时间。
普通定时器无法作为时钟,因为普通定时器无法掉电运行。
而RTC具有特性:
- 能提供时间(秒钟数)
- 能在MCU掉电后运行
- 低功耗
常用的RTC方案
1,一般都需要设计RTC外围电路;
2,一般都可以给RTC设置独立的电源;
3,多数RTC的寄存器采用BCD码存储时间信息;
- RTC预分频器:32767
- RTCCLK:实时时钟源:选择LSE
后备区域VBAT,RTC工作在后备区域,VDD掉电仍正常工作。
RTC相关寄存器
- 部分寄存器写保护:RTX_PRL、RTC_ALR、RTC_CNT和RTC_DIV寄存器不会被系统复位,各个寄存器都有2个,每个都有16位。
- 数据存储功能:RTC和后备寄存器不会被系统或电源复位;当从待机模式唤醒时也不会被复位;后备寄存器可用于保存掉电时的数据。
- RTC和后备寄存器通过一个开关供电,在VDD有效时该开关选择VDD供电,否则由VBAT引脚供电,在VBAT供电时仍可以继续工作。
- 两个独立复位:APB1接口由系统复位,RTC核心只能由后备域复位。
RTC基本配置步骤
- 使能对RTC的访问:使能PWR&&BKP时钟、使能对后备寄存器和RTC的访问权限。
- 设置RTC时钟源:激活LSE,设置RTC的技术时钟源为LSE。
- 进入配置模式:等待RTOFF位为1(上一次对RTC寄存器的写操作已经完成),设置CNF位为1。
- 设置RTC寄存器,设置分频值、计数值等,一般只先设置分频值,CNT的设置独立。
- 清除CNF位,等待RTOFF为1即配置完成。
RTC基本驱动步骤
- 使能电源时钟并使能后备域访问:__HAL_RCC_PWR_CLK_ENABLE 使能电源时钟,_HAL_RCC_BKP_CLK_ENABLE 使能备份时钟,
HAL_PWR_EnableBkUpAccess 使能备份访问 - 开启LSE/选择RTC时钟源/使能RTC时钟,HAL_RCC_OscConfig 开启LSE,HAL_RCCEx_PeriphCLKConfig 选择RTC时钟源,__HAL_RCC_RTC_ENABLE 使能RTC时钟
- 初始化RTC,设置分频值以及工作参数,HAL_RTC_Init 初始化RTC,HAL_RTC_MspInit完成RTC底层初始化工作。
- 设置RTC的日期和时间:操作寄存器方式实现rtc_set_time
- 获取RTC当前日期和时间:rtc_get_time函数
时间设置和读取
F1的RTC没有日历寄存器,使用时只存储总秒数(CNT),不利于直接设置和显示,所以我们还需要编写函数把时间变成我们日常的日历时间。
全局的结构体变量canlendar存储时间信息