一、GPIO输出
项目1:流水灯
1.使用RCC开启GPIO时钟
2.使用GPIO_Init初始化GPIO
3.使用输入或输出函数控制GPIO口
目录
项目内容:
将LED灯依次连接在A0-A7,使用keil5编写程序,其中延时函数为网上写好的函数。
main.c:
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
//1、使用RCC开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//2、使用GPIO_Init初始化GPIO
GPIO_InitTypeDef LED;
//3、使用输出或输入函数控制GPIO口
LED.GPIO_Mode = GPIO_Mode_Out_PP;
LED.GPIO_Pin = GPIO_Pin_All;
LED.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&LED);
//GPIO_ResetBits(GPIOA,GPIO_Pin_0);
//GPIO_SetBits(GPIOA,GPIO_Pin_0);
while(1)
{
GPIO_Write(GPIOA,~0x0001);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0002);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0004);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0008);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0010);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0020);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0040);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0080);
Delay_ms(100);
}
}
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);
}
}
Delay.h
#include "stm32f10x.h" // Device header
#ifndef __DELAY_H
#define __DELAY_H
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);
#endif
项目2:蜂鸣器
项目内容:
通过配置GPIOB_12输出低电平触发蜂鸣器,延时函数可用上方函数
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
//1、使用RCC开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//2、使用GPIO_Init初始化GPIO
GPIO_InitTypeDef FMQ;
//3、使用输出或输入函数控制GPIO口
FMQ.GPIO_Mode = GPIO_Mode_Out_PP;
FMQ.GPIO_Pin = GPIO_Pin_12;
FMQ.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&FMQ);
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
Delay_ms(500);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
Delay_ms(500);
}
}
二、GPIO输入
项目1:按键控制LED
项目内容:
通过使用函数GPIO_ReadInputDataBit和GPIO_ReadOutputDataBit读取GPIO口输入输出的状态,通过判断输入和输出的状态来开启/关闭对应LED灯.
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"
int keynum;
int main(void)
{
LED_Init();
key_init();
while(1)
{
keynum = key_getnum();
if(keynum == 1)
{
LED1_Turn();
}
if(keynum == 2)
{
LED2_Turn();
}
}
}
LED.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void LED_Init(void)
{
//RC开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//初始化GPIO
GPIO_InitTypeDef LED;
LED.GPIO_Mode = GPIO_Mode_Out_OD;
LED.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
LED.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&LED);
GPIO_SetBits(GPIOA,GPIO_Pin_0 |GPIO_Pin_1);
}
void LED1_on(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}
void LED2_on(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
void LED1_off(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_0);
}
void LED2_off(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
void LED1_Turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)==0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_0);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
}
}
void LED2_Turn(void)
{
if(GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)==0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);
}
}
key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void key_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef KEY;
KEY.GPIO_Mode = GPIO_Mode_IPU;
KEY.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_6;
KEY.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&KEY);
}
uint8_t key_getnum(void)
{
uint8_t key_num = 0;
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0)
{
//Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 1);
//Delay_ms(20);
key_num = 1;
}
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 0)
{
//Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6) == 1);
//Delay_ms(20);
key_num = 2;
}
return key_num;
}
项目2:光敏传感器控制蜂鸣器
上拉电阻或者下拉电阻如果电阻越小 上拉或者下拉力就会增强,反之电阻越大上拉或者下拉越小
项目内容:
通过判断光敏传感器的状态来实现蜂鸣器的开与关
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Buzz.h"
#include "light.h"
int lightnum;
int main(void)
{
Buzz_Init();
light_init();
while(1)
{
lightnum = light_getnum();
if(lightnum == 1)
{
Buzz_on();
}
else
Buzz_off();
}
}
buzz.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Buzz_Init(void)
{
//RC开启GPIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//初始化GPIO
GPIO_InitTypeDef Buzz;
Buzz.GPIO_Mode = GPIO_Mode_Out_OD;
Buzz.GPIO_Pin = GPIO_Pin_12;
Buzz.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&Buzz);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
void Buzz_on(void)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
}
void Buzz_off(void)
{
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
light.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void light_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef light;
light.GPIO_Mode = GPIO_Mode_IPU;
light.GPIO_Pin = GPIO_Pin_15;
light.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&light);
}
uint8_t light_getnum(void)
{
uint8_t light_num = 0;
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15) == 0)
{
//Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_15) == 1);
//Delay_ms(20);
light_num = 1;
}
return light_num;
}
总结:
使用GPIO的时候,流程如下:1.RCC开启GPIO时钟 2.初始化GPIO 3.使用输入或输出函数来使GPIO输出高低电平、检测状态等....