嵌入式系统课程设计报告
课程设计题目:
多功能电子钟设计
专业班级:
姓 名:
学 号:
指导教师:
2019 年 6 月 25
一、课程设计目的
1、进一步巩固掌握嵌入式系统课程所学 STM32F4 各功能模块的工作原理;
2、进一步熟练掌握 STM32F4 各功能模块的配置与使用方法;
3、进一步熟练掌握开发环境 Keil MDK5 的使用与程序调试技巧;
4、自学部分功能模块的原理、配置与使用方法,培养自学能力;
5、培养设计复杂嵌入式应用软、硬件系统的分析与设计能力。
二、课程设计内容
1、查阅资料,自学 STM32F4 的 RTC 模块,完成 RTC 的配置;
2、查阅资料,学习 STM32F4 与 LCD 的接口设计,完成 LCD 液晶屏驱动程序的
设计,将时间、日期、星期等日历信息显示在 LCD 上;
3、能进行正常的日期、时间、星期显示;
4、有校时、校分功能,可以使用按键校时、校分,也可以通过串口调试助手由
主机传送时间参数进行校时、校分;
5、能进行整点报时并有闹钟功能,闹钟时间可以设置多个;
6、系统关机后时间能继续运行,下次开机时间应准确;
7、查阅资料,学习 STM32F4 内部温度传感器的配置,采集、计算片内温度并显
示在 LCD 上;
三、实验方案分析与设计
1、RTC 实时时钟
实时时钟 (RTC) 是一个独立的 BCD 定时器/计数器。RTC 提供一个日历时钟、
两个可编程闹钟中断,以及一个具有中断功能的周期性可编程唤醒标志。RTC 还包含
用于管理低功耗模式的自动唤醒单元。两个 32 位寄存器包含二进码十进数格式 (BCD)
的秒、分钟、小时(12 或 24 小时制)、星期几、日期、月份和年份。此外,还可提供
二进制格式的亚秒值。系统可以自动将月份的天数补偿为 28、29(闰年)、30 和 31 天。
并且还可以进行夏令时补偿。其它 32 位寄存器还包含可编程的闹钟亚秒、秒、分钟、
小时、星期几和日期。此外,还可以使用数字校准功能对晶振精度的偏差进行补偿。上
电复位后,所有 RTC 寄存器都会受到保护,以防止可能的非正常写访问。无论器件状
态如何(运行模式、低功耗模式或处于复位状态),只要电源电压保持在工作范围内,
RTC 便不会停止工作。
图 1:RTC 工作原理框图
(1)RTC 相关库函数
①RTC 时钟源和时钟操作函数
void RCC_RTCCLKConfig(uint32_t CLKSource);//时钟源选择
void RCC_RTCCLKCmd(FunctionalState NewState)//时钟使能
②RTC 初始化函数
ErrorStatus RTC_Init(RTC_InitTypeDef* RTC_InitStruct);
typedef struct
{ uint32_t RTC_HourFormat;
//小时格式:24/12
uint32_t RTC_AsynchPrediv;
//异步分频 系数
uint32_t RTC_SynchPrediv; //同步分频系数
}RTC_InitTypeDe
③RTC 闹钟相关函数
ErrorStatus RTC_AlarmCmd(uint32_t RTC_Alarm, FunctionalState NewState)
void RTC_SetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm,RTC_AlarmTypeDef *RTC_Ala
rmStruct);
void RTC_GetAlarm(uint32_t RTC_Format, uint32_t RTC_Alarm, RTC_AlarmTypeDef*
RTC_AlarmStruct);
void RTC_AlarmSubSecondConfig(uint32_t RTC_Alarm, uint32_t RTC_AlarmSubSecondValue,
2
uint32_t RTC_AlarmSubSecondMask) uint32_t RTC_GetAlarmSubSecond(uint32_t RTC_Alarm);
④RTC 周期唤醒相关函数
void RTC_WakeUpClockConfig(uint32_t RTC_WakeUpClock);
void RTC_SetWakeUpCounter(uint32_t RTC_WakeUpCounter);
uint32_t RTC_GetWakeUpCounter(void);
RTC_WakeUpCmd(DISABLE);//关闭 WAKE UP
⑤RTC 中断配置以及状态相关函数
void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState);
FlagStatus RTC_GetFlagStatus(uint32_t RTC_FLAG);
void RTC_ClearFlag(uint32_t RTC_FLAG);
ITStatus RTC_GetITStatus(uint32_t RTC_IT);
void RTC_ClearITPendingBit(uint32_t RTC_IT);
⑥RTC 相关约束函数
void RTC_WriteProtectionCmd(FunctionalState NewState);//取消写保护
ErrorStatus RTC_EnterInitMode(void);//进入配置模式,RTC_ISR_INITF 位设置为 1
void RTC_ExitInitMode(void)//退出初始化模式。
⑦其他相关函数
uint32_t RTC_ReadBackupRegister(uint32_t RTC_BKP_DR);
void RTC_WriteBackupRegister(uint32_t RTC_BKP_DR, uint32_t Data)
void RTC_ITConfig(uint32_t RTC_IT, FunctionalState NewState);
(2) RTC 配置的一般步骤
● RTC 闹钟配置一般步骤
①RTC 已经初始化好相关参数。
②关闭闹钟:RTC_AlarmCmd(RTC_Alarm_A,DISABLE);
③配置闹钟参数:RTC_SetAlarm();
④开启闹钟:RTC_AlarmCmd(RTC_Alarm_A,EABLE);
⑤开启配置闹钟中断:
RTC_ITConfig();
EXTI_Init();
NVIC_Init();
⑥编写中断服务函数:RTC_Alarm_IRQHandler();
3
● RTC 周期性自动唤醒配置一般步骤
①RTC 已经初始化好相关参数。
②关闭 WakeUp:RTC_WakeUpCmd(DISABLE);
③配置 WakeUp 时钟分频系数/来源: RTC_WakeUpClockConfig();
④设置 WakeUp 自动装载寄存器:RTC_SetWakeUpCounter();
⑤使能 WakeUp : RTC_WakeUpCmd( ENABLE);
⑥开启配置闹钟中断:
RTC_ITConfig();
EXTI_Init();
NVIC_Init();
⑦编写中断服务函数: RTC_WKUP_IRQHandler();
2、温度传感器
温度传感器可用于测量器件的环境温度 (T A )。
● 对于 STM32F40x 和 STM32F41x 器件,温度传感器内部连接到 ADC1_IN16
通道,而 ADC1 用于将传感器输出电压转换为数字值。
● 对于 STM32F42x 和 STM32F43x 器件,温度传感器内部连接到与 VBAT 共
用的输入通道 ADC1_IN18:ADC1_IN18 用于将传感器输出电压或 VBAT 转换为数字
值。一次只能选择一个转换(温度传感器或 VBAT)。同时设置了温度传感器和 VBAT
转换时,将只进行 VBAT 转换。不使用时可将传感器置于掉电模式。
读取温度
图 2:温度传感器框图
4
要使用传感器,请执行以下操作:
● 选择 ADC1_IN16 或 ADC1_IN18 输入通道。
● 选择一个采样时间,该采样时间要大于数据手册中所指定的最低采样时间。
● 通过将 SWSTART 位置 1(或通过外部触发)开始 ADC 转换
● 读取 ADC 数据寄存器中生成的 V SENSE 数据
● 使用以下公式计算温度:
温度(单位为°C)= {(V SENSE —V 25 ) / Avg_Slope} + 25
注意: 传感器从掉电模式中唤醒需要一个启动时间,启动时间过后其才能正确
输出 V SENSE 。 ADC 在上电后同样需要一个启动时间,因此,为尽可能减少延迟间,
应同时将 ADON 和 TSVREFE 位置 1 。
温度传感器的输出电压随温度线性变化。由于工艺不同,该线性函数的偏移量取
决于各个芯片(芯片之间的温度变化可达 45 °C)。
内部温度传感器更适用于对温度变量而非绝对温度进行测量的应用情况。如果需
要读取精确温度,则应使用外部温度传感器。
3、外部中断/ 事件控制器 (EXTI)
外部中断/事件控制器包含多达 23 个用于产生事件/中断请求的边沿检测器。每
根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升沿触
发、下降沿触发或边沿触发)。每根输入线还可单独屏蔽。挂起寄存器用于保持中断请
求的状态线。
图 3:外部中断/事件控制器框图
(1)EXTI 控制器的主要特性如下:
5
● 每个中断/事件线上都具有独立的触发和屏蔽
● 每个中断线都具有专用的状态位
● 支持多达 23 个软件事件/中断请求
● 检测脉冲宽度低于 APB2 时钟宽度的外部信号。
(2)按键硬件连接
图 4:按键与 STM32F4 连接原理图
(3)外部中断常用库函数
①void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex);
//设置 IO 口与中断线的映射关系
exp: SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//区别 M3
②void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
//初始化中断线:触发方式等
③ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
//判断中断线中断状态,是否发生
④void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
//清除中断线上的中断标志位
⑤RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
//使能 SYSCFG 时钟,PS:这个函数非常重要,在使用外部中断的时候一定要先使能 SYSCFG
时钟
⑥EXTI_Init 函数
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
typedef struct
{
uint32_t EXTI_Line;
//指定要配置的中断线
EXTIMode_TypeDef EXTI_Mode;
//模式:事件 OR 中断
6