0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MCU微课堂 | CKS32F4xx系列产品GPIO口配置

jf_pJlTbmA9 来源:中科芯MCU 作者:中科芯MCU 2023-10-24 15:14 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

GPIO(General-purpose input/output)是通用输入输出端口的简称,CKS32F4xx系列产品通过GPIO引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。最基本的输出功能是由CKS32F4xx系列产品控制引脚输出高、低电平,实现开关控制,如把GPIO引脚接入到LED灯,那就可以控制LED灯的亮灭,引脚接入到继电器或三极管,那就可以通过继电器或三极管控制外部大功率电路的通断。最基本的输入功能是检测外部输入电平,如把 GPIO引脚连接到按键,通过电平高低区分按键是否被按下。

GPIO硬件结构框图

wKgaomUD0MWAKxSzAAPjeXqtPCA808.png

该图从最右端看起,最右端标注着“I/O”的就是代表CKS32F4xx系列产品引出的GPIO引脚,其余部件都位于芯片内部。引脚处的两个保护二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,由此可以防止不正常电压引入芯片导致芯片的烧毁。这里要特别注意VDD_FT 代表IO口兼容3.3V和5V,如果没有标注“FT”,就代表着不兼容5V。在芯片数据手册的引脚定义中,会看到有“电平I/O”一列,有FT标注的即为支持5V,如下图所示:

wKgZomUD0MaATQxCAAEMavrnD6M948.png

标号1处是上拉、下拉电阻,从它的结构我们可以看出,通过上、下拉对应的开关配置,我们可以控制引脚默认状态下的电压,开启上拉的时候引脚电压为高电平,开启下拉的时候引脚电压为低电平。同时也可以设置“既不上拉也不下拉模式”,我们也把这种状态称为浮空模式。

标号2处是一个由P-MOS和N-MOS管组成的单元电路。这个结构使GPIO具有了“推挽输出”和“开漏输出”两种模式。上方的P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关闭。

标号3处是输出数据寄存器,它为标号2处的双MOS管结构电路提供输入控制信号,因此通过修改输出数据寄存器的值就可以修改GPIO引脚的输出电平。而图中“置位/复位寄存器 GPIOx_BSRR”可以通过修改输出数据寄存器的值从而影响电路的输出。

标号4处是复用功能输出,“复用”是指CKS32F4xx系列产品的其它片上外设可以对GPIO引脚进行控制,此时GPIO引脚用作该外设功能的一部分,算是第二用途。例如我们使用USART串口通讯时,需要用到某个GPIO引脚作为通讯发送引脚,这个时候就可以把该GPIO引脚配置成USART串口复用功能,由串口外设控制该引脚,发送数据。

标号5处是输入数据寄存器,它连接到图中的TTL施密特触发器,触发器的基本原理是当输入电压高于正向阈值电压时,输出为高;当输入电压低于负向阈值电压时,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号,也就是高低电平,并且是TTL电平协议, 然后存储在“输入数据寄存器。因此,通过读取该寄存器就可以了解GPIO引脚的电平状态。

标号6处是复用功能输入,与“复用功能输出”模式类似,同样,如果我们使用USART串口通讯时,需要用到某个GPIO引脚作为通讯接收引脚,这个时候就可以把该GPIO引脚配置成USART串口复用功能,使USART可以通过该通讯引脚接收远端数据。

标号7处是模拟输入输出,当 GPIO引脚用于ADC采集电压的输入通道时,用作“模拟输入”功能,此时信号是不经过施密特触发器的,因为经过施密特触发器后信号只有0、1 两种状态,所以ADC外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。同样的,当 GPIO引脚用于DAC作为模拟电压输出通道时,此时作为“模拟输出”功能,DAC 的模拟信号输出就不经过双MOS管结构了,在GPIO结构框图的右下角处,模拟信号直接输出到引脚。

GPIO的工作模式

- 4种输入模式 -

1.浮空输入

浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定。如果在该引脚悬空的情况下,读取该端口的电平是不确定的。

