STM32的学习记录--1.准备工作

前言

本次学习用的单片机是STM32F103C8T6
本博客仅用于课余学习,不可商用!!
如有侵权,请告知我删除博客,谢谢配合。
以下学习资料均在云盘,仅供学习交流 禁止用于商业用途

资料下载:

链接:https://pan.baidu.com/s/1b4KDuO0hU1rUvXRbo4QRlg
提取码:Lin2

本文链接

个人博客:https://ronglin.fun/archives/64
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/103780913

一.STM32的入门学习

1.安装Keil uVision5过程

a.安装mdk_514.exe
b.安装Keil.STM32F4xx_DFP.1.0.8.pack
c.泼姐
d.安装ST-LINK驱动
注意事项
1.整个过程按照说明书《STM32软件开发指南》进行。
2.安装过程中安装目录根目录必须是是全英文。
3.泼姐的时候要赋予Keil uVision5管理员权限。
4.win10系统要安装ST-LINK V2 WIN10 驱动。

2.简单程序的烧录

a.下载STM32Demo文件压缩包并解压。
b.打开Keil uVision5.exe导入项目。
c.导入项目后对整个项目进行rebuild(整个项目编译)和build(编译F7)。
d.插上单片机之后,点击download将程序烧入单片机。
注意事项
1.导入过程:project–open project–在根文件\STM32Demo\STM32Demo\MDK-ARM找到Project.uvprojx文件导入。
2.在Keil uVision5项目文件中最后一个文件是暂时不存在的,需要删除。
3.rebuild之后部分电脑中core_cm3.o文件会消失,在rebuild编译完之后将压缩包里的core_cm3.o复制到\STM32Demo\STM32Demo\MDK-ARM\STM3210B-EVAL文件夹下。
4.单片机的烧录工具要每一个针脚都对应好,插正确。

3.简单点亮LED灯

a.学会使用高电平GPIO_SetBits(GPIOB,GPIO_Pin_3)语句
b.学会使用低电平GPIO_ResetBits(GPIOB,GPIO_Pin_3)语句
c.学会使用代码打开和初始化led接口
d.学会用延迟来让实现跑马灯模式
C语言源代码:

#include <string.h>
#include <stdio.h>
#include "port.h"
void delay();
int main(void)
{
//声明一个结构体变量,变量名字是GPIO_InitStructure,结构体的原型由GPIO_InitTypeDef 确定
	GPIO_InitTypeDef GPIO_InitStructure;
// Enable GPIOs clocks (打开端口B和时钟AFIO,类似总开关的东西,只有开启了才能调用这个端口)
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//将默认配置为JTAG调试功能的关闭,变成普通的灯
	(GPIO_Remap_SWJ_JTAGDisable , ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  	//初始化GPIO_Pin_3
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最高输出速率50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);
/*GPIOB的意思GPIO的外设口B,
&GPIO_InitStructure”指向结构GPIO_InitTypeDef的指针,包含了外设GPIO的配置信息*/
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	while(1)//死循环
	{
		GPIO_SetBits(GPIOB,GPIO_Pin_3);//设置高电平,灯亮
		delay();
		GPIO_ResetBits(GPIOB,GPIO_Pin_3);//设置低电平,灯灭
		delay();
		GPIO_SetBits(GPIOB,GPIO_Pin_8);
		delay();
		GPIO_ResetBits(GPIOB,GPIO_Pin_8);
		delay();
		GPIO_SetBits(GPIOB,GPIO_Pin_9);
		delay();
		GPIO_ResetBits(GPIOB,GPIO_Pin_9);
		delay();
	}
}
void delay()//延时函数
{
	int delay1=0x2FF;//十六进制
	int delay2=0xFF;//十六进制
	while(delay1--)
		{	delay2=0xFF;
			while(delay2--);}
}

4.用开关控制LED灯

a.学会使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)判断开关状态
b.学会使用代码打开和初始化开关引脚
c.当开关按下时,GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)的值等于0
d.用状态值来存储按下的不同开关
e.用计数器来实现跑马灯

实现功能
key1:打开所有灯;
key2:关闭所有灯;
key3:从左到右跑马灯;
key4:从右到左跑马灯;
key5:对称跑马灯;

