今天开启STM32的系列,前一部分将带大家通过小例子来了解一些STM32库函数的设置,后面陆续会有一些实战项目出来,更新周期可能比较长。默认大家会一些基础的项目模板搭建和程序下载,keil使用。
另外新创建了公众号“宝藏Code园”,本系列相关代码将在公众号里面开源。需要本例子代码可以关注公众号后台回复“第一讲”获取(免费),包括STM32工程模板或者点击置顶资源链接。
目 录
今天的例子主要学习GPIO的输出函数。
1.硬件准备
二极管*8,面包板,跳线若干,STM32F103C8T6最小系统板。
2.理论知识
2.1 GPIO简介
- GPIO(General 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,为了下载程序后自动复位还要进行如下操作。