STM32有关GPIO引脚的一些问题

发布者:云淡雅致最新更新时间:2018-07-21 来源: eefocus关键字:STM32  GPIO 手机看文章 扫描二维码
随时随地手机看文章

/* 
名称:STM32有关GPIO引脚的一些问题 
说明:今天在编写一个键盘扫描程序的时候,出现了一些问题。 
有的引脚能读出电平状态、有点引脚确一直读不出状态。改了一下午,查了好久,终于有点眉目了。现简述如下: 
我在用引脚的时候,使用的是PB0、PB1、PB2、PB3、PB4…,将其引脚配置的方式是上拉输入。PB2、PB3、PB4一直有问题。PB0、PB1是可以读出状态的(但是只能单独使用)。

对于PB2来说,其不仅是PB2,它也是BOOT1引脚。当系统复位之后,开始的几个系统时钟使用的是BOOT1,用来判断系统从何处读取置零。之后,PB2就可以作为普通的IO引脚使用了。由于开发板设置的是从内部FLASH启动,BOOT1一直是置零的。然后,系统启动之后,也没拔短接冒(作用是BOOT1置零),所以PB2一直是低电平。可能这就是PB2引脚不能使用的原因了。 
但是这样还有点不理解,就是PB2既然一直处于低电平,那在我的程序就相当于一直处于按键状态了,但是为什么没出现按下按键该有的反应呢?这点我还没搞清楚,以后有机会再慢慢理解吧。

关于PB3、PB4来说,其复位之后的功能并不是普通的IO引脚,而是用于调试使用的引脚。如果想要其当做普通的IO引脚必须进行重映射。当然,有一个不知道是不是巧合的现象是,单独使用PB4引脚时,也是可以读出电平状态的,也就是说运行的结果是符合预期的。但是,PB4并没有作为普通的IO引脚啊,关于这点,我也还没弄清楚。

相关引脚图如下: 
表头

PB2 
*/

PB3、PB4


//按键输入端口配置

void GPIO_KEY_Config()

{

    GPIO_InitTypeDef GPIO_InitStructure;


    RCC_APB2PeriphClockCmd(KEY_GPIO_CLK,ENABLE);


    GPIO_InitStructure.GPIO_Pin = KEY_GPIO_PIN;


    GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_IPU;      //配置成上拉输入


    GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure);


}




//键盘扫描

int8_t KeyScan()

{

    int8_t i = 0;

    uint16_t test_pin = 0x0010;

    for(;i<4;++i)

    {

        if(GPIO_ReadInputDataBit(KEY_GPIO_PORT,test_pin) == KEY_ON ) 

        {

            delay_ms(10);


            if(GPIO_ReadInputDataBit(KEY_GPIO_PORT,test_pin) == KEY_ON)

            {

                while(GPIO_ReadInputDataBit(KEY_GPIO_PORT,test_pin) == KEY_ON)

                ;


                return i+1 ;

            }


        }


        test_pin = test_pin<<1;


    }


        return -1;


}



头文件:



#define KEY_GPIO_PORT   GPIOB

#define KEY_GPIO_PIN        GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7


#define KEY_GPIO_CLK    RCC_APB2Periph_GPIOB


#define KEY_ON 0

#define KEY_OFF 1



//按键输入端口配置

void GPIO_KEY_Config(void);


//键盘扫描

int8_t KeyScan(void);


关键字:STM32  GPIO 引用地址:STM32有关GPIO引脚的一些问题

上一篇:ARM学习之中断体系结构
下一篇:STM32之SPI读写FLASH(W25Q64)

推荐阅读最新更新时间:2024-03-16 16:09

