小例子学STM32第一讲—— 点灯大师(LED闪烁+流水灯)

       今天开启STM32的系列,前一部分将带大家通过小例子来了解一些STM32库函数的设置,后面陆续会有一些实战项目出来,更新周期可能比较长。默认大家会一些基础的项目模板搭建和程序下载,keil使用。

       另外新创建了公众号“宝藏Code园”,本系列相关代码将在公众号里面开源。需要本例子代码可以关注公众号后台回复“第一讲”获取(免费),包括STM32工程模板或者点击置顶资源链接。

目 录

1.硬件准备 

2.理论知识

2.1 GPIO简介

 2.2 GPIO基本结构

 2.3 GPIO模式

2.4 LED介绍 

3.接线图 

3.1 接线模拟图

3.2 接线实物图 

4.代码部分 

4.1 操作GPIO总共需要三个步骤:

4.2 库函数

5.实际操作 

5.1 打开工程模板

5.2 LED闪烁

5.3 流水灯

6.下载测试


       今天的例子主要学习GPIO的输出函数。

1.硬件准备 

     二极管*8,面包板,跳线若干,STM32F103C8T6最小系统板。

2.理论知识

2.1 GPIO简介

  • GPIOGeneral Purpose Input Output)通用输入输出口
  • 可配置为8种输入输出模式
  • 引脚电平:0V~3.3V,部分引脚可容忍5V
  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等2.2 GPIO基本结构

 2.2 GPIO基本结构

来源: 江协科技

 2.3 GPIO模式

模式名称

性质

特征

浮空输入

数字输入

可读取引脚电平,若引脚悬空,

则电平不确定

上拉输入

数字输入

可读取引脚电平,内部连接上拉电阻,

悬空时默认高电平

下拉输入

数字输入

可读取引脚电平,内部连接下拉电阻,

悬空时默认低电平

模拟输入

模拟输入

GPIO无效,引脚直接接入内部ADC

开漏输出

数字输出

可输出引脚电平,高电平为高阻态,

低电平接VSS

推挽输出

数字输出

可输出引脚电平,高电平接VDD

低电平接VSS

复用开漏输出

数字输出

由片上外设控制,高电平为高阻态,

低电平接VSS

复用推挽输出

数字输出

由片上外设控制,高电平接VDD

低电平接VSS

2.4 LED介绍 

    LED发光二极管,正向通电点亮,反向通电不亮 。

3.接线图 

    接线过程中,一定要仔细,选择端口不一样,记得在代码中也要调整哦。 

3.1 接线模拟图 

来源: 江协科技

LED闪烁 

流水灯 

3.2 接线实物图 

4.代码部分 

4.1 操作GPIO总共需要三个步骤:

1.使用RCC开启GPIO时钟 

2.使用GPIO_Init函数初始化GPIO

3.使用输出或输入的函数控制GPIO口

4.2 库函数

    rcc.h中的常用的库函数

void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);//RCC AHB外设时钟控制
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);//RCC APB2外设时钟控制
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);//RCC APB21外设时钟控制

     在keil中右击一个函数,可以跳转到定义,因为里面是英文的,看不懂的话,可以借助翻译软件。 定义中包括括号里面的参数设置。

  gpio.h中的常用的库函数

void GPIO_DeInit(GPIO_TypeDef* GPIOx);//参数可以写GPIOA\GPIOB等,调用GPIO复位
void GPIO_AFIODeInit(void);//复位AFIO
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);//用结构体初始化GPIO口
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);//结构体变量赋一个默认值
//GPIO读取函数
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取输入数据寄存器某个端口输出值
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);//读取整个输入数据寄存器
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//读取输出数据寄存器某一个位
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);//读取整个输出数据寄存器
//GPIO写入函数
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置高电平
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//设置低电平
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);//根据第三个参数设置端口
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);//同时对16个端口写入

5.实际操作 

5.1 打开工程模板

      工程模板获取方式在文章开头 。

5.2 LED闪烁

     打开mian.c。提醒一下哦,函数里面参数,右击选择定义,可以跳转。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	//RCC开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//结构体初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
    //复制结构体名字,用点把结构体成员都引出来
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出,高低电平均可
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//选择引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//一般都是50MHz
	//将结构体地址放到Init函数的第二个参数
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_0);//点亮
		Delay_ms(100);//Delaya函数已经加入,直接用就行,延时100ms
		GPIO_SetBits(GPIOA, GPIO_Pin_0);//熄灭
		Delay_ms(100);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//点亮
		Delay_ms(100);
		GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);//熄灭
		Delay_ms(100);
	
	}
}

补充一下GPIO_Mode的八种工作模式

5.3 流水灯

1.代码中的选择引脚,也可以使用按位或的方式

如GPIO_Pin_0|GPIO_Pin_1|........

2.主循环中的解释

因为C语言不支持二进制,所以只能转换为十六进制

16个二进制分别对应PA0到PA1516个端口,最低位对应PA0,往上依次是PA1,PA2,一直到PA15

低电平点亮,所以前面要加上按位取反符号~

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	//RCC开启GPIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	//结构体初始化GPIO
	GPIO_InitTypeDef GPIO_InitStructure;
	//复制结构体名字,用点把结构体成员都引出来
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出,高低电平均可
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;//选择所有引脚     
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//一般都是50MHz
	//将结构体地址放到Init函数的第二个参数
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	while (1)
	{
		GPIO_Write(GPIOA, ~0x0001);	//0000 0000 0000 0001
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0002);	//0000 0000 0000 0010
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0004);	//0000 0000 0000 0100
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0008);	//0000 0000 0000 1000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0010);	//0000 0000 0001 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0020);	//0000 0000 0010 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0040);	//0000 0000 0100 0000
		Delay_ms(100);
		GPIO_Write(GPIOA, ~0x0080);	//0000 0000 1000 0000
		Delay_ms(100);
	}
}

6.下载测试

一定要选择自己的下载器!!!

点击魔术棒,选择Debug,为了下载程序后自动复位还要进行如下操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不会飞的J同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值