stm32 - GPIO

stm32 - GPIO

  • GPIO结构图
  • GPIO原理图
    • 输入
      • 上拉/下拉/浮空
      • 施密特触发器
      • 片上外设
    • 输出
      • 推挽/开漏/关闭输出方式
    • GPIO88种模式
      • 复用输出
  • GPIO寄存器
    • 端口配置寄存器_CRL
    • 端口输入数据寄存器_IDR
    • 端口输出数据寄存器_ODR
    • 端口位设置/清除寄存器_BSRR
    • 端口位清除寄存器_BRR
    • 端口配置锁定寄存器
  • 例子
    • 点灯
    • 流水灯
    • 蜂鸣器
    • 按键和灯
    • 蜂鸣器和光敏电阻

GPIO结构图

GPIO全都挂载在APB2总线上的
每个GPIOA 都有16个引脚
寄存器:输入寄存器和输出寄存器,输出寄存器引脚输出电平,输入寄存器从引脚读取当前电平
每个寄存器有32位,但是每个寄存器都只对应16个引脚,所以只使用寄存器中的低16 位
驱动器负责增大信号的驱动能力
在这里插入图片描述

GPIO原理图

在这里插入图片描述

输入

上拉/下拉/浮空

>

为了给输入一个默认的输入电平
为了避免引脚悬空导致输入数据的不稳定,需要加上上拉电阻或下拉电阻
上拉电阻:浮空引脚,保证引脚的高电平
下拉电阻:浮空引脚,保证引脚的低电平

上拉输入:高电平输入
下拉输入:低电平输入

施密特触发器

对输入电压进行整形,防止干扰
如果输入电压大于某一阈值,输出就会瞬间升为高电平
如果输入电压小于某一阈值,输出就会瞬间降为低电平

在这里插入图片描述

片上外设

  • 模拟输入 ADC等
  • 复用输入 数字量

输出

  • 输出寄存器:写某一位控制某一个引脚(用位设置和位清楚寄存器更好)
  • 片上外设

推挽/开漏/关闭输出方式

在这里插入图片描述

  • 推挽输出

高低电平均有强驱动能力
P-MOS和N-MOS均有效
输出数据寄存器为1时,上管导通PMOS导通,下管NMOS断开,输出直接接到VDD,输出高电平
输出数据寄存器为0时,上管导通PMOS断开,下管NMOS导通,输出直接接到VSS,输出低电平

  • 开漏输出

低电平有强驱动能力,高电平没有驱动能力
P-MOS无效,N-MOS有效
输出数据寄存器为1时,上管导通PMOS无效,下管NMOS断开,输出相当于断开,相当于高阻模式
输出数据寄存器为0时,上管导通PMOS无效,下管NMOS导通,输出直接接到VSS,输出低电平

开漏输出接外部的上拉5V电源

  • 关闭输出

引脚配置为输入模式的时候
两个MOS管均无效

GPIO88种模式

在这里插入图片描述

复用输出

由片上外设进行输出

GPIO寄存器

端口配置寄存器_CRL

GPIOX_CRL
一共32位,每4位对应一个IO的配置,可配置8个引脚

端口输入数据寄存器_IDR

GPIOX_IDR
32位,低16位对应16个引脚

端口输出数据寄存器_ODR

GPIOX_ODR
32位,低16位对应16个引脚

端口位设置/清除寄存器_BSRR

GPIOX_BSRR
32位,高16位用于进行位清除,低16位用于进行位设置

端口位清除寄存器_BRR

32位,低16位用于进行位清除

端口配置锁定寄存器

端口锁定

例子

点灯

main.cpp

#include "stm32f10x.h"
#include "Delay.h"int main()
{// 初始化APB2外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // 配置GPIO - ODR/CLRGPIO_InitTypeDef GPIO_InitStructure;			// 配置结构体GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 	// GPIO_Mode_Out_PP 推挽输出
//	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; 	// GPIO_Mode_Out_OD 开漏输出 	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;			// GPIOA的0号引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // 50MHZ GPIO_Init(GPIOA,&GPIO_InitStructure); // A0推挽输出//	GPIO_SetBits(GPIOA,GPIO_Pin_0); 	// 设置为高电平
//	GPIO_ResetBits(GPIOA,GPIO_Pin_0); 	// 设置为低电平
//	GPIO_Write();
//	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); // Bit_RESET 低电平	
//	GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); // Bit_SET 高电平while (1){
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); 	// Bit_RESET 低电平GPIO_ResetBits(GPIOA,GPIO_Pin_0);			// version2Delay_ms(500);
//		GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); 	// Bit_SET 高电平GPIO_SetBits(GPIOA,GPIO_Pin_0);				// version2Delay_ms(500);}
}

delay.c

