简单IO口配置_LED灯(STM32)

GPIO口(可编程IO)

一、GPIO口概念

GPIO是通用输入/输出端口的简称。可以实现输出(驱动外部电路)、输入(检测外来信号)以及模拟一些通信接口通信协议功能,是单片机和外界进行数据交换的必要窗口。GPIO和外界进行都是通过TTL数字电平(高电平或低电平)来进行数据交换的,高电平表示数字“1”,低电平表示数字“0”。

二、单片机内部系统框图

STM32数据手册
在这里插入图片描述在这里插入图片描述
STM32 中文参考手册.pdf GPIO 章节位于:第8章 框图位于105页

I/O端口位的基本结构
在这里插入图片描述

三、编程思路:

1、 看原理图:GPIO与设备连接情况;
在这里插入图片描述

2、看数据手册 所处时钟总线;

在这里插入图片描述
3、固件库手册

(1)寄存器编程(难度系数高、了解一款芯片 举一反三)
(2)库函数编程ST(难度系数小、出现问题找问题比较麻烦、容易上手)

四、编程

1、 开启时钟

展开:RCC库函数 RCC_APB2PeriphClockCmd 使能或者失能 APB2 外设时钟

函数原型: void RCC_APB2PeriphClockCmd(u32 RCC_APB2Periph,FunctionalStateNewState)

参数1

RCC_AHB2Periph描述
RCC_APB2Periph_AFIO功能复用 IO 时钟
RCC_APB2Periph_GPIOAGPIOA 时钟
RCC_APB2Periph_GPIOBGPIOB 时钟
RCC_APB2Periph_GPIOCGPIOC 时钟
RCC_APB2Periph_GPIODGPIOD 时钟
RCC_APB2Periph_GPIOEGPIOE 时钟
RCC_APB2Periph_ADC1ADC1 时钟
RCC_APB2Periph_ADC2ADC2 时钟
RCC_APB2Periph_TIM1TIM1 时钟
RCC_APB2Periph_SPI1SPI1 时钟
RCC_APB2Periph_USART1USART1 时钟
RCC_APB2Periph_ALL全部 APB2 外设时钟

输入参数2: 这个参数可以取: ENABLE 或者 DISABLE

以PB5为例: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

2、初始化GPIO口:

展开GPIO库函数

 GPIO_Init        根据 GPIO_InitStruct 中指定的参数初始化外设 GPIOx 寄存器  

函数原型:

  函数原形        void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) 

输入参数 1 GPIOx: x 可以是 A, B, C, D 或者 E,来选择 GPIO外设

输入参数2

typedef struct
{
u16 GPIO_Pin;                   //管脚
GPIOSpeed_TypeDef GPIO_Speed;   //输出速率
GPIOMode_TypeDef GPIO_Mode;     //模式
} GPIO_InitTypeDef;
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct. GPIO_Pin = GPIO_Pin_5;
GPIO_InitStruct. GPIO_Speed= GPIO_Speed_50MHz;
GPIO_InitStruct. GPIO_Mode = GPIO_Mode_Out_PP;

以PB5举例:GPIO_Init(GPIOB,& GPIO_InitStruct);

3、程序编写示例:

led.c

#include "led.h"
/**************************
*函 +数 名:void LED_Gpio_Init(void)
*函数功能:LED灯连接管脚初始化
*参    数:无
*返 回 值:无
***************************/
void LED_Gpio_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	/*开启时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
	/*配置管脚 PB5*/
	GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_5;
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	/*配置管脚 PE5*/
	GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_5;
	GPIO_Init(GPIOE,&GPIO_InitStruct);
	/*配置管脚 PA5PA6*/
	GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_5|GPIO_Pin_6;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
    /*初始化之后不亮*/
	LED1_OFF;
	LED2_OFF;
	LED3_OFF;
	LED4_OFF;
}

led.h

#ifndef _LED_     //如果没有定义    防止重复定义
#define _LED_     //定义     
//头文件
#include "stm32f10x.h"
//函数声明
void beep_init(void);
//宏定义
#define BEEP_ON  GPIO_ResetBits( GPIOB,GPIO_Pin_8)

#define BEEP_OFF  GPIO_SetBits(GPIOB,GPIO_Pin_8)

#endif
  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用STM32单片机的3个IO控制6个LED的程序示例,使用了第一种方式,即使用74HC238译码器: ```c #include "stm32f10x.h" #define LED_PORT GPIOA #define ADDR_PORT GPIOB void GPIO_Config(void); void delay(uint32_t count); int main(void) { GPIO_Config(); while (1) { // 点亮第1个LED GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_0); GPIO_Write(LED_PORT, GPIO_Pin_0, GPIO_Pin_0); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_0, GPIO_Pin_RESET); // 点亮第2个LED GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_1); GPIO_Write(LED_PORT, GPIO_Pin_1, GPIO_Pin_1); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_1, GPIO_Pin_RESET); // 点亮第3个LED GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_2); GPIO_Write(LED_PORT, GPIO_Pin_2, GPIO_Pin_2); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_2, GPIO_Pin_RESET); // 点亮第4个LED GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_0); GPIO_Write(LED_PORT, GPIO_Pin_3, GPIO_Pin_3); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_3, GPIO_Pin_RESET); // 点亮第5个LED GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_1); GPIO_Write(LED_PORT, GPIO_Pin_4, GPIO_Pin_4); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_4, GPIO_Pin_RESET); // 点亮第6个LED GPIO_Write(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2, GPIO_Pin_2); GPIO_Write(LED_PORT, GPIO_Pin_5, GPIO_Pin_5); delay(1000000); GPIO_Write(LED_PORT, GPIO_Pin_5, GPIO_Pin_RESET); } } void GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); // 配置LED引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(LED_PORT, &GPIO_InitStructure); // 配置地址引脚为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(ADDR_PORT, &GPIO_InitStructure); } void delay(uint32_t count) { for(uint32_t i = 0; i < count; i++); } ``` 需要注意的是,此程序只是一个示例,具体的引脚配置和控制方式需要根据实际情况进行修改。同时,需要根据实际使用的译码器型号,确定地址引脚的数量和连接方式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值