前言
一、基础知识
二、实验实现
1.通过固件库设置GPIO的相关参数和输出
2.硬件设计
3.软件设计
led.c
led.h
main.c
总结
开启小萌新的stm32学习之旅~
正点原子精英板和配套视频
STM32最小系统:
一共有7组GPIO:GPIOA——GPIOG;一组GPIO有16个IO口
STM32的IO口可由软件配置成8种模式
每个IO端口有7个寄存器来控制
CRL和CRH控制着每个IO口的模式及输出速率,CRL控制着每组IO端口低八位的模式,CRH控制高八位
在固件库开发中,操作寄存器CRH和CRL来配置IO口的模式和速度是通过GPIO初始化函数完成(GPIO相关的函数和定义在固件库文件stm32f10_gpio.c和头文件stm32f10x_gpio.h文件中):
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
typedef struct
{ uint16_t GPIO_Pin; GPIOSpeed_TypeDef GPIO_Speed; GPIOMode_TypeDef GPIO_Mode; }GPIO_InitTypeDef;
GPIO_Pin端口;
GPIO_Speed速度:
typedef enum
{ GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHz }GPIOSpeed_TypeDef;
GPIO_Mode输入输出模式(8种):
typedef enum
{ GPIO_Mode_AIN = 0x0, //模拟输入
GPIO_Mode_IN_FLOATING = 0x04, //浮空输入
GPIO_Mode_IPD = 0x28, //下拉输入
GPIO_Mode_IPU = 0x48, //上拉输入
GPIO_Mode_Out_OD = 0x14, //开漏输出
GPIO_Mode_Out_PP = 0x10, //通用推挽输出
GPIO_Mode_AF_OD = 0x1C, //复用开漏输出
GPIO_Mode_AF_PP = 0x18 //复用推挽 }GPIOMode_TypeDef;
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //LED0-->PB.5 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度 50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数配置 GPIO
IDR寄存器的配置
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
返回值是1(Bit_SET)或者 0(Bit_RESET);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
一次性往一个GPIO的多个端口设值
要设置 GPIOA 的第 1 个端口值为 1,只需往寄存器 BSRR 的低16 位对应位写 1 即可:
GPIOA->BSRR=1<<1;
要设置 GPIOA 的第 1 个端口值为 0,只需往寄存器高 16 位对应为写 1 即可:
GPIOA->BSRR=1<<(16+1)
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
如要设置 GPIOB.5 输出1,方法为:
GPIO_SetBits(GPIOB, GPIO_Pin_5);
如果要设置 GPIOB.5 输出位0,方法为:
GPIO_ResetBits (GPIOB, GPIO_Pin_5);
IO步骤:
DS0 接 PB5,DS1 接 PE5
跑马灯实验要用到的固件库文件是:
stm32f10x_gpio.c /stm32f10x_gpio.h
stm32f10x_rcc.c/stm32f10x_rcc.h //stm32f10x_rcc.h 头文件在每个实验中都要引入,因为系统时钟配置函数以及相关的外设时 钟使能函数都在这个其源文件 stm32f10x_rcc.c 中。
misc.c/ misc.h
stm32f10x_usart /stm32f10x_usart.h //stm32f10x_usart.h 和 misc.h 头文件在SYSTEM 文件夹中都需要使用到,所以每个实验都会引用。
1,时钟 2,GPIO_Init 3,GPIO_SetBits
#include "led.h"
//初始化 PB5 和 PE5 为输出口.并使能这两个口的时钟
//LED IO 初始化
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_GPIOE, ENABLE);
//使能 PB,PE 端口时钟,因为在配置 STM32 外设的时候,任何时候都要先使能该外设的时钟。GPIO 是挂载在APB2 总线上的外设,在固件库中对挂载在 APB2 总线上的外设时钟使能是通过函数 RCC_APB2PeriphClockCmd()来实现的。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //端口5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_5); //PB.5 输出高
//因为两个 IO 口的模式和速度都一样,所以只用初始化一次,在 GPIOE.5 的初始化的时候就不需要再重复初始化速度和模式了。
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //端口5
GPIO_Init(GPIOE, &GPIO_InitStructure);
GPIO_SetBits(GPIOE,GPIO_Pin_5); //PE.5 输出高
}
记得将led.c添加到HARDWARE下
头文件种,使用 #ifndef #define #endif 条件编译,避免头文件内容重复定义
#ifndef __LED_H
#define __LED_H
void LED_Init(void);//初始化
#endif
记得将led.h头文件的路径加入到工程里(魔术棒——c/c++——...)
#include "led.h"
#include "delay.h"
int main(void)
{
delay_init(); //延时函数初始化
LED_Init(); //初始化与 LED 连接的硬件接口
while(1)
{ GPIO_ResetBits(GPIOB,GPIO_Pin_5); //清零,LED0亮
GPIO_SetBits(GPIOE,GPIO_Pin_5); //置1,LED1灭
delay_ms(300); //延时300ms
GPIO_SetBits(GPIOB,GPIO_Pin_5); //置1,LED0灭
GPIO_ResetBits(GPIOB,GPIO_Pin_5); // 清零,LED1亮
delay_ms(300); //延时 300ms
}
}
万事开头难,STM32第一集从昨天写到今天,从头复习了一遍,感觉像新学一样,所以说写博客还是非常有必要的,拒绝眼高手低!