任务要求
使开发板上的LED2小灯闪烁,亮一秒灭一秒(延时实现)
1. 如何点亮LED小灯?
2. LED2是那个小灯?
3. 开发的具体流程是什么?
LED灯就是发光二极管,图中的两个器件都是LED灯,右侧的图片是贴片LED灯,我们的开发板上所使用的就是贴片LED灯。发光二极管电压是1.8V到2.2V,靠电流驱动,就是说电流达到一定的值,就会点亮LED灯,电流的范围是1到20mA,在1到5mA亮度有所变化,5mA以上亮度基本无变化。电流如果小于1mA的话LED灯不亮。
接下来看如何点亮LED灯。LED灯是二极管的一种,有正极和负极,也是正向导通,反向截止。这个图当中LED灯正极连接VCC(3.3v),负极连接一个电阻后与地相连,这样LED就正向导通,LED灯点亮。如果LED灯上的电压是1.8V,那么电阻上的电压就是1.5V,刚才我们提到点亮LED灯的电流是1~20mA,电阻与LED灯串联,电阻的电流就应该与LED灯的电流相同,根据欧姆定律可以得到电阻的阻值范围就是75欧到1500欧。我们反过来考虑电阻阻值的大小可以限制LED灯电流的大小,因此这个电阻也被称为限流电阻。比如说电阻选择的是1k,那么通过LED灯的电流也就确定了是1.5mA,接下来我们把接地去掉,改成GPIO接口,GPIO可以通过编程控制输出高电平还是低电平。如果GPIO输出低电平,二极管从正极到负极有压差,电路导通,LED小灯就会点亮。如果GPIOP输出高电平·,LED小灯左侧是高电平,右侧是高电平,小灯不会点亮·。那么如何让LED小灯闪烁呢?学习了51单片机大家就应该知道LED小灯的闪烁其实就是亮灭的交替,但是由于人眼的视觉暂留效应,要使人眼能看出小灯的闪烁,就需要点亮小灯后延时保持一会,然后再熄灭小灯,熄灭后再延时保持一会,这样一亮一灭就实现了小灯的闪烁。我们现在明白了如何点亮一个LED灯,那么任务要求中的LED2是哪一个小灯,我们应该怎么控制呢?要想了解这个问题,我们就需要查看主控板·电路图。
电路图比较复杂,我们先重点查看需要的电路部分,中间是stm32F103VET6微控制器芯片。它共有100个引脚,每一侧都有25个。GPIO引脚是按照PA、PB一直到PE进行分组的,每组16个GPIO接口。比如说PE组就是从PE0到PE15一共16个引脚,但是每一组IO口并不是连着排列的,而且根据封装的不同,也不是所有的GPIO口都引出来了。
开发流程
首先在STM32CubeMX中进行功能配置
1. 建立工程文件夹
2. 选择MCU型号
3. 配置GPIO功能
4. 配置调试端口
5. 配置时钟树
6. 保存STM32CubeMX工程
7. 生成C代码初始工程
接下来将生成C代码的初始程序导入MDK-ARM编辑编译代码
1. 打开工程文件
2. 完善main()函数
3. C代码工程配置
4. 编译工程
最后进行下载调试
1. 可以使用ST-Link在线仿真调试,并下载程序到开发板上运行
2. 使用智慧盒FlashLoader程序下载hex文件到开发板上运行查看结果
首先建立STM32工作目录,文件名是STM32_WorkSpeace,用于保存所有的任务工程。
然后打开这个文件夹,在这个文件夹下再新建一个文件夹,用于保存本项目工程。这个文件夹的名字是test1。test1文件夹用于保存一会我们新建的项目工程。
接下来打开STM32CubeMX工具,点击ACCESS TO MCU SELECTOR,进入MCU选择窗口。
可以在页面左上角的搜索框输入MCU型号的关键字,比如说输入STM32F103VE,页面就会显示MCU的型号,然后选择STM32F103VETx芯片,点击右上角的Start Project,新建STM32CubeMX工程。
这是STM32CubeMX的配置界面,上面一共有四个标签页,分别是引脚与配置(Pinout&Configuration)、时钟配置(Clock Configuration)、工程管理(Project Manager)、工具(Tools)。
引脚与配置进行芯片的引脚配置,以及相应的功能配置。时钟配置用于配置时钟树。工程管理用于配置工程以及代码的生成相关参数。
先来看一下引脚与配置,左侧是不同的配置项,右侧是微控制器芯片引脚视图。项目当中使用PE6引脚控制LED灯的闪烁,可以直接找到PE6引脚,也可以在右下角的搜索框中输入PE6进行查找,找到的引脚会进行闪烁。在PE6引脚上点击鼠标左键,可以设置引脚功能。在这里我们把PE6引脚设置为输出引脚(GPIO_Output)来输出高低电平用来控制LED灯的闪烁。然后在PE6引脚上单击鼠标右键,可以设置用户标签(Enter User Label)把名字修改为LED2。在引脚视图中对我们所使用的引脚完成初步配置之后,接下来需要对GPIO口进行详细配置。
点击左侧配置项当中的System Core(系统内核),点击GPIO就这里出现了GPIO的配置页,因为我们刚才只配置了PE6引脚,因此在这个配置页中只列出了PE6,左键点击出现详细配置页,我们来看一下各个配置项,GPIO output level是配置引脚的初始输出电平,可以选择高电平(High)或低电平(Low),通过上面的分析我们知道输出低电平时点亮LED灯,高电平时熄灭LED灯。初始时一般会让小灯熄灭,然后在程序当中再编程点亮,因此设置PE6的初始输出电平为高电平(High),小灯熄灭。
再来看一下它的输出模式,它的输出模式有两种,分别是推挽输出(Output Push Pull)和开漏输出(Output Open Drain)。推挽输出是指引脚既可以输出高电平也可以输出低电平。而开漏输出引脚只可以输出低电平,如果想要输出高电平的话,还需要外接上拉电阻,因此这里我们选择推挽输出(Output Push Pull)。
接下来再看上拉下拉电阻设置,分别是没有上拉和下拉电阻(No pull-up and no pull-down)、没有上拉电阻(Pull-up)、没有下拉电阻(Pull_down),在这里我们选择没有上拉或下拉电阻。
接下来是引脚最大输出速率,这里我们默认选择LOW就可以,再往下就是User Label(用户标签),我们已经填写为LED2,当然你也可以在这里对它进行修改。
接下来配置调试端口,仍然是在System Core选项下,点击SYS配置Debug,下拉菜单可看到选项支持JTAG接口和SWD串行单线接口与仿真器相连进行在线调试。JTAG接口体积大,且占用较多的GPIO资源。Serial Wire是串行单线的意思,可以缩写为SW,它用来表示SWD串行单线调试接口,它只需要两条线,分别是时钟信号线和数据信号线,一般用于ST-Link仿真器,我们选用的就是SWD接口和ST-Link仿真器。所以这里就将Debug修改为Serial Wire串口线,表示采用SWD接口进行调试,同时在引脚视图当中我们会发现设置了相同的引脚。PA14被设置成了SWCLK(时钟同步线)、PA13被设置为了SWDIO(数据信号线)。这两根线就用于ST-Link的连接和仿真调试。
配置完端口后,接下来配置MCU时钟树,仍然在System Core选项下,点击RCC复位时钟配置,High Speed Clock (HSE)是外部高速时钟,将它配置为Crystal/Ceramic Resonator(晶体陶瓷谐振器),就是外部晶振。Low speed Clock(LSE)是外部低速时钟,同样也将其配置为Crystal/Ceramic Resonator(晶体陶瓷谐振器),也是外部晶振。同时引脚视图中相应的引脚功能也被配置。
接下来我们来看STM32CubeMX的配置界面上的第二个标签页时钟树的配置。我们可以先根据图片简单的了解各个模块。
接下来我们首先在时钟源选择器当中选择外部高速时钟(HSE),选择完成后时钟频率就会变成8兆赫兹,然后倍频器选择倍频系数x9,那么频率就会倍频为72兆赫兹。然后在系统时钟源选择器当中选择PLLCLK,系统时钟(SYSCLK)也就变成了倍频后的72兆赫兹。接下来再配置HCLK(高性能总线时钟),AHB Prescaler是高性能总线时钟分频器,在这里我们选择1分频,也可以说是没有分频。这样高性能总线时钟的频率就是72赫兹。Cortex System timer 是系统嘀嗒定时器,需要对HCLK时钟源进行8分频,将系统嘀嗒定时器的时钟设置成9兆赫兹。接下来是APB1(低速外部总线时钟)以及APB2(高速外部总线时钟)的设置。APB1是对HCLK时钟源的2分频,将其设置为36兆赫兹,APB2仍然使其保持72兆赫兹。这样就完成了时钟树的配置,我们先不生成C代码,先保存一下STM32CubeMX工程,点击File,找到Save Project保存工程,选择我们一开始建立的文件夹test1点击保存,这样我们就完成了STM32CubeMX的保存。
保存完工程后,我们切换到Project Manager(工程管理)标签,进行C代码工程的配置。Project选项用于进行工程保存的相关配置。我们刚才已经保存过了,工程名和路径在这里都有显示,在下面两项都是默认值。需要修改的只有Toolchain/IDE选项,设置集成开发环境为MDK-ARM V5.其他内容不用设置。
接下来点击Code Generator进行代码生成配置。首先配置固件库包模式。第一个是拷贝所有的库文件到工程目录下,第二个是只拷贝必要的库文件,第三个是添加需要的库文件引用到工程配置文件中,我们在这里选择第二个。接下来配置生成文件,第一项是指不同的外设生成各自的“.c”或“.h”文件。第二项是重新生成时备份以前生成的文件,第三项是重新生成时保留用户代码,第四项是不重新生成时删除以前生成的文件,这里已经默认选择了第三和第四项,我们再把第一项勾选上就可以了。Advanced Settings是高级设置,我们暂时不做处理。这样工程管理我们就配置完了,点击GENERATE CODE生成代码按钮,生成相应的C代码工程。
这里是提示已经成功的生成了代码,它位于test1目录下,大家可以选择打开目录,也可以选择打开工程。
我们这里选择打开目录看一下,在test1目录下又多了一些文件,MDK-ARM就是C代码工程文件,双击打开后包含三个选项,test1是工程文件,我们可以双击打开跳转到uVision®5。这样就打开了MDK-ARM集成开发环境,并且导入了test1工程。如果刚才在STM32CubeMX当中直接选择打开工程,同样会来到这个页面。
点击test1工程前面的加号,先来看一下C代码工程架构,整个工程的源文件被分成四个组,分别是Application/MDK-ARM、Application/User、Drivers/STM32Fxx_HAL_Drivers、Drivers/CMSIS用户编写的程序主要位于Application/User当中,点击Application/User前面的加号,main.c为主程序所在文件,gpio.c主要包含GPIO初始化相关程序,stm32f1xx_it.c存放各种中断函数。双击打开main.c文件,找到主函数main函数,main函数里面并不是空白的,因为我们在STM32CubeMX当中的配置已经生成相应的C代码,这些代码就对应了我们在CubeMX当中的配置,先来对这个工程进行一下编译。编译完成后,大家会发现main.c这些文件前面多出了一个加号,说明它使用的头文件都已经编译进来了。
HAL_Init();是HAL初始化,系统外设初始化,SystenClock_config();是系统时钟配置,是系统时钟初始化。MX_GPIO_Init();这是MX当中对GPIO接口的初始化,点击右键,我们可以看一下这个函数的定义。
首先是对GPIO口的时钟进行使能。HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_pin,GPIO_PIN_SET);是设置引脚的初始输出电平,分别看一下这几个参数,LED2_GPIO_Port它其实就表示GPIOE,表示PE组。再来看一下LED2_pin,表示的就是GPIO_PIN_6,结合刚才的第一个参数,所以它表示的就是PE组的6引脚,也就是PE6。GPIO_PIN_SET其实就是表示1。结合起来看一下就是调用HAL库当中GPIO函数把PE6引脚设置为高电平。也就是设置PE6引脚为高电平。再往下就是设置引脚的输出模式:上拉下拉电阻、最大输出速率。通过调用HAL_GPIO_Init函数完成对GPIO初始化的设置。回到main.c当中,main函数先执行了HAL_Init(); SystemClock_config();MX_GPIO_Init();这三个初始化函数,然后就进入了whlie(1)循环,程序就一直在这个循环里执行,因此需要在whlie(1)当中输入用户代码。通过上面讲的我们知道要想使LED灯闪烁,其实就是控制LED灯亮灭交替。所以我们需要编程控制PE6引脚低电平和高电平。
我们用HAL_GPIO_Writepin(GPIOE,GPIO_PIN_6,GPIO_PIN_RESET);来让PE6引脚输出低电平。将上行代码中RESET改成SET则表示输出高电平。但是如果只是让PE6不停的输出高电平和低电平,小灯的闪烁人眼是分不出来,所以我们需要调用延时函数,在它点亮和熄灭之后延时一会。HAL_Delay();延时函数的单位是毫秒,为了方便我们观察,我们可以将延时设置为1000。接下来在对程序进行编译,没有错误就完成了。
接下来进行C代码工程配置,点击魔术棒图标,打开配置页面,切换到Debug标签,在这里选择相应的调试工具,选择ST-Link Debugger,点击settings进入调试与下载配置界面配置调试工具端口,将端口设置为SW,如果微控制器与ST-Link连接正常的话,右上角的文本框中就会看到已连接的设备。接着点击Flash Download,进入下载配置界面,勾选Reset and Run选项,表示程序下载到STM32开发板之后会自动重启并运行,点击确定设置完成。回到配置页面,点击Output,勾选Create HEX File(创建hex文件),点击ok完成配置。回到主界面点击LOAD下载运行程序。之后将生成hex文件下载到智慧盒就可以实现小灯的闪烁了。
,