C语言源代码:

#include <string.h>
#include <stdio.h>
#include "port.h"
void close();
void open();
void run(int sum);
void mirror(int sum);
int main(void)
{
	int staute;//存储状态值
	int sum=0;//跑马灯计数器
	GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);//打开端口B
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);//打开端口A
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//打开时钟AFIO
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE);//关闭调试功能,将灯变为普通灯
{//打开所有灯的引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);//5;(将灯的初始状态设置为关闭状态,下同)

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);//7

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);//6

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);//4

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);//2

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);//3

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);//1

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_15);//8
}
{//打开所有开关的引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入,下同
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//KEY1

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY2

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY5

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY3

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);//KEY4
}
	while(1)
{
{//判断按下了哪个开关
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0)   {staute=1;sum=0;}
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==0)    {staute=2;sum=0;}
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_9)==0)     staute=3;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10)==0)    staute=4;
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_11)==0)   {staute=5;sum=0;}
}		
if(sum>80000) sum=0;//重置计数器,从左到右
if(sum<0) sum=80000;//重置计数器,从右到左
switch (staute)//根据状态值执行操作
	{
	case 1: open();break;//打开所有灯
	case 2: close();break;//关闭所有灯
	case 3: {sum++;run(sum);}break;//从左到右跑马灯
	case 4: {sum--;run(sum);}break;//从右到左跑马灯
	case 5: {if(sum==40000) sum=0;sum++;mirror(sum);}break;//对称跑马灯
	default: close();break;//如有错误,关闭所有灯
	}
}
}
void close()//关闭所有灯
{
GPIO_ResetBits(GPIOA,GPIO_Pin_15);
GPIO_ResetBits(GPIOB,GPIO_Pin_3);
GPIO_ResetBits(GPIOB,GPIO_Pin_4);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOB,GPIO_Pin_6);
GPIO_ResetBits(GPIOB,GPIO_Pin_7);
GPIO_ResetBits(GPIOB,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_9);
}
void open()//打开所有灯
{
GPIO_SetBits(GPIOA,GPIO_Pin_15);
GPIO_SetBits(GPIOB,GPIO_Pin_3);
GPIO_SetBits(GPIOB,GPIO_Pin_4);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
GPIO_SetBits(GPIOB,GPIO_Pin_6);
GPIO_SetBits(GPIOB,GPIO_Pin_7);
GPIO_SetBits(GPIOB,GPIO_Pin_8);
GPIO_SetBits(GPIOB,GPIO_Pin_9);
}
void run(int sum)//跑马灯
{
if(sum>=0&&sum<=10000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_9);}//全灭,1灯亮
else if(sum>10000&&sum<=20000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_8);}//全灭,2灯亮
else if(sum>20000&&sum<=30000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_7);}//全灭,3灯亮
else if(sum>30000&&sum<=40000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_6);}//全灭,4灯亮
else if(sum>40000&&sum<=50000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_5);}//全灭,5灯亮
else if(sum>50000&&sum<=60000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_4);}//全灭,6灯亮
else if(sum>60000&&sum<=70000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_3);}//全灭,7灯亮
else if(sum>70000&&sum<=80000) {close();GPIO_SetBits(GPIOA,GPIO_Pin_15);}//全灭,8灯亮
else  close();
}
void mirror(int sum)//对称跑马灯
{	
if(sum>=0&&sum<=10000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_9);GPIO_SetBits(GPIOA,GPIO_Pin_15);}
else if(sum>10000&&sum<=20000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_8);GPIO_SetBits(GPIOB,GPIO_Pin_3);}
else if(sum>20000&&sum<=30000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_7);GPIO_SetBits(GPIOB,GPIO_Pin_4);}
else if(sum>30000&&sum<=40000) {close();GPIO_SetBits(GPIOB,GPIO_Pin_6);GPIO_SetBits(GPIOB,GPIO_Pin_5);}
else close();
}

对于STM32中的GPIO_Mode–GPIO配置可以查阅资料
https://blog.csdn.net/RongLin02/article/details/103787777

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值