引言
这第一次博客便是记录寒假学习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三个端口。
根据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.c和led.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灯的状态。