2.上拉输入

在该模式下,如果IO口外部没有信号输入或者引脚悬空,IO口默认为高电平。如果I/O口输入低电平,那么引脚就为低电平,MCU读取到的就是低电平。

3.下拉输入

在该模式下如果IO口外部没有信号输入或者引脚悬空,IO口默认为低电平,如果I/O口输入高电平,那么引脚就为高电平,MCU读取到的就是高电平。

4.模拟功能

当GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的,这个时候即使配置了上拉或下拉模式,也不会影响到模拟信号的输入输出。除了ADC和DAC要将IO配置为模拟功能模式之外,其他外设功能一律要配置为复用功能模式。

- 4种输出模式 -

1.开漏输出(带上拉或者下拉)

在该模式下,若MCU控制输出为高电平1时,输出指令是不会起到作用的。此时I/O端口的电平就不会由输出的高电平决定,而是由I/O端口外部的上拉或者下拉决定,如果没有上拉或者下拉,IO口就处于高阻态。虽然通过软件设置内部上拉,也可以输出高电平,但是CKS32F4xx系列产品内部上拉是"弱上拉",即通过此上拉输出的电流是很弱的,驱动能力很弱。但是在该模式下,当MCU控制输出为低电平0时,即使没有上拉或者下拉,I/O端口也会输出低电平。另一方面,在开漏模式下,施密特触发器是打开的,即输入可用,可以通过输入数据寄存器GPIOx_IDR读取I/O的实际状态。开漏输出主要有以下两点作用:

a. I/O端口设置成开漏输出模式时,可以用来连接不同电平的器件,用来匹配电平,因为开漏引脚不连接外部的上拉电阻时,只能输出低电平,如果需要同时具备输出高电平的功能,则需要接上拉电阻。因此我们通过改变上拉电源的电压,便可以改变传输电平。比如通过加上上拉电阻就可以提供TTL电平-CMOS电平的输出。

b.当多个设置为开漏输出的引脚连接到一条总线上时。通过外加一个上拉电阻,在不增加任何器件的情况下,这些引脚形成了“与逻辑”关系,即“线与”。如果有一个引脚输出为逻辑0,相当于接地,那么与之并联的回路“相当于被一根导线短路”,所以总线上的逻辑电平便为0。只有都为高电平时,总线上的电平才为1。在IIC通信中,引脚通常设置为开漏输出模式。

2.复用开漏输出(带上拉或者下拉)

此时GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效;即输出的高低电平来源于其它外设,除了输出信号的来源改变之外,其他的与开漏输出功能相同。

3.推挽输出(带上拉或者下拉)

在该模式下,如果我们控制输出为0,低电平,则I/O端口的电平就是低电平。若控制输出为1,高电平,则I/O端口的电平就是高电平。此时,外部上拉和下拉的作用是控制在没有输出IO口的默认电平。在该模式下,施密特触发器也是打开的,即输入可用,通过输入数据寄存器GPIOx_IDR可读取I/O的实际状态。

4.复用推挽输出(带上拉或者下拉)

此时GPIO复用为其他外设,输出数据寄存器GPIOx_ODR无效;即输出的高低电平来源于其它外设,除了输出信号的来源改变之外,其他的与推挽输出功能相同。

- 4种输出速度 -

1. 2MHZ(低速)

2. 25MHZ(中速)

3. 50MHZ(快速)

4. 100MHZ(高速)

GPIO的引脚速度又称输出驱动电路的响应速度,即一个驱动电路可以不失真地通过信号的最大频率。比如信号频率为10MHz,而我们把GPIO速度配置成了2MHz,则10MHz的方波很可能就变成了正弦波,发生了失真。芯片内部在I/O口的输出部分安排了多个响应速度不同的输出驱动电路,我们可以根据自己的需要选择合适的驱动电路,通过选择速度来选择不同的输出驱动模块,达到最佳的噪声控制和降低功耗的目的。因为GPIO口的速度配置越高,噪声越大,功耗也越大。比如在USART串口通信中,若最大波特率只需115.2k,那用2M的速度就够了,既省电,噪声也小;而在SPI接口中,若使用18M或9M的波特率,则需要选用50M的GPIO的引脚速度。

