基于stm32f1时钟的多功能定时器(基本功能篇)

前言

       此题目是学院的一个科技竞赛题目,科技含量比较低,但是重在贴近生活,而且比较考验同学的编程能力,设计思路灵活,也算一个中肯的题目。  本篇博客中,依旧按照从拿到题目到完成题目的顺序进行介绍,重难点,博主会进行强调,或者单独列写博客。程序编写思路简单,但是代码量较大,属于提升类项目。

  1. 题目原型
  2. 题目分析及思路
  3. 材料采购
  4. 实际制作
  5. 遇到困难及解决方法
  6. 精彩代码片段分享
  7. 思路亮点分享
  8. 个人总结

1.题目原型

基于stm32f1时钟的多功能定时器(基本功能篇)_第1张图片

    

基于stm32f1时钟的多功能定时器(基本功能篇)_第2张图片

2.题目分析及思路(先介绍基础部分)

具有可设置定时功能:通过外部输入设备,设定时间(用什么作为输入设备,设定时间逻辑如何编写)

具有可设置的倒计时功能:联系STM32定时器的闹钟中断

具有可设置的预约功能:我的理解是,定时开启,定时关闭。

具有蓝牙遥控功能:我的理解是,通过蓝牙可以设定上述所有参数。

隐含要求:供电电路,显示屏,蓝牙通信,stm32定时器

基本功能思路

基于stm32f1时钟的多功能定时器(基本功能篇)_第3张图片

 

3.材料选型

主控芯片:STM32F103C8T6

外部输入设备,我选择是基本的普通按键,而非矩阵按键(占用引脚资源少)

显示屏:IIC通信的OLED屏幕。(如果要求炫酷,可以选用LCD彩色屏或者串口屏)

蓝牙:HC-05就可以

降压模块:12V转5V降压模块。

12V充电电池。

以上材料,就可以完成基本功能了。

完成提升功能所需材料:

               直流电转交流电模块、继电器、3.3V微型电池,大电容,EEPROM模块(可有可无)

4.实际制作:

          整个题目核心在于定时器的选择,我选择c8t6的外部晶振作为时钟源。(有很多同学声称c8t6硬件不支持定时功能,通过查询手册,博主发现它是完全能满足要求的)

          实际制作第一步:焊接c8t6,连接显示屏和按键。获取定时器当前时间,并且在显示屏上显示(注意将单位秒转换为年月日,就是万年历的知识)。编写显示屏定时显示程序,编写通过按键更改时间(长按轮询,短按确认),并且显示相关提示语。

         实际制作第二步:将杜邦线连接的线路改接到洞洞板上(上一步只是核实操作可行性),完善功能1,2 ,3(就是对于数据的录入,保存,设定,这里涉及到秒中断和闹钟中断)

        实际制作第三步:添加蓝牙模块,通过蓝牙发送时间,注意蓝牙调试方式以及stm32中对于数据的处理方式(存储空间有限,调取方式应当简单),以及数据协议的设定。可以不设定协议,但是传输距离稍远,发送数据的可靠性就未知了。

        实际制作第四步:添加单独供电电路,在电池插头与降压模块间使用了一个大电容,降低电压波动,防止突然上电+静电将芯片烧掉。并且,在提升功能中,掉电保存,可以通过ADC采集电压,当电压低于3.3V时,将当前的所有数据写入保存区中(eeprom模块或者用c8t6的flash模拟eeprom),由于电容作用,电压降低的时间得以延长。

实际制作第五步:融合基本功能,需要注意的是,各个外设之间不能重复,或者冲突。

实际制作第六步:系统掉电数据不丢失,可以采用EEPROM模块或者直接采用FLASH模拟eeprom(我采用的后一种),在网上有很多教程,我给上一个链接:https://www.cnblogs.com/HongYi-Liang/p/9047255.html  ,希望对大家有帮助。

实际制作第七步:保存5组数据,你可以选择设立5个数据存放区,通过数据发送的标识位,将不同数据存放到不同缓冲区。重点是,如何将数据给一一写入定时器中呢?这是重点,我采用的办法是对5组数据进行比较,将最小的数据优先写进去,等到一次闹钟触发之后,根据标志位的变化,从而写挑选写一个比较小的数据写进去的。

实际制作第八步:交流电调光调速功能。这个要求给的很模糊,后来给出,需要根据模电只是进行完成,小编搭建了一个简单电路(搜索一下,相关博客也有很多),搭配直流电转交流电的模块(贵)。

用继电器作为用电设备,演示所有功能。

5.遇到的困难以及解决方法   

困难1.文件容易弄混淆:我的解决办法是,一个工程,建一个文件夹,在各个文件下建立文本内文件,描述当前代码的进度以及实现的功能和缺点。如果只是改变了参数,那就在文本文件中写下某个参数对应的效果。如果从代码架构和编程思维上,有了改变,那么就单独建立文件夹,如此,就不容易混淆。

困难2.实现最多5组数据之间保存,并且准确应用:我的解决办法是,在数据的协议中,包含我将要发送数据的组数,据此在单片机内开辟存储空间,做到空间的高效利用。通过不同标志位区分,将数据存放到缓冲区,通过年月日数字进行冒泡排序法,然后重新弄存放数据,记录五组数据的编号,从小到大。将最小的数据存放进去,设定标志位,等到时间到来,触发中断,取消标志位,将第二小的数据存放进去,以此类推。

困难3.蓝牙设定数据与按键设定数据,是采用直接复制粘贴的关系,还是共用统一存储空间的关系呢?我采用的是后者,如果单独从编程难度上,前者更简单,但是,后者,才更接近实际工程需要,而且,C8T6的flash实在有限,不确定后续是否会增加功能。(极大考验了个人思维能力)

困难4.外观设计:无论实际怎样,外观始终都第一印象。前期忙着实现功能,不咋注重,后期才一发现,有点丑。外观设计与实际效果,最好二者兼顾。后来重新布局,才解决了这个问题。

6.精彩代码片段分享  

数据判断:基于stm32f1时钟的多功能定时器(基本功能篇)_第4张图片

基于stm32f1时钟的多功能定时器(基本功能篇)_第5张图片

稍后留下代码链接。

7.思路亮点分析:

信息交互,采用共用数据缓存区的方式,简短,高效。

对于传输精度有要求的项目,自己设计了通信协议。

通过ADC采集到电压变化,从而提前向FLASH中写入数据,而不是每输入一次数据,就向EEPROM中写入一次数据(为了保证数据实时性,代码会非常冗余)

在OLED屏幕上设计了一些简单的界面,增加量人性化提示语,以及“功能目录”。

个人总结:一个人独立做项目,非常锻炼个人能力,编程思路清晰,整个作品的每一个细节,突然出现的问题,都能比较快速的找到解决方案,但是,就小编个人而言,这样挺耗费时间的,如果有团队,大家一起讨论,集思广益,能更简短的搞定难题,但是,也存在人到心不到的情况,值得考虑。只有难题,才会激发自己去思考,只有思考了,才能更容易获得快乐和成长。

如果工程量比较大,那么,小编建议,可以写一份操作手册,或者使用说明,当间隔几天,也能快速重新找回思路。

 

 

 

 

 

 

你可能感兴趣的:(stm32,知识技能)