#include "stm32f10x.h"/*** @brief  微秒级延时* @param  xus 延时时长,范围:0~233015* @retval 无*/
void Delay_us(uint32_t xus)
{SysTick->LOAD = 72 * xus;				//设置定时器重装值SysTick->VAL = 0x00;					//清空当前计数值SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器while(!(SysTick->CTRL & 0x00010000));	//等待计数到0SysTick->CTRL = 0x00000004;				//关闭定时器
}/*** @brief  毫秒级延时* @param  xms 延时时长,范围:0~4294967295* @retval 无*/
void Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}/*** @brief  秒级延时* @param  xs 延时时长,范围:0~4294967295* @retval 无*/
void Delay_s(uint32_t xs)
{while(xs--){Delay_ms(1000);}
} 

流水灯

#include "stm32f10x.h"
#include "Delay.h"int main()
{// 初始化APB2外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); /* ====== 流水灯 ====== */// 配置GPIO - ODR/CLR registerGPIO_InitTypeDef GPIO_InitStructure;			// 配置结构体GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 	// GPIO_Mode_Out_PP 推挽输出	/** #define GPIO_Pin_0                 ((uint16_t)0x0001)* #define GPIO_Pin_1                 ((uint16_t)0x0002)* #define GPIO_Pin_2                 ((uint16_t)0x0004)* #define GPIO_Pin_3                 ((uint16_t)0x0008)* #define GPIO_Pin_4                 ((uint16_t)0x0010)* #define GPIO_Pin_5                 ((uint16_t)0x0020)* #define GPIO_Pin_6                 ((uint16_t)0x0040)* #define GPIO_Pin_7                 ((uint16_t)0x0080)* GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7* 等价于 0x0001 | 0x0002 ... 位之间并不冲突*/
//	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;			// GPIOA的0号引脚GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // 50MHZ GPIO_Init(GPIOA,&GPIO_InitStructure); // A0推挽输出while (1){for (int i=0;i<8;i++){GPIO_Write(GPIOA,~(0x0001<<i));
//			GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET);Delay_ms(100);}}
}

蜂鸣器