注意:CKS32F407用于配置PA13输出速度的GPIOA_OSPEEDR寄存器的端口 13配置位(GPIOA_OSPEEDR_OSPEEDR13[1:0])初始值为00,即PA13的I/O输出速度默认为低速。因此客户在实际使用CKS32F407时,要按照参考手册中的介绍来配置GPIOA_OSPEED寄存器中 OSPEEDR13[1:0]位,从而来选择PA13的I/O输出指定的速度。

GPIO的配置

接下来我们讲解如何利用CKS32F4xx系列固件库对GPIO口的工作模式进行配置。首先,固件库中定义了一个如下的结构体:

typedefstruct
{
uint32_tGPIO_Pin;
GPIOMode_TypeDefGPIO_Mode;
GPIOSpeed_TypeDefGPIO_Speed;
GPIOOType_TypeDefGPIO_OType;
GPIOPuPd_TypeDefGPIO_PuPd;
}GPIO_InitTypeDef;

通过对该结构体成员中各个变量的初始化,就可以完成对2.2小节中所讲的GPIO口的工作模式配置。结构体中各个成员变量的介绍及初始化时可被赋的值如下:

1)GPIO_Pin:用来选择要控制的GPIO引脚,在标准库函数中可选择的值及其定义如下:

#defineGPIO_Pin_0((uint16_t)0x0001)
#defineGPIO_Pin_1((uint16_t)0x0002)
#defineGPIO_Pin_2((uint16_t)0x0004)
#defineGPIO_Pin_3((uint16_t)0x0008)
#defineGPIO_Pin_4((uint16_t)0x0010)
#defineGPIO_Pin_5((uint16_t)0x0020)
#defineGPIO_Pin_6((uint16_t)0x0040)
#defineGPIO_Pin_7((uint16_t)0x0080)
#defineGPIO_Pin_8((uint16_t)0x0100)
#defineGPIO_Pin_9((uint16_t)0x0200)
#defineGPIO_Pin_10((uint16_t)0x0400)
#defineGPIO_Pin_11((uint16_t)0x0800)
#defineGPIO_Pin_12((uint16_t)0x1000)
#defineGPIO_Pin_13((uint16_t)0x2000)
#defineGPIO_Pin_14((uint16_t)0x4000)
#defineGPIO_Pin_15((uint16_t)0x8000)
#defineGPIO_Pin_All((uint16_t)0xFFFF)

2) GPIO_Mode:用来设置已经选择的GPIO引脚的模式,在标准库函数中可选择的值及其定义如下:

typedefenum
{
GPIO_Mode_IN=0x00,/*!设置为输入模式*/
GPIO_Mode_OUT=0x01,/*!设置为输出模式*/
GPIO_Mode_AF=0x02,/*!设置为复用模式*/
GPIO_Mode_AN=0x03/*!设置为模拟模式*/
}GPIOMode_TypeDef;

3) GPIO_Speed:用来设置已经选择的GPIO引脚的速度,在标准库函数中可选择的值及其定义如下:

#defineGPIO_Speed_2MHzGPIO_Low_Speed
#defineGPIO_Speed_25MHzGPIO_Medium_Speed
#defineGPIO_Speed_50MHzGPIO_Fast_Speed
#defineGPIO_Speed_100MHzGPIO_High_Speed

4) GPIO_OType:用来设置已经选择的GPIO引脚的输出模式,只有输出模式才需要该配置,输入模式下不需要该配置。在标准库函数中可选择的值及其定义如下:

typedefenum
{
GPIO_OType_PP=0x00,/*!设置为推挽输出模式*/
GPIO_OType_OD=0x01/*!设置为开漏输出模式*/
}GPIOOType_TypeDef;

5) GPIO_PuPd:用来设置已经选择的GPIO引脚的上下拉,在标准库函数中可选择的值及其定义如下:

