欢迎来到烈强的寒假学习笔记
在苦闷的寒假生活中提升自己,学习stm_32单片机即快乐又痛苦,但是自动化人不能说不行,在此特别感谢孟神对我们的大力支持,不惜用假期时光来帮助我们学习,感激不尽。以下便开始我们第一次的学习之旅吧。
初始单片机
从大一开学便开始听说单片机的事情,身为电气工程及其自动化专业的同学,现在才开始学习单片机也是感到非常的忏愧,现在来谈谈我对单片机的最初认识。
单片机简单的来说就是一个微型计算机,我们通过写C语言程序进行控制,从而达到自动化控制的目的。
单片机的硬件起步
所需硬件
接下来马上开始我们单片机的第一次学习历程。
学习单片机首先便是认识单片机的基本硬件组成。
上面便是我使用的单片机,上面也标注出来了一些最基本的硬件:USB电源接口,LED灯,开关键,GPIO接口,电源模块,程序下载器
这里注意黄色的排针都是GPIO接口。
这里硬件并不是全部,只是一些本次实验需要用到的。
硬件的连接
如上图所示,便是硬件的连接方式,注意这里的电源模块的键帽可以选择5V与3V,需要与单片机上面的power supply选项对应,3V对3V,5V对5V。
这里也可以选择直接USB供电,如下图所示。
单片机软件起步
这里我使用的软件是keil 5.25。
接下来我们打开第一个程序开始进行编写。
步骤如下
打开实验一文件
打开USER文件夹
点开该文件即可。
我们写的第一个程序是让三个灯交替闪烁,所以我们首先就要了解三个LED灯是对应的那三个IO口,阅读STM32手册我们可知,分别对应的是PE1 PE0 PB9三个IO口
接下来便是写程序,所有程序如下所示,下来来进行一步一步解释
代码
。
#include "stm32f10x.h"
#include "delay.h"
void led_init()
{
GPIO_InitTypeDef GPIO_Initstructure;//定义结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//打开PB时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//打开PE时钟
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_Out_PP;//普通推挽输出
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_9;//指定针脚8
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;//设置反转速度
GPIO_Init(GPIOB,&GPIO_Initstructure);//选择PB口
GPIO_SetBits(GPIOB,GPIO_Pin_9);//置位PB9
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_SetBits(GPIOE,GPIO_Pin_0);
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_SetBits(GPIOE,GPIO_Pin_1);
}
int main(void)
{
led_init();
delay_init();
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOE,GPIO_Pin_0);
GPIO_SetBits(GPIOE,GPIO_Pin_1);
delay_ms(500);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_ResetBits(GPIOE,GPIO_Pin_0);
GPIO_SetBits(GPIOE,GPIO_Pin_1);
delay_ms(500);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
GPIO_SetBits(GPIOE,GPIO_Pin_0);
GPIO_ResetBits(GPIOE,GPIO_Pin_1);
delay_ms(500);
}
}
首先便是头文件,我们这里需要对GPIO进行操作,所以必须包含 stm32f10x.h的头文件,其次是需要用到延时,所以这里也需要包含delay.h头文件
这里是打开PE PB的时钟 并且对PB9进行操作,下面的PE1 PE0均可以效仿这一步,需要注意对不同口子进行配置的时候需要改变的地方。
将led_init函数定义号了之后便开始写主程序
在主程序中我们需要先引用delay_init与led_init两个函数,以起到初始化led。
while(1) 代表我们需要单片机一直执行循环操作。
通过上面的电路图我们知道
led灯左边是3.3V电压,需要IO口被复位之后才能亮,这便是让灯亮的思路。
程序结构
上面已经讲解了第一次的程序,但是上面的程序看起来非常的冗长,可读性差,改进思路便是利用宏定义来解决。
点开HEREWARE文件夹,创建led.c led.h文本文件,并且需要改为UTF-8的格式,这样才能输入中文备注。
双击HAREWARE添加我们写的led.c
将led的初始化写入led.c中
#include"led.h"
#include "stm32f10x.h"
void led_init(){
GPIO_InitTypeDef GPIO_Initstructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_Initstructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Initstructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_Initstructure);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
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_SetBits(GPIOE,GPIO_Pin_0);
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_SetBits(GPIOE,GPIO_Pin_1);
}
右击进入led.h,在led.h中定义变量
#ifndef _LED_H
#define _LED_H
#include "sys.h"
#define LED0 PBout(9)
#define LED1 PEout(0)
#define LED2 PEout(1)
void led_init();
#endif
注意这里
#ifndef
#define
#endif
的格式
于是只需简便为这样便可实现功能
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
int main(void)
{
led_init();
delay_init();
while(1)
{
LED0 = 0;
LED1 = 1;
LED2 = 1;
delay_ms(500);
LED0 = 1;
LED1 = 0;
LED2 = 1;
delay_ms(500);
LED0 = 1;
LED1 = 1;
LED2 = 0;
delay_ms(500);
}
}
以上便是第一次的流水灯实验