stm32之TIM-高级定时器应用实例一(详细)
硬件:stm32f103c8t6 开发工具:Keil uVision4 下载调试工具:ARM仿真器 如果第一次接触定时器,可以先看基本定时器。本篇内容较多,如果想直接动手操作,可以跳到后面的实验代码。 stm32标准库对定时器外设建立了4个初始化结构体,定时器分为基本定时器、通用定时器、高级定时器,针对不用的定时器要使用不同初始化结构体。下面是4个初始化结构体的适用分类: TIM_TimeBaseInitTypeDef (基本定时器、通用定时器、高级定时器) TIM_OCInitTypeDef (通用定时器、高级定时器) TIM_ICInitTypeDef (通用定时器、高级定时器
[单片机]
<font color='red'>stm32</font>之TIM-高级定时器应用实例一(详细)
IAR FOR STM8 学习笔记 固件库 GPIO
经过一番挣扎,还是决定使用官方的固件库了。。 从网上下一个STM8S的固件库,记得是FOR IAR的。 找到里面的IAR模板就可以开始用了。 这些都是直接写好的库函数,可以直接调用,但首先得先读懂,先了解些必备知识。 STM8的寄存器的地址 在STM8中,与某个外围设备有关的寄存器在地址上都是顺序排列的;比如与GPIO有关的寄存器有ODR、IDR、DDR、CR1、CR2,与PA口有关的这五个寄存器就被安排在了0x00 5000~0x00 5004这5个地址空间中,它们有一个0x005000的基地址,分别偏移0,1,2,3,4。 ”stm8s.h 中与GPIO有关的定义,以及固件库中访问外围设备寄存器的方法
[单片机]
IAR FOR STM8 学习笔记 固件库 <font color='red'>GPIO</font>
基于STM32的MDK程序启动
;//HeapSize(inBytes) 0x0-0xFFFFFFFF:8 ;// Heap_SizeEQU0x00000020;//定义堆空间大小 AREAHEAP,NOINIT,READWRITE,ALIGN=3;//定义一个数据段,8字节对齐 __heap_base Heap_MemSPACEHeap_Size;//保留Heap_Size的堆空间 __heap_limit;//标号,代表堆末尾地址,后面有用 PRESERVE8;//指示编译器8字节对齐 THUMB;//指示编译器为THUMB指令 ;VectorTableMappedtoAddress0atReset AREARESET,DATA,READONLY;//
[单片机]
STM32初学笔记3之外部中断
学习的第三部分,我选择了外部中断,因为个人觉得除了时序问题,我们应用的最多的就要数中断了,当然还有一个定时器还没学,呵呵,只能往后放一下了。当然,我不打算花太多时间去搞GPIO,所以就自己看了一下手册,能用就行了。 反正学习这些东西还是根据个人的习惯吧,我学习主要也就是参考ST给的示例程序,反正还是很有用的。今天花了差不多两个小时的时间根据EXTI的示例程序自己编写了一个程序,最后在ALIENTEK上面运行成功,下面将示例代码展示如下: 笔者将跟硬件平台有关的配置放在一个板级支持包的源文件里面,具体请查看: 板级支持包的应用 一文。 一、GPIO的配置 二、嵌入向量中断控制器配置 三、中断服务程序 说
[单片机]
<font color='red'>STM32</font>初学笔记3之外部中断
STM32输出比较模式输出不动频率的脉冲
//以下为TIM配置程序 void TIM1_PWM_INIT(void) //TIM1配置PWM输出参数 { u32 temp_fre,temp_duty; TempC = 60; //设置频率初始值 TempD = 4; //设置初始占空比1 / 2 temp_fre = (1000000 / TempC) - 1; temp_duty = ((temp_fre + 1) / TempD); TIM_TimeBaseStructure.TIM_Prescaler = 72; TIM_TimeBaseStructure.TIM_CounterMode
[单片机]
stm32跑马灯——寄存器和位操作
寄存器版: GPIO基础: 每组io口有7个寄存器。也就是7个寄存器,一共可以控制一组GPIO的16个IO口。 硬件连接: 例如: 由上图1可知:要使用到LED0和LED1,他们的IO口分别为PB5和PE5 由上图2可知:要使用到LED0和LED1,他们的IO口分别为PA8和PD2 GPIO的输出模式为推挽输出。 代码: 使能IO口时钟:配置寄存器RCC APB2ENR. 初始化IO口模式:配置寄存器GPIOx CRH/CRL 操作IO口,输出高低电平:配置寄存器GPIOX_ODR或者BSRR/BRR. 这里采用上图1的的原理图: led.h: #ifndef __LED_H //避免重复引用 #d
[单片机]
<font color='red'>stm32</font>跑马灯——寄存器和位操作
聊聊一个STM32中断处理问题
先看一段代码: while(1) { if(EXTI_Sign==1) { HAL_Delay(Period); HAL_NVIC_EnableIRQ(EXTI2_3_IRQn); HAL_NVIC_EnableIRQ(EXTI2_3_IRQn); EXTI_Sign=0; 。。。。。。 } } 有人使用STM32G0系列的芯片开发产品,有段功能测试验证代码如上所示,相同的函数必须调用2次才能正常运行,调用2次倒也罢了,关键是必须!颇为纳闷。 这里开启了PA3的外部中断功能,上下沿均可触发。PA3接收外来报警信号,类似于烟感报警器。报警信号是一串脉冲信号,报警信号过来时存在多次
[单片机]
聊聊一个<font color='red'>STM32</font>中断处理问题
SPI接口说明及原理
1简介 SPI:Serial Peripheral Interface,是串行外设接口。 SPI是由摩托罗拉于 1985 年前后开发,是一种适用于短距离、设备到设备通信的同步串行接口。 从那时起,这种接口就已成为许多半导体制造商,特别是微控制器(MCU)和微处理器(MPU)采用的事实标准。 2SPI接口 SPI总线是一种4线总线,通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以。 MOSI:Master Output Slave Input,主设备数据输出,从设备数据输入; MISO:Master Input Slave Output,主设备数据输入,从设备数据输出; SCLK:Serial Clock,时
[单片机]
SPI接口说明及原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved