STM32学习笔记 — 之GPIO端口篇

发布者:初入茅庐最新更新时间:2021-06-02 来源: eefocus关键字:STM32  GPIO端口 手机看文章 扫描二维码
随时随地手机看文章

最近刚开始学习STM32,所以从最基本的GPIO开始学起;首先看看STM32的datasheet上对GPIO口的简单介绍:


每个GPI/O 端口有两个32 位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32 位置位/复位寄存器(GPIOx_BSRR),一个16 位复位寄存器(GPIOx_BRR)和一个32 位锁定寄存器(GPIOx_LCKR)。


GPIO 端口的每个位可以由软件分别配置成多种模式。每个I/O 端口位可以自由编程,然而I/0 端口寄存器必须按32 位字被访问(不允许半字或字节访问)。GPIOx_BSRR 和GPIOx_BRR 寄存器允许对任何GPIO 寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ 时不会发生危险。


端口位配置 CNFx[1:0]=xxb,MODEx[1:0]=xxb


再看GPIO功能很强大:


1.通用I/O(GPIO):最最基本的功能,可以驱动LED、可以产生PWM、可以驱动蜂鸣器等等;


2.单独的位设置或位清除:方便软体作业,程序简单。端口配置好以后只需GPIO_SetBits(GPIOx, GPIO_Pin_x)就可以实现对GPIOx的pinx位为高电平


3.外部中断/唤醒线:端口必须配置成输入模式时,所有端口都有外部中断能力;


4.复用功能(AF):复用功能的端口兼有IO功能等。复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式:(CNFx[1:0]=01b,MODEx[1:0]=00b)。


5.软件重新映射I/O复用功能:为了使不同器件封装的外设I/O 功能的数量达到最优,可以把一些复用功能重新映射到其他一些脚上。这可以通过软件配置相应的寄存器来完成。这时,复用功能就不再映射到它们的原始引脚上了;


6.GPIO锁定机制:主要针对复位设定的,当某端口位lock后,复位后将不改变的此端口的位配置。




GPIO基本设置


GPIOMode_TypeDef GPIO mode定义及偏移地址


GPIO_Mode_AIN = 0x0, //模拟输入


GPIO_Mode_IN_FLOATING = 0x04, //悬空输入


GPIO_Mode_IPD = 0x28, //下拉输入


GPIO_Mode_IPU = 0x48, //上拉输入


GPIO_Mode_Out_OD = 0x14, //开漏输出


GPIO_Mode_Out_PP = 0x10, //推挽输出


GPIO_Mode_AF_OD = 0x1C, //开漏复用


GPIO_Mode_AF_PP = 0x18 //推挽复用


GPIO输入输出速度选择:


typedef enum


{


GPIO_Speed_10MHz = 1,


GPIO_Speed_2MHz,


GPIO_Speed_50MHz


}


GPIOSpeed_TypeDef;




#define IS_GPIO_SPEED(SPEED) ((SPEED == GPIO_Speed_10MHz) || (SPEED == GPIO_Speed_2MHz) || (SPEED == GPIO_Speed_50MHz))


做一个GPIO输出的试验


当I/O 端口被配置为推挽模式输出时:输出寄存器上的0 激活N-MOS,而输出寄存器上的1 将激活P-MOS。


用这段程序实现:GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


int main(void)


{


#ifdef DEBUG


debug();


#endif




/* 设置系统时钟 */


RCC_Configuration();




/* 嵌套中断设置*/


NVIC_Configuration();




/* 激活GPIOC clock */


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);




/* Configure PC.04, PC.05, PC.06 and PC.07 as Output push-pull */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;


GPIO_Init(GPIOC, &GPIO_InitStructure);




while (1)


{


/*本试验仅能实现LED1亮、熄功能*/


GPIO_SetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为高电平,点亮LED1


Delay();


GPIO_ResetBits(GPIOC, GPIO_Pin_4); //设置PC.04 pin为低电平,熄灭LED1


Delay();


}


}


做一个GPIO输入的试验:以EK-STM32F中LCDdemo做例子


这个试验中把GPIO的PD.04做为按键输入,当下降沿来临时触发。


LCDdemo中的例程如下:首先配置按键PD.03, PD.04为按键输入接口。


void Button_Config(void)


{


GPIO_InitTypeDef GPIO_InitStructure;




/* Enable GPIOD clock */


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);




/* Configure PD.03, PD.04 as output push-pull */


GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 ;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;


GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


GPIO_Init(GPIOD, &GPIO_InitStructure);


}


下面为按键作用是启动外部中断


GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3);


EXTI_InitStructure.EXTI_Line = EXTI_Line3; //设定外部中断3


EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //设定中断模式


EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //设定下降沿触发模式


EXTI_InitStructure.EXTI_LineCmd = ENABLE;


EXTI_Init(&EXTI_InitStructure);


关键字:STM32  GPIO端口 引用地址:STM32学习笔记 — 之GPIO端口篇

上一篇:实现STM32的串口数据发送和printf函数重定向
下一篇:stm单片机io管脚翻转实验

推荐阅读最新更新时间:2024-11-08 08:43