#include "stm32f10x.h"
#include "Delay.h"int main()
{// 初始化APB2外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // 配置GPIO - ODR/CLRGPIO_InitTypeDef GPIO_InitStructure;			// 配置结构体GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 	// GPIO_Mode_Out_PP 推挽输出
//	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; 	// GPIO_Mode_Out_OD 开漏输出 	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_12;			// GPIOA的0号引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // 50MHZ GPIO_Init(GPIOB,&GPIO_InitStructure); // A0推挽输出//	GPIO_SetBits(GPIOB,GPIO_Pin_12); 	// 设置为高电平
//	GPIO_ResetBits(GPIOB,GPIO_Pin_12); 	// 设置为低电平
//	GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_RESET); // Bit_RESET 低电平	
//	GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET); // Bit_SET 高电平while (1){
//		GPIO_WriteBit(GPIOB,GPIO_Pin_0,Bit_RESET); 	// Bit_RESET 低电平GPIO_ResetBits(GPIOB,GPIO_Pin_12);			// version2Delay_ms(500);
//		GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET); 	// Bit_SET 高电平GPIO_SetBits(GPIOB,GPIO_Pin_12);				// version2Delay_ms(500);}}

按键和灯

main.c

#include "stm32f10x.h"
#include "Delay.h"
#include "LED.h"
#include "key.h"int main()
{uint8_t keyNum=0;LED_Init();Key_Init();while (1){keyNum=key_getNum();switch (keyNum){case 1: {LED_ON(1);LED_OFF(2);keyNum=0;break;}case 11: {LED_ON(2);LED_OFF(1);keyNum=0;break;}default: break;}/* turn 切换*/ 
//		if (keyNum==1)
//		{
//			LED_ON(1);
//		}
//		if (keyNum==11)
//		{
//			LED_OFF(1);
//		}
//		}
}

LED.h

#ifndef __LED_H__
#define __LED_H__void LED_Init();
void LED_ON(unsigned char pin_num);
void LED_OFF(unsigned char pin_num);
void LED_Turn(unsigned char pin_num);#endif

LED.c

#include "stm32f10x.h"
#include "LED.h"void LED_Init()
{// 初始化APB2外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); // 配置GPIO - ODR/CLRGPIO_InitTypeDef GPIO_InitStructure;			// 配置结构体GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 	// GPIO_Mode_Out_PP 推挽输出
//	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; 	// GPIO_Mode_Out_OD 开漏输出 	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1 | GPIO_Pin_2;			// GPIOA的0号引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // 50MHZ GPIO_Init(GPIOA,&GPIO_InitStructure); // A0推挽输出// 默认输出高电平 不点灯GPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
}void LED_ON(unsigned char pin_num)
{switch (pin_num){case 0: {GPIO_ResetBits(GPIOA,GPIO_Pin_0);break;}case 1: {GPIO_ResetBits(GPIOA,GPIO_Pin_1);break;}case 2: {GPIO_ResetBits(GPIOA,GPIO_Pin_2);break;}case 3: {GPIO_ResetBits(GPIOA,GPIO_Pin_3);break;}case 4: {GPIO_ResetBits(GPIOA,GPIO_Pin_4);break;}case 5: {GPIO_ResetBits(GPIOA,GPIO_Pin_5);break;}case 6: {GPIO_ResetBits(GPIOA,GPIO_Pin_6);break;}case 7: {GPIO_ResetBits(GPIOA,GPIO_Pin_7);break;}		}
}void LED_OFF(unsigned char pin_num)
{switch (pin_num){case 0: {GPIO_SetBits(GPIOA,GPIO_Pin_0);break;}case 1: {GPIO_SetBits(GPIOA,GPIO_Pin_1);break;}case 2: {GPIO_SetBits(GPIOA,GPIO_Pin_2);break;}case 3: {GPIO_SetBits(GPIOA,GPIO_Pin_3);break;}case 4: {GPIO_SetBits(GPIOA,GPIO_Pin_4);break;}case 5: {GPIO_SetBits(GPIOA,GPIO_Pin_5);break;}case 6: {GPIO_SetBits(GPIOA,GPIO_Pin_6);break;}case 7: {GPIO_SetBits(GPIOA,GPIO_Pin_7);break;}		}
}void LED_Turn(unsigned char pin_num)
{switch (pin_num){case 0: {if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==0){GPIO_SetBits(GPIOA,GPIO_Pin_0);}else if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0)==1){GPIO_ResetBits(GPIOA,GPIO_Pin_0);}break;}case 1: {			if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0){GPIO_SetBits(GPIOA,GPIO_Pin_1);}else if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==1){GPIO_ResetBits(GPIOA,GPIO_Pin_1);}break;}case 2: {			if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0){GPIO_SetBits(GPIOA,GPIO_Pin_2);}else if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==1){GPIO_ResetBits(GPIOA,GPIO_Pin_2);}break;}case 3: {			if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3)==0){GPIO_SetBits(GPIOA,GPIO_Pin_3);}else if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3)==1){GPIO_ResetBits(GPIOA,GPIO_Pin_3);}break;}case 4: {			if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4)==0){GPIO_SetBits(GPIOA,GPIO_Pin_4);}else if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_4)==1){GPIO_ResetBits(GPIOA,GPIO_Pin_4);}break;}case 5: {			if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5)==0){GPIO_SetBits(GPIOA,GPIO_Pin_5);}else if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_5)==1){GPIO_ResetBits(GPIOA,GPIO_Pin_5);}break;}case 6: {			if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_6)==0){GPIO_SetBits(GPIOA,GPIO_Pin_6);}else if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_6)==1){GPIO_ResetBits(GPIOA,GPIO_Pin_6);}break;}case 7: {			if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_7)==0){GPIO_SetBits(GPIOA,GPIO_Pin_7);}else if (GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_7)==1){GPIO_ResetBits(GPIOA,GPIO_Pin_7);}break;}	}
}

key.h

#ifndef __KEY_H__
#define __KEY_H__void Key_Init();
uint8_t key_getNum();
#endif

key.c

#include "stm32f10x.h"
#include "key.h"
#include "Delay.h"void Key_Init()
{// 初始化APB2外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 配置GPIO - ODR/CLRGPIO_InitTypeDef GPIO_InitStructure;			// 配置结构体GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; 	// GPIO_Mode_IPU 上拉输入 - 根据原理图(内部 上拉输入配置)GPIO_InitStructure.GPIO_Pin= GPIO_Pin_1 | GPIO_Pin_11;			// GPIOB的1,11号引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // 50MHZ 仅与输入有关GPIO_Init(GPIOB,&GPIO_InitStructure); 			// B0推挽输出
}uint8_t key_getNum()
{uint8_t keyNum=0;/** GPIO_ReadInputDataBit 读取输入数据寄存器某一端口(引脚)的输入值,高低电平* GPIO_ReadInputData   读取整个输入数据寄存器* GPIO_ReadOutputDataBit 读取输出数据寄存器某一个位,输出模式下,用来看一下自己输出的是什么* GPIO_ReadOutputData 读取整个输出数据寄存器*/ // 输入数据if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);Delay_ms(20);keyNum=1;}if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);Delay_ms(20);keyNum=11;}return keyNum;
}

蜂鸣器和光敏电阻

main.c

