一、流水灯实现
(一)cubemx配置
首先打开我们的cubemx,点击上方file选项后选择new project
进入后在搜索栏输入我们板子的型号,本文采用的板子是STM32F103C8T6
选中我们的板子然后进行双击就能进入我们的配置界面
接下来我们点击左侧的System Core,配置我们的SYS和RCC 。
配置SYS,我们选择Serial Wire,这是因为我们选择了STlink进行调试和烧录。如果各位选用的是JTAG进行烧录就选择JTAG,4pin和5pin的区别在于5pin多了一个复位引脚。
接下来配置我们的RCC,将时钟都配置为晶振就行
然后是我们的GPIO,因为我们这次实验只需要用到GPIO的输出,所以我们的GPIO只需要配置输出模式就了。我们只需要点击对应的的引脚,选择输出模式就行了。
我选用的是PA5、PA6、PA7三个引脚做为我们的GPIO输出,配置完后对应引脚会变为绿色,如下图所示。
选择完成过后,点击左侧的GPIO,我们将三个引脚的GPIO output level配置成high ,这表示开始时我们的引脚默认为高电平。当然,默认的状态也行。
接下来对GPIO的配置进行一定解释
GPIO output level:有low和high两种选择,一般选择low
GPIO mode:推挽输出和开漏输出两者模式,两者模式的区别在于推挽输出中1代表VCC,0表示GND;开漏输出中1代表高阻态,0代表GND。
GPIO Pull-up/Pull-down:输入需要上下拉,输出一般没有上下拉
Maxinum output speed: 最大的输出速度,一般选择low就可以了。
接下来对我们的系统时钟树进行配置。点击上方的Clock Configuration,出现下方的图样。
我们只需要改变矩形中的部分就可以了,它的默认位置选择的 是HSI,我们选择PLLCLK就行了。
然后再点击上方的Project Manager,对我们文件的名字以及保存路径进行设置,值得注意的是,编译器的选择按照图中红色矩形配置(按照自己的编译器来选择)
如果各位在最后生成代码时出现
"The Firmware Package(STM32Cube FW_F1 V1.8.5)or one of its dependencies required by the Project is not available in your STM32CubeMX Repository" 的字样,可能是因为固件包太老了,出现这种情况的时候,就像图中的绿色矩形一样配置,当然,固件库的版本要选择自己有的版本。
点击左侧的Code Generator,按下图进行配置:
接下来点击我们右上角的GENERATE CODE就能生成代码了,生成过后选择open project他就会自动帮我们打开keil5项目。
(二)keil5编写流水灯代码
打开后在我们主程序的while循环中编写我们的流水灯代码就行。
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 灯1亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); // 灯2亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); // 灯2灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); // 灯3亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); // 灯3灭
代码如上所示。
(三)实物连接
从我们的代码知道,当我们将引脚电平置为0时,灯亮,也就是低电平点亮。所以我们需要将我们LED的正极引脚与我们面包板的正极相连,负极引脚和我们的开发板引脚相连。
值得注意的是,各位一定要将开发板的3.3V端和接地端分别与面包板的正负极相接。
二、使用外部中断控制流水灯
(一)cubemx配置
按照上述方式配置我们的SYS、RCC,GPIO三个led的配置依旧不变,我们增加PB3作为我们外部中断源,点击我们的PB3引脚选择中断模式,如下图所示。
配置好后,我们的引脚会变为绿色。然后,点击左侧的NVIC选项,按下图顺序配置。
然后是我们的时钟配置,按照下图进行配置
然后就是生成我们的代码,生成后,还是照样打开我们的keil进行代码的编写。
(二)keil5进行流水灯控制
进入keil后,我们先对程序进行全局编译,也就是左上角两个向下的小箭头。因为待会儿我们会用到函数跳转,如果不进行编译的话,那么我们就不能跳转到对应的函数。
编译后,找到并打开我们的stm32f1xx_it.c 文件,在其中找到我们的中断控制服务函数
点击或双击 HAL_GPIO_EXTI_IRQHandler,然后右键选择跳转函数定义处或者直接F12,我们就会直接跳转到函数定义的位置。在这个函数下方,我们能发现这样一个函数。
这个就是我们的中断反馈函数,因为该函数定义前有_weak,我们需要在主函数内进行重定义。在main.c里面,我们在主函数main上方定义一个中断标志并且重定义中断反馈。
int led_flag=0;
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==1)//当PB3置于高电平时,将标志置为1
{
led_flag=1;
}
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3)==0)//当PB3置于低电平时,将标志置为0
{
led_flag=0;
}
}
在主函数中的while循环内编写我们的流水灯代码。
if(led_flag==1)//当中断标志位为1时,流水灯工作
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); // 灯1亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); // 灯2亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); // 灯2灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET); // 灯3亮
HAL_Delay(1000); // 延时1s
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); // 灯3灭
}
else if(led_flag==0)//当中断标志位为0时,流水灯停止
{
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); // 灯1灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); // 灯2灭
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_SET); // 灯3灭
}
(三)实物连接
与流水灯的实物连接相同,唯一多的是在PB3引入一根导线作为开关。
三、Proteus仿真
首先需要安装proteus8.15版本,没有的小伙伴可以在下方链接获取。
通过百度网盘分享的文件:Proteus8.15.zip
链接:https://pan.baidu.com/s/1Lo6f9be-NikFRLOuX3KFyg?pwd=1234
提取码:1234
(一)新建一个proteus工程
点击首页的新建工程,修改我们的工程名字和保存路径,最好是不要有中文。
一直点击next知道创建固件项目这一步,选择创建固件项目。
然后一直点击next直到打开工程原理图。
(二)配置原理图并进行仿真
流水灯实验非常简单,只需要将三个流水灯配置到相应端口就行了。如下图所示。
连接好后,双击我们的芯片选择我们在keil仿真产生的hex文件,从cubemx生成的代码中编译的文件生成的仿真文件保存在
FLU_LED是我的工程名,大家可以对照自己的文件找到,我们将hex文件放进去后,就可以点击左下角的三角形符号进行仿真了。
对于中断控制流水灯而言,操作步骤都是一样,只是多加了一个开关而已。
四、keil仿真
点击魔术棒,点击Debug选项,将配置改为图中的模样。
然后点击debug进行调试。点击view-analysis windows-logic analyzer。
点击弹出窗口左上角的setup 将我们的输出端口输进去后,点击OK就能看到我们的输出波形了
五、总结
本文详细介绍了基于 STM32F103C8T6 板子实现流水灯及使用外部中断控制流水灯的过程,包括从 cubemx 配置、keil5 代码编写、实物连接到 Proteus 仿真以及 keil 仿真的一系列步骤。
在流水灯实现部分,首先于 cubemx 中进行板子型号选择,对 SYS 选择 Serial Wire(依据调试烧录工具选择)、RCC 配置为晶振,将 PA5、PA6、PA7 配置为 GPIO 输出模式且输出电平设为高电平,配置系统时钟树并设置项目名称、保存路径与编译器等相关参数后生成代码并在 keil5 中编写流水灯代码,通过控制引脚电平高低实现流水灯效果,实物连接时注意 LED 正负极与开发板引脚以及开发板电源端与面包板的连接。
使用外部中断控制流水灯时,cubemx 配置在上述基础上增加 PB3 作为外部中断源并配置 NVIC 和时钟,生成代码后在 keil5 中先编译再在 stm32f1xx_it.c 文件中重定义中断反馈函数,在主函数中依据中断标志位控制流水灯工作与否,实物连接多了 PB3 作为开关的导线连接。
Proteus 仿真需安装 8.15 版本,新建工程并配置原理图,将对应端口连接流水灯并导入 hex 文件即可仿真,中断控制流水灯类似只是多了开关。keil 仿真则需在魔术棒的 Debug 选项中进行配置后调试并通过 view - analysis windows - logic analyzer 查看输出波形。通过这些步骤可完整地实现流水灯及外部中断控制流水灯功能,并进行相关的仿真测试与验证。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_74267512/article/details/144134332
|