STM32模拟时钟
项目平台:STM32F103 是一款 Arm 架构Cortex-M3芯片。此次活动使用的口袋开发平台上采用的是STM32F103RBT6,具有128KB Flash,20KB Ram,足以满足大部分的简单需求。作为一块完整的开发板,该口袋平台上具有独立按键、蜂鸣器、姿态传感器、LCD等多种基础的片外外设。
本项目实现模拟时钟显示、更改时间、整点报时、正向显示始终朝上功能。
所用板子资源介绍:定时器、LCD——SPI、协议按键——外部中断、MPU6050——I2C协议、SD卡——硬件SPI及FATF系统
液晶驱动: 该液晶屏为串行spi接口,实际硬件连接并未接到stm32硬件spi接口,所以采用软件模拟spi,为提高刷新速率,对引脚操作采用直接寄存器操作,本项目实现模拟时钟显示及数字时钟功能,因此液晶显示需要完成指定位置图片显示,画线,数字显示,汉字显示,翻转显示等功能。
按键驱动部分: 配置按键引脚为输入上拉模式,循环扫描,硬件有4个按键,即可实现确定返回,上下调节功能,无需复杂功能,单击按键功能即可满足功能。
蜂鸣器驱动部分:硬件采用无源蜂鸣器,通过不同频率使其导通,即可播放不同音调,由于蜂鸣器驱动没有接到stm32硬件定时器输出引脚,无法直接通过硬件pwm驱动,本项目采用定时器翻转蜂鸣器驱动引脚,模拟pwm输出,配置通用定时器,周期为1ms,在定时器中断回调函数翻转蜂鸣器引脚,当需要蜂鸣器播放声音时,打开定时器即可,关闭声音时,关闭定时器即可。
采用仿真器为单片机提供时钟源的时候,遇到等待外部时钟源稳定时间过短,上电后仿真器还没准备好时钟输出,单片机等待外部时钟源超时,导致外部时钟源无法初始化成功,采用内部低速时钟源,屏幕刷新过慢,处理结果是增大等待外部时钟源稳定时间。屏幕刷新优化,在设置时钟界面时,旋转屏幕需刷新全屏,刷新全屏时有点慢,影响美观,后来通过局部覆盖的方式。
最后,实现屏幕的翻转,这部分我有两个想法,一种是通过实时更改LCD驱动中相应寄存器(控制色块刷新以及数据传输方向的寄存器,驱动代码中有),另一种则是更改画图函数,根据翻转角度实时更新,即做出每种翻转情况下的作图。也因为当时我做的时候是把屏幕翻转放在最后一步,故选择了第一种方法。由于最开始用的LCD驱动不能改方向,这部分研究甚久,功夫不负有心人,更换移植了多次LCD驱动终于成功。
整点报时需要使用蜂鸣器,开发板上的蜂鸣器是无源的,需要2k-4kHz的PWM波驱动它,很遗憾蜂鸣器的引脚PC10没有定时器复用功能,不能由该引脚直接产生PWM,需要初始化其他定时器定时中断反转PC10电平达到PWM驱动效果,至于整点报时只需判断时间是否到整点,再执行蜂鸣器即可;
源码链接:https://pan.baidu.com/s/12sJHxmSmPYD_xwY5o7cWag
提取码:6666
说明文档:链接:https://pan.baidu.com/s/14HTgoE-XHET6lKLzObf9ow
提取码:6666