#include "stm32f10x.h"
#include "Delay.h"
#include "LED.h"
#include "key.h"
#include "Buzzer.h"
#include "PhotoSensor.h"int main()
{uint8_t keyNum=0;Buzzer_Init(12);PhotoSensor_Init(13);while (1){/* === 蜂鸣器 ===*/
//		Buzzer_Turn(12);
//		Delay_ms(500);
//		Buzzer_Turn(12);
//		Delay_ms(500);/* === 光敏传感器 ===*/
//		PhotoSensor_Turn(13);
//		Delay_ms(500);
//		PhotoSensor_Turn(13);
//		Delay_ms(500);/* === 光敏传感器2 ,光敏传感器控制蜂鸣器 ===*/if (PhotoSensor_Get(13)==1){Buzzer_ON(12);}else{Buzzer_OFF(12);}}
}

Buzzer.h

#ifndef __BUZZER_H__
#define __BUZZER_H__void Buzzer_Init(unsigned char pin_num);
void Buzzer_ON(unsigned char pin_num);
void Buzzer_OFF(unsigned char pin_num);
void Buzzer_Turn(unsigned char pin_num);#endif

Buzzer.c

#include "stm32f10x.h"
#include "Buzzer.h"void Buzzer_Init(unsigned char pin_num)
{uint16_t GPIO_Pin_num=0;switch (pin_num){case 0: {GPIO_Pin_num=GPIO_Pin_0;break;}case 1: {GPIO_Pin_num=GPIO_Pin_1;break;}case 2: {GPIO_Pin_num=GPIO_Pin_2;break;}case 3: {GPIO_Pin_num=GPIO_Pin_3;break;}case 4: {GPIO_Pin_num=GPIO_Pin_4;break;}case 5: {GPIO_Pin_num=GPIO_Pin_5;break;}case 6: {GPIO_Pin_num=GPIO_Pin_6;break;}case 7: {GPIO_Pin_num=GPIO_Pin_7;break;}case 8: {GPIO_Pin_num=GPIO_Pin_8;break;}case 9: {GPIO_Pin_num=GPIO_Pin_9;break;}case 10: {GPIO_Pin_num=GPIO_Pin_10;break;}case 11: {GPIO_Pin_num=GPIO_Pin_11;break;}case 12: {GPIO_Pin_num=GPIO_Pin_12;break;}case 13: {GPIO_Pin_num=GPIO_Pin_13;break;}case 14: {GPIO_Pin_num=GPIO_Pin_14;break;}}// 初始化APB2外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // 配置GPIO - ODR/CLRGPIO_InitTypeDef GPIO_InitStructure;			// 配置结构体GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; 	// GPIO_Mode_Out_PP 推挽输出
//	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_OD; 	// GPIO_Mode_Out_OD 开漏输出 	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_num;			// GPIOB的0号引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // 50MHZ GPIO_Init(GPIOB,&GPIO_InitStructure); // A0推挽输出// 默认输出高电平 不点灯GPIO_SetBits(GPIOB,GPIO_Pin_num);
}void Buzzer_ON(unsigned char pin_num)
{switch (pin_num){case 0: {GPIO_ResetBits(GPIOB,GPIO_Pin_0);break;}case 1: {GPIO_ResetBits(GPIOB,GPIO_Pin_1);break;}case 2: {GPIO_ResetBits(GPIOB,GPIO_Pin_2);break;}case 3: {GPIO_ResetBits(GPIOB,GPIO_Pin_3);break;}case 4: {GPIO_ResetBits(GPIOB,GPIO_Pin_4);break;}case 5: {GPIO_ResetBits(GPIOB,GPIO_Pin_5);break;}case 6: {GPIO_ResetBits(GPIOB,GPIO_Pin_6);break;}case 7: {GPIO_ResetBits(GPIOB,GPIO_Pin_7);break;}case 8: {GPIO_ResetBits(GPIOB,GPIO_Pin_8);break;}case 9: {GPIO_ResetBits(GPIOB,GPIO_Pin_9);break;}case 10: {GPIO_ResetBits(GPIOB,GPIO_Pin_10);break;}case 11: {GPIO_ResetBits(GPIOB,GPIO_Pin_11);break;}case 12: {GPIO_ResetBits(GPIOB,GPIO_Pin_12);break;}case 13: {GPIO_ResetBits(GPIOB,GPIO_Pin_13);break;}case 14: {GPIO_ResetBits(GPIOB,GPIO_Pin_14);break;}case 15: {GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;}		}
}void Buzzer_OFF(unsigned char pin_num)
{switch (pin_num){case 0: {GPIO_SetBits(GPIOB,GPIO_Pin_0);break;}case 1: {GPIO_SetBits(GPIOB,GPIO_Pin_1);break;}case 2: {GPIO_SetBits(GPIOB,GPIO_Pin_2);break;}case 3: {GPIO_SetBits(GPIOB,GPIO_Pin_3);break;}case 4: {GPIO_SetBits(GPIOB,GPIO_Pin_4);break;}case 5: {GPIO_SetBits(GPIOB,GPIO_Pin_5);break;}case 6: {GPIO_SetBits(GPIOB,GPIO_Pin_6);break;}case 7: {GPIO_SetBits(GPIOB,GPIO_Pin_7);break;}case 8: {GPIO_SetBits(GPIOB,GPIO_Pin_8);break;}case 9: {GPIO_SetBits(GPIOB,GPIO_Pin_9);break;}case 10: {GPIO_SetBits(GPIOB,GPIO_Pin_10);break;}case 11: {GPIO_SetBits(GPIOB,GPIO_Pin_11);break;}case 12: {GPIO_SetBits(GPIOB,GPIO_Pin_12);break;}case 13: {GPIO_SetBits(GPIOB,GPIO_Pin_13);break;}case 14: {GPIO_SetBits(GPIOB,GPIO_Pin_14);break;}case 15: {GPIO_SetBits(GPIOB,GPIO_Pin_15);break;}			}
}void Buzzer_Turn(unsigned char pin_num)
{// version 2uint16_t GPIO_Pin_num=0;switch (pin_num){case 0: {GPIO_Pin_num=GPIO_Pin_0;break;}case 1: {GPIO_Pin_num=GPIO_Pin_1;break;}case 2: {GPIO_Pin_num=GPIO_Pin_2;break;}case 3: {GPIO_Pin_num=GPIO_Pin_3;break;}case 4: {GPIO_Pin_num=GPIO_Pin_4;break;}case 5: {GPIO_Pin_num=GPIO_Pin_5;break;}case 6: {GPIO_Pin_num=GPIO_Pin_6;break;}case 7: {GPIO_Pin_num=GPIO_Pin_7;break;}case 8: {GPIO_Pin_num=GPIO_Pin_8;break;}case 9: {GPIO_Pin_num=GPIO_Pin_9;break;}case 10: {GPIO_Pin_num=GPIO_Pin_10;break;}case 11: {GPIO_Pin_num=GPIO_Pin_11;break;}case 12: {GPIO_Pin_num=GPIO_Pin_12;break;}case 13: {GPIO_Pin_num=GPIO_Pin_13;break;}case 14: {GPIO_Pin_num=GPIO_Pin_14;break;}}if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_num)==0){GPIO_SetBits(GPIOB,GPIO_Pin_num);}else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_num)==1){GPIO_ResetBits(GPIOB,GPIO_Pin_num);}// version 1
//	switch (pin_num)
//	{
//		case 0: {
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_0);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_0);
//			}
//			break;
//		}
//		case 1: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_1)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_1);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_1)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_1);
//			}
//			break;
//		}
//		case 2: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_2)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_2);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_2)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_2);
//			}
//			break;
//		}
//		case 3: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_3);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_3);
//			}
//			break;
//		}
//		case 4: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_4)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_4);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_4)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_4);
//			}
//			break;
//		}
//		case 5: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_5);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_5);
//			}
//			break;
//		}
//		case 6: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_6)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_6);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_6)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_6);
//			}
//			break;
//		}
//		case 7: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_7);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_7);
//			}
//			break;
//		}	
//	}
}