typedefenum
{
GPIO_PuPd_NOPULL=0x00,/*!设置为既不上拉也不下拉/浮空模式*/
GPIO_PuPd_UP=0x01,/*!设置为上拉模式*/
GPIO_PuPd_DOWN=0x02/*!设置为下拉模式*/
}GPIOPuPd_TypeDef;

根据上面所讲解的配置方法,我们讲解标准库下的3个实际配置实例。

1)作为普通的GPIO口输出,控制LED灯的亮灭,其GPIO口初始化函数如下:

voidLED_GPIO_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能GPIOF时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//LED1对应的IO口
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//输出模式
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
}

2) 复用为CAN外设的输出。

voidCAN1_GPIO_Init(void)
{
GPIO_InitTypeDef
GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能PORTA时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//复用功能
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉GPIO_Init(GPIOA, GPIO_InitStructure);//初始化PA11,PA12
GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);//GPIOA11复用为CAN1
GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);//GPIOA12复用为CAN1

3) 当ADC采集的输入通道,作为普通模拟输入。

voidADC_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);//使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//PA5通道5
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;//模拟输入
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//不带上下拉
GPIO_Init(GPIOA, GPIO_InitStructure);//初始化
}

来源:中科芯MCU

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    18603

    浏览量

    386527
  • GPIO
    +关注

    关注

    16

    文章

    1313

    浏览量

    55697
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    中科芯CKS32F107XX系列MCU的独立看门狗介绍

    中科芯CKS32F107xx系列产品内部提供两个看门狗定时器单元,独立型看门狗IWDG(Independent Watchdog)和窗口型看门狗WWDG(Window Watchdog),它们在
    的头像 发表于 11-28 14:51 3338次阅读
    中科芯<b class='flag-5'>CKS32F107XX</b><b class='flag-5'>系列</b><b class='flag-5'>MCU</b>的独立看门狗介绍

    中科芯CKS32F107XX系列MCU的窗口看门狗介绍

    中科芯CKS32F107xx系列产品内部提供两个看门狗定时器单元,独立型看门狗IWDG(Independent Watchdog)和窗口型看门狗WWDG(Window Watchdog),本文主要介绍WWDG的应用,关于IWDG的详情,请参看我们的IWDG
    的头像 发表于 11-28 14:48 3535次阅读
    中科芯<b class='flag-5'>CKS32F107XX</b><b class='flag-5'>系列</b><b class='flag-5'>MCU</b>的窗口看门狗介绍

    中科芯CKS32F030K6T6 MCU在颈部按摩仪中的应用方案

    CKS32F030K6T6采用高性能的ARM Cortex-M0 32位RISC内核,广泛集成增强型外设和I/O,支持SPI,I2C,USART,拥有一个12位ADC,4个通用定时器,1个高级定时器,并有一套为低功耗应用设计准
    的头像 发表于 11-13 07:24 5120次阅读
    中科芯<b class='flag-5'>CKS32F</b>030K6T6 <b class='flag-5'>MCU</b>在颈部按摩仪中的应用方案

    中科芯CKS32F030F4P6 MCU在电池包中的应用方案

    CKS电池包显示板基于32位低功耗MCUCKS32F030F4P6设计,内核ARM Cortex-M0+,工作于 48MHz 时钟频率, 高速的嵌入式闪存(FLASH 最高可达 32K 字节
    的头像 发表于 11-12 09:44 3233次阅读
    中科芯<b class='flag-5'>CKS32F030F4</b>P6 <b class='flag-5'>MCU</b>在电池包中的应用方案

    高性价比中科芯CKS32F030F6P6国产32位微处理器助力智能产品创新

    在嵌入式系统开发的广阔领域中,高性价比的中科芯CKS32F030F6P6国产32位微处理器正成为助力智能产品创新的理想之选。作为CKS32F030超值系列的典型代表,
    的头像 发表于 10-15 13:30 659次阅读
    高性价比中科芯<b class='flag-5'>CKS32F030F</b>6P6国产32位微处理器助力智能<b class='flag-5'>产品</b>创新

    中科芯CKS32系列芯片在便携式储能系统的技术解析

    便携式储能系统的控制单元决定能源管理效率、安全冗余与场景适配能力。中科芯CKS32F103RC、CKS32F103VE、CKS32F407VG三款MCU,基于ARMCortex架构差异
    的头像 发表于 09-13 11:01 1601次阅读

    爱芯AiP8F35XX系列触摸芯片开发指南

    爱芯为AiP8F35XX系列芯片提供一份产品开发指南,帮助用户快速掌握芯片性能,降低产品开发周期,提高开发效率。
    的头像 发表于 08-25 16:42 3407次阅读
    中<b class='flag-5'>微</b>爱芯AiP8<b class='flag-5'>F35XX</b><b class='flag-5'>系列</b>触摸芯片开发指南

    爱芯AiP8F32XX系列芯片开发指南

    爱芯为AiP8F32XX系列芯片提供一份产品开发指南,帮助用户快速掌握芯片性能,降低产品开发周期,提高开发效率。
    的头像 发表于 08-13 11:39 3556次阅读
    中<b class='flag-5'>微</b>爱芯AiP8<b class='flag-5'>F32XX</b><b class='flag-5'>系列</b>芯片开发指南

    GD32F4xx系列MCU基础工程资料

    GD32F4xx系列MCU基础工程创建.
    发表于 08-04 14:53 2次下载

    灵动微电子推出全新超值型MM32F0050系列MCU

    灵动微电子推出全新超值型MM32F0050系列MCU。2018年,灵动首次上市了其主打性价比的超值型MM32F00系列,目前已陆续推出了
    的头像 发表于 04-01 09:36 1354次阅读
    灵动微电子推出全新超值型MM32<b class='flag-5'>F</b>0050<b class='flag-5'>系列</b><b class='flag-5'>MCU</b>

    中科芯CKS32F030K6T6 高性能32位RISC内核MCU 程序兼容STM32F030K6T6

    CKS32F030xx 系列包括三种不同的封装,从 20 脚到 64 引脚不等的。根据选择的器件,包含不同组合的外设。下面的内容包含了这个产品系列所提供的全部外设的描述。 CKS32F0
    发表于 03-05 16:23

    纳芯NS800RT系列MCU:实时控制领域的全新标杆

    纳芯联合芯弦半导体推出了全新NS800RT系列实时控制MCU,为泛能源和汽车领域的高精度控制应用提供了强大支持。这一系列产品以高算力、高集成度和高安全性为核心,重新定义了实时
    的头像 发表于 03-04 16:34 1458次阅读
    纳芯<b class='flag-5'>微</b>NS800RT<b class='flag-5'>系列</b><b class='flag-5'>MCU</b>:实时控制领域的全新标杆

    利用CKS32F107xx系列RTC的闹钟实验

    本小节讲解的是如何在万年历实验的基础上,利用RTC的闹钟功能实现一个闹钟,在每天的[XX小时-XX分钟-XX秒]产生闹钟,然后通过闪烁LED模拟闹钟响效果。
    的头像 发表于 02-18 17:21 1123次阅读

    CKS32F107xx系列USART的LIN模式

    CKS32F107xx系列在支持正常USART功能的同时,亦支持LIN(局域互联网)模式。
    的头像 发表于 02-18 17:18 866次阅读
    <b class='flag-5'>CKS32F107xx</b><b class='flag-5'>系列</b>USART的LIN模式

    灵动微电子MM32F5370 MCU产品特色

    MM32F3、灵动·天枢 MM32F5、灵动·玉衡 MM32G5、灵动·天玑 MM32H5 等子系列,MM32F5270、MM32F526
    的头像 发表于 01-10 10:02 2125次阅读
    灵动微电子MM32<b class='flag-5'>F</b>5370 <b class='flag-5'>MCU</b><b class='flag-5'>产品</b>特色