使用Cubemx开发keil5的stm32f103c8t6使用定时器中断实现交通灯(使用OLED显示时间)(末尾附源码工程,可复刻)

一、准备过程:

开发工具:Cubemx(非ide版本,需要与keil5联合使用),keil5

硬件工具:江协资料包(仅使用面包板,按键,跳线,LED灯,OLED屏幕电阻,ST_Link下载器等)

二、实验设计思虑、流程与效果呈现:

 1、实现LED点亮功能

1、点击此处新建工程

2、在该搜索框进行搜索STM32F103C8,即可出现f1最小系统板(f103c8t6使用的否03C8Tx)

双击下图中的字样(截图的时候挡住了,多担待)

3、芯片选择好以后配置SYS的Debug选项为Serial Wire

4、配置RCC的时钟为Crystal/Ceramic Resonator

5、配置右侧芯片的GPIO口的输入输出口,配置PA2为GPIO_Output,驱动1个LED灯

(先点个灯,下方第一个图是配置1个灯,第二个图是配置了两个灯并且修改了左侧的该GPIO的初始输出引脚的电平,可直接看第二个灯的配置自行配制)

第五步选择该IO口的输出电平

6、配制使能时钟

        第一步找出时钟树,第二部修改该处时钟,F1的话,外部最高时钟为72MHz,直接改为72,回车,回车后可能有弹窗,不用管,必须点击OK,让它自动配置时钟树

成功图

7、修改工程的详情(名称路径一类)

该界面向下滑(可不用,如果你下载了最新版本的固件包)

8、选择该处进行生成对应启动外设的.c/.h文件(图3是启用多个I/O口进行LED灯输出的设置GPIO口的图,有兴趣可以看看)

9、在keil5中(有些配置我没说,这里用不到,因为我不打算新建.c和.h文件,我能力有限,本次工程代码太简单,不需要那么多文件)

(该图第七步不是点击add,是点击下方确定,之后在点击一个OK,我不想换图了)

10、随便写几句代码

2、实现OLED点亮与字符显示(4引脚OLED)

第一步:复制启动代码进入工程,还是要新建一个文件夹【尬笑】,复制文件

        图1:新建一个名为BSP的文件夹,

        图2:复制三个文价,这三个文件可以驱动四引脚的OLED屏幕,驱动函数我待会儿写

第二步:将文件夹与文件添加至工程中

成功后这里会出现一个这个,一定要检查有没有!!!没有就是添加不成功  以后所有的文件与文件夹的添加皆是如此

第三步:进行Cubemx配置(很简单、就两张图几步,与OLED通信使用I2C)

                注:若工程打开,则不要重复打开工程,然后回keil5一直点击是是是!!!

                        (若发现你以前弄得BSP没在工程中,别紧张,重新加一边或者关了工程重开)

                        (或者看看你在C/C++界面的东西是否添加正确)

下面修改keil5中的代码,检查其是否正常,第三行输出GGE

3、实现基本定时器进行定时

Cubemx设置:

使能其中断(设置1秒钟中断触发1次,用来当时间的倒计时)(一个多用我试过了,没反应)

keil5的设置:

4、实现按键功能(定时器产生中断)

cubemx对按键引脚进行初始化:

重新使能一个计数器,对按键扫描时间中断进行计数:

在keil5进行设置:

首先:在main.c中定义一个key的结构体进行消抖,具体方法:

if(htim->Instance == TIM4)
		{
			key[0].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_12);
			key[1].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_13);
			key[2].key_sta = HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14);
			
			for(int o = 0;o<3;o++)
			{
				switch (key[o].key_num)
				{
					case 0:
					{
						if(key[o].key_sta == 0)
						{
							key[o].key_num = 1;
						}
					}
					break;
					case 1:
					{
						if(key[o].key_sta == 0)
						{
							key[o].key_num = 2;
							key[o].key_flag = 1;
						}
						else
							{
								key[o].key_num = 0;
							}
					}
					break;
					case 2:
					{
						if(key[o].key_sta == 1)
						{
							key[o].key_num = 0;
						}
					}
					break;
				}
			}
		}

至此按键已经实现,调用按键只需要使用key[o].key_flag == 1即可。每次调用结束要手动将按键标志位清零,防止重复调用。

5、实现各个功能的联合产生一个简易的交通灯

我懒得写了,直接上工程吧,基本功能都实现了,只需要再打包组装一下就可以直接出结果了(功能:按键按下进行时间的加减功能,能对三个数值分别进行加减功能(红绿黄三个灯都可被加减))

电路连接:PA2~PA7连接LED与地

                    按键电路:(电阻用1k的,2端口接PB12,三个按键分别接12,13,14)

                        

                OLED的四个引脚,一个接电源,一个接地,另外俩接法看Cubemx的图

                到此结束。

                我不会上传视频,放俩图意思意思吧。(发现个bug,有一行显示忘了没打空格,会出现胡乱显示(那个80就是,后面一位没有清屏,是之前的计数的残留))

链接:https://pan.baidu.com/s/1l3stFHT9YbioSaVkmtg_AA 
提取码:uj4z

  • 32
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值