photosensor.h

#ifndef __PHOTOSENSOR_H__
#define __PHOTOSENSOR_H__void PhotoSensor_Init(unsigned char pin_num);
void PhotoSensor_ON(unsigned char pin_num);
void PhotoSensor_OFF(unsigned char pin_num);
void PhotoSensor_Turn(unsigned char pin_num);
uint8_t PhotoSensor_Get(unsigned char pin_num);#endif

photosensor.c

#include "stm32f10x.h"
#include "PhotoSensor.h"void PhotoSensor_Init(unsigned char pin_num)
{uint16_t GPIO_Pin_num=0;switch (pin_num){case 0: {GPIO_Pin_num=GPIO_Pin_0;break;}case 1: {GPIO_Pin_num=GPIO_Pin_1;break;}case 2: {GPIO_Pin_num=GPIO_Pin_2;break;}case 3: {GPIO_Pin_num=GPIO_Pin_3;break;}case 4: {GPIO_Pin_num=GPIO_Pin_4;break;}case 5: {GPIO_Pin_num=GPIO_Pin_5;break;}case 6: {GPIO_Pin_num=GPIO_Pin_6;break;}case 7: {GPIO_Pin_num=GPIO_Pin_7;break;}case 8: {GPIO_Pin_num=GPIO_Pin_8;break;}case 9: {GPIO_Pin_num=GPIO_Pin_9;break;}case 10: {GPIO_Pin_num=GPIO_Pin_10;break;}case 11: {GPIO_Pin_num=GPIO_Pin_11;break;}case 12: {GPIO_Pin_num=GPIO_Pin_12;break;}case 13: {GPIO_Pin_num=GPIO_Pin_13;break;}case 14: {GPIO_Pin_num=GPIO_Pin_14;break;}}// 初始化APB2外设时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); // 配置GPIO - ODR/CLRGPIO_InitTypeDef GPIO_InitStructure;			// 配置结构体GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; 	// 上拉输入	GPIO_InitStructure.GPIO_Pin= GPIO_Pin_num;			// GPIOB的0号引脚GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; // 50MHZ GPIO_Init(GPIOB,&GPIO_InitStructure);}void PhotoSensor_ON(unsigned char pin_num)
{switch (pin_num){case 0: {GPIO_ResetBits(GPIOB,GPIO_Pin_0);break;}case 1: {GPIO_ResetBits(GPIOB,GPIO_Pin_1);break;}case 2: {GPIO_ResetBits(GPIOB,GPIO_Pin_2);break;}case 3: {GPIO_ResetBits(GPIOB,GPIO_Pin_3);break;}case 4: {GPIO_ResetBits(GPIOB,GPIO_Pin_4);break;}case 5: {GPIO_ResetBits(GPIOB,GPIO_Pin_5);break;}case 6: {GPIO_ResetBits(GPIOB,GPIO_Pin_6);break;}case 7: {GPIO_ResetBits(GPIOB,GPIO_Pin_7);break;}case 8: {GPIO_ResetBits(GPIOB,GPIO_Pin_8);break;}case 9: {GPIO_ResetBits(GPIOB,GPIO_Pin_9);break;}case 10: {GPIO_ResetBits(GPIOB,GPIO_Pin_10);break;}case 11: {GPIO_ResetBits(GPIOB,GPIO_Pin_11);break;}case 12: {GPIO_ResetBits(GPIOB,GPIO_Pin_12);break;}case 13: {GPIO_ResetBits(GPIOB,GPIO_Pin_13);break;}case 14: {GPIO_ResetBits(GPIOB,GPIO_Pin_14);break;}case 15: {GPIO_ResetBits(GPIOB,GPIO_Pin_15);break;}		}
}void PhotoSensor_OFF(unsigned char pin_num)
{switch (pin_num){case 0: {GPIO_SetBits(GPIOB,GPIO_Pin_0);break;}case 1: {GPIO_SetBits(GPIOB,GPIO_Pin_1);break;}case 2: {GPIO_SetBits(GPIOB,GPIO_Pin_2);break;}case 3: {GPIO_SetBits(GPIOB,GPIO_Pin_3);break;}case 4: {GPIO_SetBits(GPIOB,GPIO_Pin_4);break;}case 5: {GPIO_SetBits(GPIOB,GPIO_Pin_5);break;}case 6: {GPIO_SetBits(GPIOB,GPIO_Pin_6);break;}case 7: {GPIO_SetBits(GPIOB,GPIO_Pin_7);break;}case 8: {GPIO_SetBits(GPIOB,GPIO_Pin_8);break;}case 9: {GPIO_SetBits(GPIOB,GPIO_Pin_9);break;}case 10: {GPIO_SetBits(GPIOB,GPIO_Pin_10);break;}case 11: {GPIO_SetBits(GPIOB,GPIO_Pin_11);break;}case 12: {GPIO_SetBits(GPIOB,GPIO_Pin_12);break;}case 13: {GPIO_SetBits(GPIOB,GPIO_Pin_13);break;}case 14: {GPIO_SetBits(GPIOB,GPIO_Pin_14);break;}case 15: {GPIO_SetBits(GPIOB,GPIO_Pin_15);break;}			}
}void PhotoSensor_Turn(unsigned char pin_num)
{// version 2uint16_t GPIO_Pin_num=0;switch (pin_num){case 0: {GPIO_Pin_num=GPIO_Pin_0;break;}case 1: {GPIO_Pin_num=GPIO_Pin_1;break;}case 2: {GPIO_Pin_num=GPIO_Pin_2;break;}case 3: {GPIO_Pin_num=GPIO_Pin_3;break;}case 4: {GPIO_Pin_num=GPIO_Pin_4;break;}case 5: {GPIO_Pin_num=GPIO_Pin_5;break;}case 6: {GPIO_Pin_num=GPIO_Pin_6;break;}case 7: {GPIO_Pin_num=GPIO_Pin_7;break;}case 8: {GPIO_Pin_num=GPIO_Pin_8;break;}case 9: {GPIO_Pin_num=GPIO_Pin_9;break;}case 10: {GPIO_Pin_num=GPIO_Pin_10;break;}case 11: {GPIO_Pin_num=GPIO_Pin_11;break;}case 12: {GPIO_Pin_num=GPIO_Pin_12;break;}case 13: {GPIO_Pin_num=GPIO_Pin_13;break;}case 14: {GPIO_Pin_num=GPIO_Pin_14;break;}}if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_num)==0){GPIO_SetBits(GPIOB,GPIO_Pin_num);}else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_num)==1){GPIO_ResetBits(GPIOB,GPIO_Pin_num);}// version 1
//	switch (pin_num)
//	{
//		case 0: {
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_0);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_0);
//			}
//			break;
//		}
//		case 1: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_1)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_1);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_1)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_1);
//			}
//			break;
//		}
//		case 2: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_2)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_2);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_2)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_2);
//			}
//			break;
//		}
//		case 3: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_3);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_3)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_3);
//			}
//			break;
//		}
//		case 4: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_4)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_4);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_4)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_4);
//			}
//			break;
//		}
//		case 5: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_5);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_5)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_5);
//			}
//			break;
//		}
//		case 6: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_6)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_6);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_6)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_6);
//			}
//			break;
//		}
//		case 7: {			
//			if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7)==0)
//			{
//				GPIO_SetBits(GPIOB,GPIO_Pin_7);
//			}
//			else if (GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_7)==1)
//			{
//				GPIO_ResetBits(GPIOB,GPIO_Pin_7);
//			}
//			break;
//		}	
//	}
}uint8_t PhotoSensor_Get(unsigned char pin_num)
{uint16_t GPIO_Pin_num=0;switch (pin_num){case 0: {GPIO_Pin_num=GPIO_Pin_0;break;}case 1: {GPIO_Pin_num=GPIO_Pin_1;break;}case 2: {GPIO_Pin_num=GPIO_Pin_2;break;}case 3: {GPIO_Pin_num=GPIO_Pin_3;break;}case 4: {GPIO_Pin_num=GPIO_Pin_4;break;}case 5: {GPIO_Pin_num=GPIO_Pin_5;break;}case 6: {GPIO_Pin_num=GPIO_Pin_6;break;}case 7: {GPIO_Pin_num=GPIO_Pin_7;break;}case 8: {GPIO_Pin_num=GPIO_Pin_8;break;}case 9: {GPIO_Pin_num=GPIO_Pin_9;break;}case 10: {GPIO_Pin_num=GPIO_Pin_10;break;}case 11: {GPIO_Pin_num=GPIO_Pin_11;break;}case 12: {GPIO_Pin_num=GPIO_Pin_12;break;}case 13: {GPIO_Pin_num=GPIO_Pin_13;break;}case 14: {GPIO_Pin_num=GPIO_Pin_14;break;}}return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_num);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148712.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

