历史上的今天
今天是:2025年03月13日(星期四)
2019年03月13日 | STM32F4开发板----GPIO(001)
2019-03-13 来源:eefocus
STM32F4开发板快速入门—-GPIO篇
GPIO
设置输入/出总共8种模式
* 输入浮空,输入上拉,输入下拉,模拟输入。
* 开漏输出,推挽输出,推挽复用共功能,开漏复用功能
模式选择的话,一般得看具体电路了,具体看输入的信号,比如接低电平信号,上拉成高电平,接高电平信号下拉成低电平。
初始化参数
/**
* @brief GPIO Init structure definition
*/
typedef struct
{
uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
This parameter can be any value of @ref GPIO_pins_define */
GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins.
This parameter can be a value of @ref GPIOMode_TypeDef */
GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.
This parameter can be a value of @ref GPIOSpeed_TypeDef */
GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type for the selected pins.
This parameter can be a value of @ref GPIOOType_TypeDef */
GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull-up/Pull down for the selected pins.
This parameter can be a value of @ref GPIOPuPd_TypeDef */
}GPIO_InitTypeDef;
初始化实例,设置GPIOF.9|10普通输出模式
推挽输出,速度为100MHz,上拉,同时引脚置高
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//Ê使能GPIOF时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式1
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化
GPIO_SetBits(GPIOF,GPIO_Pin_9 | GPIO_Pin_10);//GPIOF9,F10引脚置高
相关所有的库函数
/* Function used to set the GPIO configuration to the default reset state ****/
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
/* Initialization and Configuration functions *********************************/
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* GPIO Read and Write functions **********************************************/
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);
void GPIO_ToggleBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
/* GPIO Alternate functions configuration function ****************************/
void GPIO_PinAFConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_PinSource, uint8_t GPIO_AF);
设置高低电平语句
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
GPIO_SetBits(GPIOA, GPIO_Pin_5); //GPIOA.5=1,置位高电平·;
void GPIO_ResetBits(GPIOA, GPIO_Pin_5); //GPIOA.5=0,置位低电平;
或者按照这种模式
//IO操作,只对单一IO口
//确保n的值小于16
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输出
设置实例对比
/*下面方式是直接操作库函数方式读取IO*/
#define KEY0 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) //PE4
#define KEY1 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) //PE3
#define KEY2 GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) //PE2
#define WK_UP GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) //PA0
下面是直接同为位带操作读取IO
/*
#define KEY0 PEin(4) //PE4
#define KEY1 PEin(3) //PE3
#define KEY2 PEin(2) //P32
#define WK_UP PAin(0) //PA0
*/
按键处理,矩阵键盘
对于按键,使用读函数
逻辑分析
//支持连续按下
void key_scan(){
if(key按下){
return 按键按下
}else
return 按键没有按下
}
//不支持连续按下
void key_scan(){
static u8 key_up=1;//记录上次状态,初始化松开
if(key按下){
if(key_up=1)//松开了,按键有效
return 按键按下
else
return 按键松开
key_up=0
}else
key_up=1;//松开
}
实例对比
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键松开标志
if(mode)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);//去抖动
key_up=0;
if(KEY0==0)return 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;// 无按键按下
}
矩阵键盘的话
u8 KEY_Scan(u8 mode) //mode=0 ????? mode=1
{
if(mode)key_up=1;
GPIO_SetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
if(key_up && GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15)==1)
{
delay_ms(10);//去抖动
key_up=0;
GPIO_SetBits(GPIOD,GPIO_Pin_8);
GPIO_ResetBits(GPIOD,GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 1;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 2;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 3;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 4;
GPIO_SetBits(GPIOD,GPIO_Pin_9);
GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_11);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 5;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 6;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 7;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 8;
GPIO_SetBits(GPIOD,GPIO_Pin_10);
GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_11);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 9;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 10;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 11;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 12;
GPIO_SetBits(GPIOD,GPIO_Pin_11);
GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);
if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==1) return 13;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==1) return 14;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==1) return 15;
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==1) return 16;
}
else if(GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_12)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_13)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_14)==0&&GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_15)==0)
key_up=1;
return 0;
}
下一篇:关于STM32精准采频率的实现
史海拾趣
|
一防:设防,将干扰拒之门外,措施: 1. 线缆穿镀锌铁管,走金属线槽; 2. 线缆埋地; 3. 采用双绝缘双屏蔽抗干扰同轴电缆; 4. 摄像机与护罩绝缘,护罩接大地; 二避:改变视频原信号传输频带或传输方式,避开视频带宽内的干扰,措施: 1. ...… 查看全部问答> |
|
用IAR 写51的程序 发现有的函数调用的时候将编译器返回地址入栈了, 而有的函数在调用的时候却没有将返回地址入栈,但是执行完函数后依然能够正确返回 这是什么原因呢? … 查看全部问答> |
|
香主从外部RAM到芯片内部RAM最高传输速度为多少72M时钟10ns的高速SRAM,我按照keilARMExamplesSTSTM32F10xFWLibExa ...… 查看全部问答> |
|
TMS320LF2407A程序烧不进去?unable to clear **** Begin Sector Clear Operation **** OK: Flash Algorithm loaded into DSP memory OK: Write sector value 0x0001 to symbol PRG_options OK: Set Breakpoint at PRG_stop OK: Running flash algorithm OK: DSP Halted OK: Read status ...… 查看全部问答> |
|
在能源挑战日趋严峻的背景之下,太阳能成为了一种新型和快速壮大的技术。以廉价和高效的方式发电是关键的需求,而 C2000 的 Piccolo MCU 拥有可满足上述两项需求的强大特性,从而使其成为太阳能逆变器控制的必然选择。本视频共有两部分,来自TI Tec ...… 查看全部问答> |
|
嗯,开贴说说电路设计,今天终于开始画图了 1)RGB转VGA电路,用的ADI实验室电路哇,maylove能帮我搞点样品么,ADV7125和AD1580各2pcs就行啦,电路就不分析了ADI实验室电路大家懂得 2)NAND Flash 参考官方电路,也不多说了 3)液晶显示电路 ...… 查看全部问答> |




