STM32入门 – 编写一个LED亮灯程序

玩单片机最开心的事,莫过于第一次点亮LED。

popgeek

前言:

余见学长毕业,随身之物皆弃之;不忍其靡,遂同室友一起捡垃圾。鄙人有幸捡到一个STM32单片机,芯片为STM32F03RCT6,上面还有个2.4寸的TFT屏幕。

本文写的很水、很没有技术含量,很多名词术语、知识可能都是错误的,因为我也只是刚会点亮LED,并不是老鸟,若文章有错误请直接指出,我会及时改正。

一、开发环境、资料:

开发板:未知(板子上没有刻任何型号信息)

核心芯片: STM32F103RCT6

软件环境:Keil4

STM32F10x系列启动文件:下载链接:https://cloud.fune.fun/s/jV5BuJ1HqLE 提取码:846325

Keil4工程模板下载:链接:https://cloud.fune.fun/s/DDQBjixNZap 提取码:516534

二、分析电路原理

1、分析LED接口

因为不知道板子型号,所以不知道LED灯等模块对应的接口,只能迎着光看电路板走线。这个STM32板子的LED1接在PC0接口上(不是所有的板子都是这样接线的,详情请参阅自己电路板的说明文件),LED2接在PC1接口上。所以我们控制PC0、PC1这两个接口,就能控制LED1、2的亮灭

同理,如果你需要控制其他的设备,只要控制对应的接口即可;例如:假如蜂鸣器接在PA3接口上,那么控制PA3接口,就能控制蜂鸣器、继电器接在PB9接口上,那么控制PB9接口,就可以控制继电器的开合。
STM32入门 - 编写一个LED亮灯程序
图很重要,但我估计你也看不懂,那就别看了。[狗头]

2、分析PC0、PC1接口

经查资料得知,若要控制PC0、PC1接口,需要先打开GPIO端口C的时钟。

同理,如果你要控制PB1接口,那就需要先打开GPIO端口B的时钟;要控制PA1,就打开GPIO.A的时钟

打开GPIO端口C后,就可以继续控制PC0、PC1接口了;根据资料显示,控制Pin_0就能打开PC0接口。

小结:如果要控制PC0接口,就控制GPIO端口C的Pin_0; 如果要控制PC1接口,就控制GPIO端口C的Pin_1

二、编写程序

因为库函数较为简单,所以程序是通过库函数来控制接口,如果你想通过寄存器或位操作来控制接口,请参考【B站视频教程】,或者等我更新[咕咕咕]

1、创建项目

Keil4软件安装后,解压“实验0 Template工程模板.zip”,进入USER文件夹,双击打开“Template.uv2”,打开后软件为下图所示:

STM32入门 - 编写一个LED亮灯程序

右键Template文件夹,选择Manage Components… ;图:

STM32入门 - 编写一个LED亮灯程序

点击红圈处的按钮,新增一行,填入HARDWARE,并点击OK。图:

STM32入门 - 编写一个LED亮灯程序

双击HARDWARE,在弹出的窗口中点击上一层目录按钮,再进入HARDWARE-LED,文件类型选择所有文件,选中led.c和led.h,并点击Add添加,图:

STM32入门 - 编写一个LED亮灯程序
STM32入门 - 编写一个LED亮灯程序
STM32入门 - 编写一个LED亮灯程序

添加完成后,左边的HARDWARE中会出现led.c和led.h两个文件。

STM32入门 - 编写一个LED亮灯程序

2、Ctrl C + Ctrl V

分别双击打开并编辑main.c、led.c、led.h三个文件:

main.c文件删除原来内容并填入下面内容:

#include "stm32f10x.h"  //STM32启动文件
#include "sys.h"        //打开LED0端口需要sys.h头文件
#include "led.h"        //LED初始化需要led.h头文件

 int main(void)
 {		
	LED_Init();     //LED端口初始化
	 while(1){      //循环
		LED0=0;   //打开LED0所在的端口

	 }
 }

led.c文件删除原来内容并填入以下内容:

#include "led.h"

void LED_Init(void)
{
 GPIO_InitTypeDef  GPIO_InitStructure;                   //声明一个结构体
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	//打开PC端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;	       //LED0-->PC.0 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;      //设置端口为推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     //设置IO口速度为50MHz
 GPIO_Init(GPIOC, &GPIO_InitStructure);		       //根据设定参数初始化GPIOC.0
 GPIO_SetBits(GPIOC,GPIO_Pin_0);	               //PC.0 输出高

}