不容易解的题10.5

31.下一个排列 31. 下一个排列 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/next-permutation/?envTypelist&envIdZCa7r67M会做就不算难题&#xff0c;如果没做过不知道思路&#xff0c;这道题将会变得很难。 这道题相当于模拟cpp的next_permu…

设计加速!11个Adobe XD插件推荐!

你是否一直在寻找可以提升 Adobe XD 工作流程和体验的方法&#xff1f;如果是&#xff0c;一定要试试这些 Adobe XD 插件&#xff01;本文将介绍 11 款好用的 Adobe XD 插件&#xff0c;这些插件可以为 UI/UX 设计添加很酷的新功能&#xff0c;极大提升你的工作效率和产出。让我…

基于STM32 ZigBee无线远程火灾报警监控系统物联网温度烟雾

实践制作DIY- GC00168---ZigBee无线远程监控系统 一、功能说明&#xff1a; 基于STM32单片机设计---ZigBee无线远程监控系统 二、功能说明&#xff1a; 1个主机&#xff1a;STM32F103C系列单片机LCD1602显示器蜂鸣器 ZigBee无线模块3个按键&#xff08;设置、加、减&#xff0…

行与走,放慢自己,思考回顾。

国庆一定要出去走走&#xff01;&#xff01;&#xff01; 为什么要出去行与走&#xff1f; 1、出去行与走看到祖国的大美风景&#xff0c;可以更深刻的认识到我们祖国的美好。 2、可以放空心情&#xff0c;排除掉积攒在写字楼内的方格子里面的郁闷和烦恼。 3、可以为自己的…

