目录
一:点亮1个LED
1:连接图
2:函数介绍
3:点灯代码
二:LED闪烁
1:函数介绍
2:闪烁代码
三:LED流水灯
1:连接图
2:函数介绍
3:流水灯代码
四:按键控制LED
1:电路图
2:连接图
3:函数介绍
4:按键控制LED代码
五:蜂鸣器
1:连接图
2:蜂鸣器代码
六:光敏电阻控制蜂鸣器
1:连接图
2:函数介绍
3:光敏电阻控制蜂鸣器代码
一:点亮1个LED
1:连接图
因为IO口与LED负极相连所以IO口输出低电频,点亮LED (采用的是低电频点亮)
STM32的GPIO(通用输入输出口)总共需要3个步骤
A:第一步,使用RCC开启GPIO的时钟
B:第二步,使用GPIO_Init函数初始化GPIO
C:第三步,使用输出或者输入的函数控制GPIO口
2:函数介绍
stm32f10x_rcc.h文件中经常使用的函数只有3个 (RCC开启GPIO的时钟):
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);
RCC_AHBPeriphClockCmd: 第一个参数就是选择哪个外设 ,第二个参数ENABLE(启动) or DISABLE(无效))
RCC_APB2PeriphClockCmd和RCC_APB1PeriphClockCmd参数意思一致: 第一个参数选择外设,第二个参数使能ENABLE或失能DISABLE
stm32f10x_gpio.h文件中经常使用的函数很多(PIO_Init函数初始化GPIO) :
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
void GPIO_AFIODeInit(void);
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
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);
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);
GPIO_Init: 这个函数的作用是,用结构体的参数来初始化GPIO口, 我们首先需要先定义一个结构体变量,然后再给结构体赋值,最后调用这个函数. 这个函数内部就会自动读取结构体内部的值,然后自动把外设的各个参数配置好.
第一个参数就是选择哪个外设, 第二个参数就是结构体,我们先把结构体类型复制下来
使用输出或者输入的函数控制GPIO口
GPIO_ResetBits: 第一个参数就是选择哪个外设(GPIOx x=A~G), 第二个参数就是 GPIO_Pin_x (x=0~15)把指定的端口设置为低电频,
3:点灯代码
#include "stm32f10x.h" // Device header
int main(void){//第一步,使用RCC开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//第二步,使用GPIO Init函数初始化GPIOGPIO_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;GPIO_Init(GPIOA,&GPIO_InitStructure);//第三步,使用输出或者输入的函数控制GPIO口GPIO_ResetBits(GPIOA,GPIO_Pin_0);while(1){}
}
推挽输出 GPIO_Mode_Out_PP高低电频都有驱动能力
二:LED闪烁
连接图同(一:点亮1个LED)
1:函数介绍
stm32f10x_gpio.h文件中经常使用的函数很多(PIO_Init函数初始化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);
GPIO_SetBits和GPIO_ResetBits函数的参数相同: 第一个参数就是选择哪个外设(GPIOx x=A~G) , 第二个参数就是 GPIO_Pin_x (x=0~15),
GPIO_SetBits第二给参数可以把指定的参数设置为高电频
GPIO_ResetBits第二给参数可以把指定的参数设置为低电频
GPIO_WriteBit: 第一个参数就是选择哪个外设(GPIOx x=A~G) , 第二个参数就是 GPIO_Pin_x (x=0~15),第三个参数Bit_RESET(把第二个参数设置为低电频) or Bit_SET(把第二个参数设置为高电频 一次写1位; Bit_RESET=(BitAction)0 把0强制转化为BitAction枚举类型同理 Bit_SET一样
2:闪烁代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void){//第一步,使用RCC开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//第二步,使用GPIO Init函数初始化GPIOGPIO_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;GPIO_Init(GPIOA,&GPIO_InitStructure);//第三步,使用输出或者输入的函数控制GPIO口//GPIO_ResetBits(GPIOA,GPIO_Pin_0);低//GPIO_SetBits(GPIOA,GPIO_Pin_0); //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); //Bit_SET高 Bit_RESET低while(1){//Bit_RESET=(BitAction)0 把0强制转化为BitAction枚举类型GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)0);Delay_ms(500);GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);Delay_ms(500);}
}
三:LED流水灯
1:连接图
2:函数介绍
stm32f10x_gpio.h文件中经常使用的函数很多(PIO_Init函数初始化GPIO) :
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
GPIO_Write: 第一个参数就是选择哪个外设(GPIOx x=A~G) , 第二个参数就是直接写到GPIO的ODR寄存器里的; 这里写的是。指定写到输出数据寄存器的值; 一次写16位
3:流水灯代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void){//第一步,使用RCC开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//第二步,使用GPIO Init函数初始化GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_All; //打开GPIOA的16个IO口GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//第三步,使用输出或者输入的函数控制GPIO口//GPIO_ResetBits(GPIOA,GPIO_Pin_0);低//GPIO_SetBits(GPIOA,GPIO_Pin_0); //GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); //Bit_SET高 Bit_RESET低while(1){int data=0x0001; //0x0001=0000 0000 0000 0001for(int i=0;i<8;i++){ GPIO_Write(GPIOA,~data); Delay_ms(500);data=data<<1;}}
}
四:按键控制LED
1:电路图
经常使用的有两种模式
电阻值越小下拉能力越强; stm32必须为上拉输入(GPIO_Mode_IPU)的模式;
当k1按下时k1电阻忽略不计,下拉能力强,又因为接低,使用为低电频; 反之不按下K1相当于断路电阻极大,下拉能力弱, 上拉能力相对变强;
这两种连接方式: 按下位低电频(0);松手为高电频(1);
2:连接图
3:函数介绍
stm32f10x gpio.h 文件里面的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);
参数和上面的差不多; 后面有Bit的就是一位一位的输入或者输出,没有bit的是对16位一次性的进行输入或者输出
读取IO口使用xInputx函数; 在输出模式下,想要看一下现在输出了什么使用xOutputx函数
4:按键控制LED代码
#include "stm32f10x.h" // Device headervoid Delay_ms(uint32_t xms)
{while(xms--){Delay_us(1000);}
}uint8_t KEY_init(){//第一步,使用RCC开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//第二步,使用GPIO_Init函数初始化GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}uint8_t LED_init(){//第一步,使用RCC开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//第二步,使用GPIO_Init函数初始化GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//默认为低电频,低电频点亮LEDGPIO_SetBits(GPIOA,GPIO_Pin_1 | GPIO_Pin_2);
}//按键函数
uint8_t KEY_pad(){uint8_t KeyName;if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);Delay_ms(20);KeyName=1;}if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){Delay_ms(20);while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);Delay_ms(20);KeyName=2;}return KeyName;
}//取反函数
uint8_t LED1_Turn()
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)//输出寄存器为低电频{GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
}
uint8_t LED2_Turn()
{if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0){GPIO_SetBits(GPIOA, GPIO_Pin_2);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_2);}
}uint8_t KeyNum;
int main(void){LED_init();KEY_init();while(1){KeyNum=KEY_pad();if(KeyNum==1){LED1_Turn();}if(KeyNum==2){LED2_Turn();}}}
五:蜂鸣器
我们使用的是有源蜂鸣器:低电频触发
有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定
1:连接图
2:蜂鸣器代码
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void){//第一步,使用RCC开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//第二步,使用GPIO Init函数初始化GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode= GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12; //打开GPIOA的16个IO口GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//第三步,使用输出或者输入的函数控制GPIO口//GPIO_ResetBits(GPIOA,GPIO_Pin_0);低//GPIO_SetBits(GPIOA,GPIO_Pin_0); 高//GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_RESET); //Bit_SET高 Bit_RESET低while(1){GPIO_WriteBit(GPIOB,GPIO_Pin_12,(BitAction)0);Delay_ms(100);GPIO_SetBits(GPIOB,GPIO_Pin_0);Delay_ms(100);GPIO_ResetBits(GPIOB,GPIO_Pin_0);Delay_ms(100);GPIO_WriteBit(GPIOB,GPIO_Pin_12,(BitAction)1);Delay_ms(700);}}
六:光敏电阻控制蜂鸣器
1:连接图
光敏电阻:,DO数字输出端
2:函数介绍
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
对IO引脚(输入数据寄存器)一位的读取,
3:光敏电阻控制蜂鸣器代码
#include "stm32f10x.h" // Device headeruint8_t Buzzer_init(){//第一步,使用RCC开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//第二步,使用GPIO_Init函数初始化GPIOGPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);
}
uint8_t LightSensor_init(){//第一步,使用RCC开启GPIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//第二步,使用GPIO_Init函数初始化GPIO //GPIO_Mode_Out_PP;推挽输出GPIO_InitTypeDef GPIO_InitStructure; //GPIO_Mode_IPU 上拉输出GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;推挽输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);}uint8_t Buzzer_ON(){GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}uint8_t Buzzer_OFF(){GPIO_SetBits(GPIOB,GPIO_Pin_12); //高电频
}uint8_t LightSensor(){
//读取Io引脚PB13状态的读取,返回值为1或者oreturn GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_13);
}int num;
int main(void){Buzzer_init();LightSensor_init();while (1){num=LightSensor();if (num==1){Buzzer_ON();}else {Buzzer_OFF(); }}
}