容忍5V电压
FT = FIve Tolerate 允许5V
寄存器就是特殊的存储器
上拉输入和下拉输入 如果输入啥都不接,IO口输入电平极容易受外部电平干扰,加上拉电阻就是为了保护输入引脚的电平。
为了避免引脚悬空导致输入数据不确定
上拉输入默认为高电平的输入模式
下拉输入默认为低电平的输入模式
STM32的上拉和下拉,都是一种弱上拉或者下拉,因为阻值比较大。
施密特触发器的作用,就是稳定电压。
IO口三种输出方式,第一种对16位输出数据寄存器写(比较麻烦不能按位写,只能16位一起写,会影响其它位的数据)
第二种位设置/清除寄存器,可以单独对位进行操作,内部电路自动执行,不会影响其它位的数值。
第三种 位带操作,(分配的专有地址)对应的是RAM和寄存器的映射,类似51寄存器的sfr位寻址。
强推挽输出,具有较强的输出能力。
开漏输出 ,IIC通信,兼容一些5V传感器。低电平具有输出能力,高电平不具备。
关闭:在IO口输入模式下生效,IO口由外部电平决定高低。
GPIO8种模式
很多单片机都采用高电平,弱驱动,低电平强驱动的规则,所以一般推荐,使用外部供电接法,
主程序
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
//打开APB2时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//定义结构体类型变量
GPIO_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;
//完成GPIOA的初始化
GPIO_Init(GPIOA,&GPIO_InitStructure);
//写0
//GPIO_SetBits(GPIOA,GPIO_Pin_0);
while(1)
{
//使用GPIO库函数写0和1
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
Delay_ms(500);
GPIO_SetBits(GPIOA,GPIO_Pin_0);
Delay_ms(500);
// GPIO_WriteBit(GPIOA ,GPIO_Pin_0,Bit_RESET);
// Delay_ms(500);
// GPIO_WriteBit(GPIOA,GPIO_Pin_0,Bit_SET);
// Delay_ms(500);
// GPIO_WriteBit(GPIOA ,GPIO_Pin_0,(BitAction)0);
// Delay_ms(500);
// GPIO_WriteBit(GPIOA,GPIO_Pin_0,(BitAction)1);
// Delay_ms(500);
}
}
延时库函数
#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);
}
}
工程目录
编译下载。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)