单片机STM32入门——(1)程序结构

引言

这第一次博客便是记录寒假学习STM32之路,单片机这个倒是也听过很多了,但是一直没有系统的接触过,都只能算是小打小闹,以前说是还没有学过C语言,难以入手,但是现在回想来看,感觉倒像是自己每次在起步遇到困难就放弃了,没有继续做下去。现在既然已经学习过了C语言,倒也是没有这样的借口,当然也得感谢孟神带着我们学习。加油!!!在这里插入图片描述

1.初识单片机

对于咱们初学者来说,最大的困难就在于不知道这些符号,字母,单词是啥意思。也不知道软件和硬件该如何操作。很容易打击学习的信心,所以,首先,我们先不用去深究这些代码的含义和软件这复杂的界面。咱先按照步骤操作,跑起来第一个程序。

1.1初始配置

打开USER文件夹中的LED.uvprojx文件
此时进入到软件界面。看到这复杂的界面和众多的按钮,我们找到上面的这个按钮并点击,现在需要进行初始配置。
初始配置

  • 选择Debug
  • 并选择ST-Link Debugger
  • 然后点击Settings
  • 确定接口为ST-LINK/V2

在这里插入图片描述
在这里插入图片描述

1.2程序下载

在主界面中依次点击

  • 第一个Translate(编译)
  • 第二个Build(链接
  • 第六个Download(下载)

程序的编译、链接、下载
等待程序下载完成后,按下开发板上的复位键,便可以看到两个灯在交替闪烁了,此时便说明,我们已经完成了第一个单片机程序的配置及下载。

2.GPIO的使用

2.1资源下载

根据我们这块板子的图纸中LED的端口可知,我们需要用到PE1、PE0、PB9三个端口。
LED对应的GPIO端口
根据ST官网中下载STM标准库,其中包含有GPIO函数,另外在ST官网下载STM32中文参考手册其中详细讲解了各个函数的功能及使用方法。

2.2初始化源代码

下面是我们的LED初始化程序源代码。

void led_init(){
	
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //打开PB的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); //打开PE的时钟
	
	//初始化PB9
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//输出模式为推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;//设置端口为9
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//输出速度
	GPIO_Init(GPIOB,&GPIO_InitStructure);//初始化GPOIB
	GPIO_ResetBits(GPIOB,GPIO_Pin_9);//复位端口PB9
	
	//初始化PE0
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE,&GPIO_InitStructure);
	GPIO_ResetBits(GPIOE,GPIO_Pin_0);
	
	//初始化PE1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                    
	GPIO_Init(GPIOE,&GPIO_InitStructure);
	GPIO_ResetBits(GPIOE,GPIO_Pin_1);
}

从LED的电路图中可以看出,LED正向接3.3V的电压,所以当每个LED对应的GPIO端口接低电平时,二极管正向导通。
主程序源代码

#include "stm32f10x.h"
#include "delay.h"

int main(void)
{ 
	led_init();
	delay_init();
	
	while(1)
	{
		GPIO_ResetBits(GPIOB,GPIO_Pin_9);
		GPIO_SetBits(GPIOE,GPIO_Pin_1);
		delay_ms(500);
		
		GPIO_ResetBits(GPIOE,GPIO_Pin_0);
		GPIO_SetBits(GPIOB,GPIO_Pin_9);
		delay_ms(500);
		
		GPIO_ResetBits(GPIOE,GPIO_Pin_1);
		GPIO_SetBits(GPIOE,GPIO_Pin_0);
		delay_ms(500);
	}
}

当程序下载好后便可以看到三个LED灯交替闪烁。

这便是我们对GPIO端口的一个初步了解,简单熟悉了其功能和用法,但是我们也能发现,如果用这样的方法编程,会让整个程序变得非常臃肿且不易读。那么接下来我们将继续修改优化我们的程序

3.程序结构

3.1文件的建立

和C语言中一样,我们可以通过调用函数来让我们的主程序显得更加简洁,接下来我们就继续学习如何编写程序结构。
首先在HARDWARE文件夹中新建两个txt文件,并分别修改为led.cled.h并另存为UTF-8编码的文件。
然后在keil中将“led.c”添加到HARDWARE中
在这里插入图片描述
接下来我们开始编写led.c文件
首先我们需要先添加一下C语言的环境,我们需要在添加“HARDWARE”文件夹在这里插入图片描述

3.2程序结构源代码

接下来,打开我们的“led.c”文件,将前文中的void led_nit()函数复制过来,并添加头文件

#include "led.h"
#include "stm32f10x.h"

接下来我们需要编写头文件,根据系统函数头文件中的定义
PEout(X)为对应的GPIO接口的输出。

#ifndef _LED_H
#define _LED_H

#include "sys.h"

//定义LED端口的输出
#define LED1 PEout(1)
#define LED2 PEout(0)
#define LED3 PBout(9)

void led_init();

#endif

接下来我们编写主程序

#include "stm32f10x.h"
#include "delay.h"
#include "led.h"//编写的LED头文件

int main(void)
{
	led_init();//LED初始化函数
	delay_init();//延时函数
	
	while(1)
	{
		LED1 = 0;//当LED1对应的端口为0时,二极管正向导通
		LED3 = 1;
		delay_ms(500);
		
		LED2 = 0;
		LED1 = 1;
		delay_ms(500);
		
		LED3 = 0;
		LED2 = 1;
		delay_ms(500);
	}
	return 0;
}

由此我们便对之前的程序通过函数调用的方式使整个程序变得更加简洁、容错率更高、程序更加易读。

但是此时我们发现每次需要更改LED灯的状态,都需要修改程序,并重新进行下载,下一次,我们将继续学习,怎样用按键来控制LED灯的状态。

STM32单片机是一种高性能、低功耗的32位微控制器,广泛应用于嵌入式系统的开发中。其原理是基于ARM Cortex-M系列的核心,具有丰富的外设和高性能的计算能力,可以实现多种功能。 STM32单片机的应用非常广泛。其可以应用于智能家居、医疗仪器、工业自动化等领域。它可以用来控制各种传感器,如温度传感器、湿度传感器等,实现对环境的监测和控制。同时,它也可以用于控制各种执行机构,如电机和执行器,实现对设备的控制和运动。此外,STM32单片机还可以应用于通信领域,如无线模块和网络模块的控制,实现设备之间的数据传输和通信。 基于Proteus的虚拟仿真可以帮助开发者在进行STM32单片机的开发过程中,不需要实际搭建硬件电路,即可进行软件开发和调试。Proteus是一款功能强大的虚拟仿真软件,可以模拟STM32单片机和外设的工作过程。它可以提供丰富的模型库和仿真环境,方便开发者进行程序的编写、调试和验证。 通过Proteus的虚拟仿真,开发者可以在电脑上实现对STM32单片机的全面测试,包括外设的连接和数据交互。开发者可以使用Proteus提供的虚拟示波器、虚拟显示器等工具,模拟实际硬件的工作状态,及时查看和调试程序。 总而言之,STM32单片机的原理和应用非常广泛,通过Proteus的虚拟仿真可以帮助开发者在进行STM32单片机的开发过程中,提高开发效率和减少成本,并且可以更好地进行软件开发和调试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

with钦捷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值