阿里云服务器地域和可用区查询表_地域可用区大全

阿里云服务器地域和可用区有哪些&#xff1f;阿里云服务器地域节点遍布全球29个地域、88个可用区&#xff0c;包括中国大陆、中国香港、日本、美国、新加坡、孟买、泰国、首尔、迪拜等地域&#xff0c;同一个地域下有多个可用区可以选择&#xff0c;阿里云服务器网分享2023新版…

Vscode爆红Delete `␍`eslintprettier/prettier

一、先看报错 文件中爆红&#xff0c;提示 Delete ␍eslintprettier/prettier 二、解决方案 项目根目录下&#xff0c;.prettierrc.js 文件中&#xff1a; endOfLine: auto,三、重启VsCode 此时不在爆红&#xff0c;问题完美解决

windows11 安装Nodejs

一、介绍 NPM 全称 Node Package Manager&#xff0c;它是 JavaScript 的包管理工具, 并且是 Node.js 平台的默认包管理工具。通 过 NPM 可以安装、共享、分发代码,管理项目依赖关系。 可从NPM服务器下载别人编写的第三方包到本地使用。可从NPM服务器下载并安装别人编写的命令…

走进Spring的世界 —— Spring底层核心原理解析(一)

文章目录 前言一、Spring中是如何创建一个对象二、Bean的创建过程三、推断构造方法四、AOP大致流程五、Spring事务 前言 ClassPathXmlApplicationContext context new ClassPathXmlApplicationContext("config.xml"); UserService userService (UserService) cont…

