STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验

一、首先我们来了解建立好的工程框架
STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验_第1张图片
1.USER
组USER下面主要存放的是用户代码。
main.c是主函数
system_stm32f4xx.c文件是片上外设接入层系统文件,主要是申明设置系统及总线时钟相关的函数
stm32f4xx_it.c中存放的是中断服务函数,用来编写中断服务函数

2.CORE
CORE下存放的是固件库必须的核心文件和启动文件,无须改动

3.FWLIB
存放的ST官方提供的固件库函数,是STM32F4标准外设固件库源码文件和对应的头文件

4.SYSTEM
存放的主要是延时、串口所用的文件

5.HARDWARE
下面存放的是外设驱动代码,其实就是通过调用FWLIB下的固件库实现的

二、正式实验准备
跑马灯需要用到GPIO
GPIO端口操作都在stm32f4xx_gpio.h和stm32f4xx_gpio.c中,STM32F4一组GOIP需要10个32位寄存器来控制(下面介绍7个常用的)

1.MODER 端口模式控制寄存器
有0~31位,每两位管理一个IO口,也就是说一组I/O有16个I/O口,
分别是MODER0~MODER15
00输入 01通用输出 10复用 11模拟

2.OTYPER 输出模式控制寄存器
控制输出GPIOx的输出类型,低16位有用,分别是OT0~OT15,对应一组IO的16个IO口
0输出推挽 1输出开漏

3.OSPEEDRy 输出速度控制寄存器
有0~31位,每两位管理一个IO口分别是OSPEEDR0至OSPEEDR15
00(2MHz输出) 01(25M) 10(50M) 11(100M)

4.PUPDR 上下拉控制寄存器
32位,两位控制一个IO,分别是PUPDRy0~PUPDRy15
00无上下拉 01上拉 10下拉

以上四个,是初始化IO口的,已经由固件库提供结构体,初始化结构体如下

typedef struct
{
	uint32_t GPIO_Pin;
	GPIOMode_TypeDef GPIO_Mode;
	GPIOSpeed_TypeDef GPIO_Speed;
	GPIOType_TypeDef GPIO_OType;
	GPIOPuPd_TypeDef GPIO_PuPd;
}GPIO_InitTypeDef;

使用例子:
GPIO_InitTypeDef GPIO_InitA;
GPIO_InitA.GPIO_Pin=9;//对GPIOA9进行下列初始化
GPIO_InitA.GPIO_Mode=0x01;//通用输出
GPIO_InitA.GPIO_Speed=0x02;//输出速度50MHz
GPIO_InitA.GPIO_OType=0x00;//推挽输出
GPIO_InitA.GPIO_PuPd=0x01;//上拉
GPIO_Init(GPIOF,&GPIO_InitA);//对GPIOA9进行以上初始化配置
注:配置IO口就是通过GPIO_Init函数,
两个形参 一个IO口组,一个是配置好的结构体

5.ODR 组输出控制寄存器(也可以读,这里不介绍)
低16位有效,一位对应一个IO口,0低电平 1高电平
定义如下

void GPIO_Write(GPIO_TypeDef * GPIOx,uint16_t PortVal);
看起来跟ODR没关系,这是因为我们一般学习的库函数版,
只要根据已经定义好的函数来控制对应的寄存器即可
使用例子:
GPIO_Write(GPIOF,0x0000);//GPIOF端口16个IO口全部设置为低电平;

6.BSRR 位输出控制寄存器
低16位写1,对应IO组的IO口输出高电平,写0无影响
高16位写1,对应IO组的IO口输出低电平,写0无影响
同时写1,低十六位有效
定义如下

寄存器法:
GPIOA->BSRR=1<<1;//设置GPIOA.1为高电平
GPIOA->BSRR=1<<(1+16);//设置GPIOA.1为低电平

库函数法:
void GPIO_SetBits(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin);
GPIO_SetBits(GPIOA,GPIO_Pin_1);设置GPIOA.1为高电平
GPIO_ResetBits(GPIOA,GPIO_Pin_1);设置GPIOA.1为低电平

7.IDR 输入读取控制寄存器
低16位有效,一位对应一个IO口,只能读,不可写,0低电平 1高电平
定义如下

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef * GPIOx);
使用例子:
GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_5);//读取GPIOF5的值
GPIO_ReadInputData(GPIOF);//读取GPIOF整组的值

GPIO操作步骤总结
(1)使能IO口时钟,调用函数为RCC_AHB1PeriphClockCmd();
(2)初始化IO口参数,调用函数为GPIO_Init();
(3)操作IO,就是上面的567寄存器

三、代码
首先,博主使用的是正点原子ALIENTEK探索者开发板,本实验硬件原理图如下,可以看到LED0和LED1是接在GPIOF9和GPIOF10两个IO口上的,所以我们跑马灯也主要是操作这两个IO口STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验_第2张图片
由图可以知道,输出低电平LED亮,高电平熄

1.打开建好的工程模板
先点击红圈1,新建Text1文件,然后点红圈2保存(保存时取名为led.c),路径选择HARDWAER下的LED文件夹(新建LED然后选择)下
STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验_第3张图片
根据本文介绍的寄存器,配置GPIOF的时钟和端口,并初始化输出电平
注意:一定要先定义结构体变量,在初始化时钟,不然会报错
STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验_第4张图片
以同样的办法建立一个新文件led.h保存在相同路径下并写入以下代码
STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验_第5张图片
STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验_第6张图片
然后将led.c添加到HARDWAER中,并将头文件路径添加进头文件查找路径(若此时看不懂了请看博主前面的文章 工程模板建立)

然后我们点开主函数main.c,并添加对应的头文件,然后写控制GPIOF的代码,并编译
STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验_第7张图片

可以看到,下面显示0Error,也就是0错误,此时我们烧写进开发板,可以看到绿灯红灯交替闪烁!成功了STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验_第8张图片
STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验_第9张图片

如果是相同开发板的朋友,有疑问可以私信博主,知无不言言无不尽

你可能感兴趣的:(STM32F4单片机,嵌入式,stm32,单片机)