led.h文件删除原来内容并填入以下内容:

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"  //控制输出端口需要sys.h头文件

#define LED0 PCout(0)  // 定义LED0 PC0

void LED_Init(void);  //初始化
		 				    
#endif
  • 注意1:每个文件最后一行都要加一个新的换行,不然编译时会有一个Warning。
  • 注意2:我的板子LED1的控制接口是PC0,如果你的板子和我的板子接口不一样,那么请把对应的PC0替换成你板子上的LED接口。例如,你的板子的LED接在PA8上,那么就需要把led.c文件中原本的GPIOC替换成GPIOA、Pin_0替换成Pin_8。

3、编译并输出hex文件

编译前需要在目标选项中配置编译目录及hex输出;图:

STM32入门 - 编写一个LED亮灯程序

首先选择Output选项卡,勾选Create HEX File;图:

STM32入门 - 编写一个LED亮灯程序

再选择C/C++选项卡,添加文件夹,添加HARDWARE-LED文件夹;图:

STM32入门 - 编写一个LED亮灯程序

全部做好后就可以编译了;图:

STM32入门 - 编写一个LED亮灯程序

不出意外,就能成功编译;图:

STM32入门 - 编写一个LED亮灯程序

接下来进入OBJ文件夹,会有Template.hex文件生成;图:

STM32入门 - 编写一个LED亮灯程序

4、写入单片机

我的STM32单片机有一键下载功能,插上USB线就能下载程序,无需再插线及使用仿真器下载。

打开mcuisp,选择刚刚生成的hex文件;图:

STM32入门 - 编写一个LED亮灯程序

将STM32板子插上电脑USB,打开板子开关,在mcuisp中选择板子对应的端口。图:

STM32入门 - 编写一个LED亮灯程序

将mcuisp一键下载器软件设置为和下面图示红线处相同,然后可以点击读器件信息,可以读取到STM32板子的信息。

STM32入门 - 编写一个LED亮灯程序

点击开始编程,几秒钟后软件就会下载完毕,不出意外,板子上面的LED1已经亮了;如果灯没亮,就按一下板子上的Reset按键;如果再没亮,那应该是上面的步骤做错了。

三、成果展示

按照上面的程序,LED1会常亮:

STM32入门 - 编写一个LED亮灯程序

再来高级一点,让灯闪起来!

附上闪灯代码:

main.c文件代码:

#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"

 int main(void)
 {		
 	delay_init(); //延时函数初始化
	LED_Init();  //LED端口初始化
	 while(1){  //循环
		LED0=0;          //点亮LED1
		 delay_ms(500);  //延时500ms
		 LED1=0;         //点亮LED2
		 delay_ms(500);
		 LED0=!LED0;     //关闭LED1
		 delay_ms(500);
		 LED1=!LED1;
		 delay_ms(500);
		 LED0=!LED0;
	 }
 }

led.c文件代码:

#include "led.h"

//初始化PC0和PC1为输出口.并使能这两个口的时钟		    
//LED IO初始化
void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
 	
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);	 //使能PC端口时钟
	
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;			 //LED0-->PC.0 端口配置
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //设置端口为推挽输出
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //设置IO口速度为50MHz
 GPIO_Init(GPIOC, &GPIO_InitStructure);				 //根据设定参数初始化GPIOC.0
 GPIO_SetBits(GPIOC,GPIO_Pin_0);				 //PC.0 输出高

 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	    		 //LED1-->PC.1 端口配置, 推挽输出
 GPIO_Init(GPIOC, &GPIO_InitStructure);	  			 //设置为推挽输出 ,IO口速度为50MHz
 GPIO_SetBits(GPIOC,GPIO_Pin_1); 				 //PC.1 输出高 
}
 

led.h文件代码:

#ifndef __LED_H
#define __LED_H	 
#include "sys.h"

#define LED0 PCout(0)// 定义LED0 PC0
#define LED1 PCout(1)// 定义LED1 PC1	

void LED_Init(void);//初始化

		    
#endif
Linux技术

Linux的SSH无法连接 报错ssh: connect to host 192.168.40.128 port 22: Connection refused

2021-8-13 23:05:00

技术

Windows启动时开机logo变形的解决方法

2021-8-28 6:53:57