Cannot resolve MVC view ‘xxx‘

这是在springboot下通过controller访问templates目录下的静态文件&#xff08;Hello.html)报的错误 原因&#xff1a;缺少thymeleaf依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</ar…

SSM - Springboot - MyBatis-Plus 全栈体系(十八)

第四章 SpringMVC SpringMVC 实战&#xff1a;构建高效表述层框架 一、SpringMVC 简介和体验 1. 介绍 Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架&#xff0c;从一开始就包含在 Spring Framework 中。正式名称“Spring Web MVC”来自其源模块的名称&#xff08…

【计算机组成原理】考研真题攻克与重点知识点剖析 - 第 1 篇:计算机系统概述

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

剑指offer——JZ35 复杂链表的复制 解题思路与具体代码【C++】

一、题目描述与要求 复杂链表的复制_牛客题霸_牛客网 (nowcoder.com) 题目描述 输入一个复杂链表&#xff08;每个节点中有节点值&#xff0c;以及两个指针&#xff0c;一个指向下一个节点&#xff0c;另一个特殊指针random指向一个随机节点&#xff09;&#xff0c;请对此链…

QT商业播放器

QT商业播放器 总体架构图 架构优点&#xff1a;解耦&#xff0c;采用生产者消费者设计模式&#xff0c;各个线程各司其职&#xff0c;通过消息队列高效协作 这个项目是一个基于ijkplayer和ffplayer.c的QT商业播放器, 项目有5部分构成&#xff1a; 前端QT用户界面 后端是集成了…

成都建筑模板批发市场在哪?

成都作为中国西南地区的重要城市&#xff0c;建筑业蓬勃发展&#xff0c;建筑模板作为建筑施工的重要材料之一&#xff0c;在成都也有着广泛的需求。如果您正在寻找成都的建筑模板批发市场&#xff0c;广西贵港市能强优品木业有限公司是一家值得关注的供应商。广西贵港市能强优…

数组(数据结构)

优质博文&#xff1a;IT-BLOG-CN 一、简介 数组Array是一种线性表数据结构&#xff0c;它用一组连续的内存空间&#xff0c;存储一组具有相同类型的数据。 数组因具有连续的内存空间的特点&#xff0c;数据拥有非常高效率的“随机访问”&#xff0c;时间复杂度为O(1)。但因要保…

高中生自学Python,这里给大家一些建议

高一学业压力比较重&#xff0c;如果你还是选择自学Python&#xff0c;每天可以抽出一两个小时来学习的话&#xff0c;也是可以的。下面是我给你的5点建议&#xff1a; 找浅显易懂&#xff0c;例子比较好的教程&#xff0c;从头到尾看下去。不要看很多本&#xff0c;专注于一本…

算法通过村第十一关-位运算|黄金笔记|位运算压缩

文章目录 前言用4kb内存寻找重复元素总结 前言 提示&#xff1a;如果谁对你说了地狱般的话&#xff0c;就代表了他的心在地狱。你不需要相信那样的话&#xff0c;就算对方是你的父母也一样。 --高延秀《远看是蔚蓝的春天》 位运算有个很重要的作用就是能用比较小的空间存储比较…

DHCPsnooping 配置实验(2)

DHCP报文泛洪攻击 限制接收到报文的速率 vlan 视图或者接口视图 dhcp request/ dhcp-rate dhcp snooping check dhcp-request enable dhcp snooping alarm dhcp-request enable dhcp snooping alarm dhcp-request threshold 1 超过则丢弃报文 查看[Huawei]dis dhcp statistic…

【已解决】RuntimeError Java gateway process exited before sending its port number

RuntimeError: Java gateway process exited before sending its port number 问题 思路 &#x1f3af;方法一 在代码前加入如下代码&#xff08;如图&#xff09;&#xff1a; import os os.environ[‘JAVA_HOME’] “/usr/local/jdk1.8.0_221” # 记得把地址改成自己的 …

CV经典任务(二)目标检测 |单目标,多目标 非极大值抑制等

文章目录 1 目标检测1.1 单目标检测1.2 多目标检测3.2.1 阶段一 单像素点采样目标检测3.2.2 阶段二 多像素点采样目标检测3.2.3 阶段三 RNN3.2.4 阶段四 一阶段的目标检测 Yolo/SSD 1 目标检测 目标检测的重要任务是 目标定位&#xff1a;目标检测的首要任务是确定图像中对象…