stm32 - GPIO
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/CLR
GPIO_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); // version2
Delay_ms(500);
// GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET); // Bit_SET 高电平
GPIO_SetBits(GPIOA,GPIO_Pin_0); // version2
Delay_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)); //等待计数到0
SysTick->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 register
GPIO_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/CLR
GPIO_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); // version2
Delay_ms(500);
// GPIO_WriteBit(GPIOB,GPIO_Pin_12,Bit_SET); // Bit_SET 高电平
GPIO_SetBits(GPIOB,GPIO_Pin_12); // version2
Delay_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/CLR
GPIO_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/CLR
GPIO_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/CLR
GPIO_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 2
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;}
}
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/CLR
GPIO_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 2
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;}
}
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);
}