stm32 SWD模式 下载
我们比较常用的是Jlink下载器 ,这种下载器有一个缺点就是使用的Jtag 20PIN接口,太多的PIN会导致一些小型的PCB板很拥挤,也会增加布线的难度。 而使用SWD接口下载调试,只需要要使用4个PIN: GND, RST, SWDIO, SWDCLK ,而且下载速度可以达到10M/s,优势显而易见。 我们所使用的Jtag 20PIN引脚图: 相关原理图: SWD 仿真模式概念简述 一、SWD 和传统的调试方式区别 SWD 模式比 JTAG 在高速模式下面更加可靠。 在大数据量的情况下面 JTAG 下载程序会失败, 但是 SWD 发生的几率会小很多。基本使用 JTAG 仿真模式的
[单片机]
<font color='red'>stm32</font> SWD模式 下载
GP2Y10驱动含PM2.5和AQI(STM32
一、前期准备 单片机:STM32F103ZET6 开发环境:MDK5.14 库函数:标准库V3.5 GP2Y10模块:淘宝有售 二、实验效果 三、驱动原理 主要就是采集AD电压,对应转换公式做相关的转换。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 gp2y10.h #ifndef __GP2Y10_H__ #define __GP2Y10_H__ #include stm32f10x.h #include gpio.h #include delay.h #include uart.h #define GP2Y10_CONTROL PAout(0) #defin
[单片机]
GP2Y10驱动含PM2.5和AQI(<font color='red'>STM32</font>)
C语言 STM32 求绝对值函数
  函数名: abs   功 能: 求整数的绝对值   头文件:math.h   函数原型:int abs(int i);   程序例:   #include stdio.h   #include math.h   int main(void)   {   int number = -1234;   printf( number: %d absolute value: %d\n , number, abs(number));   return 0;   }   在C语言中还有fabs,也是求绝对值的,不同的是,fabs函数参数与返回值为实型。 ////////////////////////////////
[单片机]
stm32 常量 指定位置_STM32寄存器讲解
原理讲解芯片讲解STM32F103芯片 我们看到的 STM32 芯片是已经封装好的成品,主要由内核和片上外设组成。若与电脑类比,内核与外设就如同电脑上的 CPU与主板、内存、显卡、硬盘的关系。 STM32F103采用的是 Cortex-M3内核,内核即 CPU,由 ARM公司设计。ARM公司并不生产芯片,而是出售其芯片技术授权。芯片生产厂商(SOC)如 ST、TI、Freescale,负责在内核之外设计部件并生产整个芯片,这些内核之外的部件被称为核外外设或片上外设。如 GPIO、USART(串口)、I2C、SPI等都叫做片上外设。(采用野火官方的介绍)。 芯片(这里指内核,或者叫 CPU)和外设之间通过各种总线连接,其中驱动
[单片机]
<font color='red'>stm32</font> 常量 指定位置_<font color='red'>STM32</font>寄存器讲解
STM32 USART串口的学习与体会
1. 串口的基本概念 看了很多STM32的USART的编码,但我觉得虽然都说出了中点但,写的都不是很好!作为一个刚刚学stm的菜鸟,看了很多资料,写出了我认为比较满意的串口通讯的知识 当然借鉴了很多前人的心血和stm官方的库函数模板,这也是本人第一次在csdn少上写博客! 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器
[单片机]
基于STM32的Uart2串口问题
买了一块1元的活动板子,移植了RTT(RT-THREAD)的国人嵌入式操作系统。系统能够正常跑起来,接着就按照RTT的官网教程,写了一个串口驱动。 原来定义的是UART1的端口,但是没有找到板子的USART1的引脚,虽然STM32可以映射,但是仍然没有看到有甩出来的引脚。初略看了一下官网的使用手册,发现图上有USART2引出来。 上图看一下, 好家伙,那就直接接地,接TX与RX到PC端的USB转串口吧。 杯具来了,发现无论如何自己的程序都没有输出打印,怀疑自己的代码有问题。用mbed的示例BIN文件试试,也发现不行。难道是电平问题?换了别人使用的开发板与PC的USB转串口,oh mygod!!还是不行。 心灰意冷,
[单片机]
基于<font color='red'>STM32</font>的Uart2串口问题
stm32专题三十三:RTC实时时钟
RTC功能描述 实时时钟是一个独立的定时器。RTC模块拥有一组连续计数的计数器,在相应软件配置下,可提供时钟日历的功能。修改计数器的值可以重新设置系统当前的时间和日期。 RTC模块和时钟配置系统(RCC_BDCR寄存器)处于后备区域,即在系统复位或从待机模式唤醒后,RTC的设置和时间维持不变。 系统复位后,对后备寄存器和RTC的访问被禁止,这是为了防止对后备区域(BKP)的意外写操作。执行以下操作将使能对后备寄存器和RTC的访问: 设置寄存器RCC_APB1ENR的PWREN和BKPEN位,使能电源和后备接口时钟; 设置寄存器PWR_CR的DBP位,使能对后备寄存器和RTC的访问; 为什么时间不能超过1秒?
[单片机]
<font color='red'>stm32</font>专题三十三:RTC实时时钟
STM32启动解析,启动代码,__main main
启动代码看这里: http://blog.csdn.net/chehlcy/article/details/5164472 在启动文件我们看到了__main和用户写的main,这2个是有区别的,大概流程如下: 1、复位第一条指令:Reset_Handler PROC,这里指定为 LDR R0, =__main。表示调用库函数__main,当然,我们可以在__main前做点事情,比如PLL初始化等。 2、__main()的执行流程参考: 跟一下汇编,大概是__scatterload()- __rt_entry()- __user_setup_stackheap() 3、最后调用用户的main()函数。 4、可以不使用C
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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