02-GPIO-铁头山羊STM32标准库新版笔记
一、GPIO四种输出模式

GPIO有8种工作模式

输出:通过写0或者写1,控制引脚输出低电压或者高电压
输入:通过读取引脚是0还是1,判断引脚输入的是低电压还是高电压
通用:CPU
复用:其它片上外设
推挽:

开漏:

二、IO的最大输出速度
IO最大输出速度:向IO交替写0和1且输出不失真的最快速度

选取满足要求的最小值,过于陡峭的边沿会增加耗电、并引入EMI问题。
三、LED闪灯实验



板载LED的工作模式是通用输出开漏

点击查看代码
//引脚编号
GPIO_Pin_0~GPIO_Pin_15
//模式
GPIO_Mode_Out_PP //通用输出推挽
GPIO_Mode_Out_OD //通用输出开漏
GPIO_Mode_AF_PP //复用输出推挽
GPIO_Mode_AF_OD //复用输出开漏
GPIO_Mode_IPU_ //输入上拉
GPIO_Mode_IPD_ //输入下拉
GPIO_Mode_IN_FLOATING //输入浮空
GPIO_Mode_AIN //模拟模式
//最大输出速度
GPIO_Speed_2MHz
GPIO_Speed_10MHz
GPIO_Speed_50MHz
//向IO引脚写0/1 示例:PC13
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);
GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);
//读取IO引脚0/1
GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == Bit_RESET;
GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == Bit_SET;
效果:LED闪烁
main.c
点击查看代码
#include "stm32f10x.h"
#include "delay.h"
int main(void)
{
Delay_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); // 开启GPIOC的时钟
GPIO_InitTypeDef GPIO_InitStruct; //初始化IO引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &GPIO_InitStruct);
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); //向IO引脚写1
// GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); //向IO引脚写0
while(1)
{
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET); // 亮
Delay(100);
GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET); // 灭
Delay(100);
}
}
delay.h
点击查看代码
#ifndef _DELAY_H_
#define _DELAY_H_
#include "stm32f10x.h"
void Delay_Init(void); // 延迟函数初始化
void Delay(uint32_t ms); // 延迟
uint64_t GetTick(void); // 获取系统的当前时间
#endif
delay.c
点击查看代码
#include "delay.h"
__IO uint64_t ulTicks;
static uint8_t delay_initialized_flag = 0;
//
// @简介:初始化延迟函数
// @返回值:无
//
void Delay_Init(void)
{
if(!delay_initialized_flag)
{
delay_initialized_flag = 1;
RCC_ClocksTypeDef clockinfo = {0};
uint32_t tmp;
SysTick->CTRL &= ~SysTick_CTRL_ENABLE; // 禁止SYSTICK
ulTicks = 0;
RCC_GetClocksFreq(&clockinfo);
SysTick->CTRL |= SysTick_CTRL_TICKINT; // 开启中断
// 设置中断优先级为0
SCB->SHP[7] = 0;
// 设置自动重装值以保证1ms的时钟
tmp = clockinfo.HCLK_Frequency / 1000;
if(tmp > 0x00ffffff)
{
tmp = tmp / 8;
SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE;
}
else
{
SysTick->CTRL |= SysTick_CTRL_CLKSOURCE;
}
SysTick->LOAD = tmp - 1;
SysTick->CTRL |= SysTick_CTRL_ENABLE;
}
}
// @简介:毫秒级延迟
// @参数:Delay - 延迟时长,以毫秒为单位(千分之一秒)
// @返回值:无
// @注意:不允许在中断响应函数中调用此方法
void Delay(uint32_t Delay)
{
Delay_Init();
uint64_t expiredTime = ulTicks + Delay;
while(ulTicks < expiredTime){}
}
// @简介:获取当前时间,以毫秒(千分之一秒)为单位
// @参数:无
// @返回值:当前时间,单位为毫秒(千分之一秒)
uint64_t GetTick(void)
{
Delay_Init();
return ulTicks;
}
五、按钮实验


PA0工作模式为通用输出推挽模式


效果:按下按钮,LED亮,松开按钮,LED灭
main.c
点击查看代码
#include "stm32f10x.h"
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //输出推挽模式
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct); //初始化PA0
// GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //向PA0写1,点亮LED
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStruct);
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == Bit_RESET) //按钮按下
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //亮灯
}
else //按钮松开
{
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //灭灯
}
}
}

浙公网安备 33010602011771号