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

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

3天内不再提示

CW32通用输入输出端口详解

jf_pJlTbmA9 来源:武汉芯源半导体 作者:武汉芯源半导体 2023-10-30 17:33 次阅读

GPIO的意思是通用输入输出端口,可通过软件配置成输入或者输出端。即可以通过GPIO口输出高低电平或者通过GPIO口读入引脚状态是高电平还是低电平。大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚。如UART外设与其他硬件进行数据交互。

CW32L083的每组GPIO都有20个寄存器,除了基础的配置寄存器、数据寄存器、位置位/清零寄存器、位清零寄存器、锁定寄存器、复用功能寄存器外,还配置了位翻转寄存器,中断数字滤波寄存器等,让操作更加快捷。同时提供完善的固件库函数,方便工程师快速开发测试,增强可移植性。

GPIO端口可配置成8种工作模式

4种输入模式

1.浮空输入

2.输入上拉

3.输入下拉

4.模拟输入

4种输出模式

1.开漏输出

2.推挽式输出

3.开漏复用功能

4.推挽式复用功能

GPIO功能框图

1668416298355446.png

初始化GPIO可使用void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)函数,此函数在cw32l083_gpio.c中有详细的配置,其中的第一个参数GPIO_TypeDef是一个结构体类型,在cw32l083.h中有详细定义,包含着每组GPIO的20个寄存器。

typedefstruct{写法DIR_f;//输入输出方向寄存器OPENDRAIN_f;//输出模式寄存器PDR_f;//下拉电阻寄存器PUR_f;//上拉电阻寄存器AFRH_f;//复用功能寄存器高段AFRL_f;//复用功能寄存器低段ANALOG_f;//模拟数字配置寄存器RISEIE_f;//上升沿中断使能寄存器FALLIE_f;//下降沿中断使能寄存器HIGHIE_f;//高电平中断使能寄存器LOWIE_f;//低电平中断使能寄存器ISR_f;//中断标志寄存器ICR_f;//中断标志清除寄存器LCKR_f;//配置锁定寄存器FILTER_f;//中断数字滤波器配置寄存器IDR_f;//输入数据寄存器ODR_f;//输出数据寄存器BRR_f;//位清零寄存器BSRR_f;//位置位清零寄存器TOG_f;//位翻转寄存器}GPIO_TypeDef;

第二个参数GPIO_InitTypeDef也是一个结构体,在cw32l083_gpio.h中可查看其定义。

typedefstruct{uint32_tPins;uint32_tMode;uint32_tIT;}GPIO_InitTypeDef;

下面举一个简单的例子配置一个IO口翻转,可实现闪灯实验。


int32_t main(void)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

RCC_HSI_Enable(RCC_HSIOSC_DIV6);

__RCC_GPIOC_CLK_ENABLE(); //打开GPIOC的时钟

GPIO_InitStruct.IT = GPIO_IT_NONE;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pins = GPIO_PIN_2|GPIO_PIN_3;

GPIO_Init(CW_GPIOC, GPIO_InitStruct);

while (1)

{

GPIO_TogglePin(CW_GPIOC,GPIO_PIN_2|GPIO_PIN_3);

Delay(0xFFFF); //延迟函数

}

}

void Delay(__IO uint16_t nCount)

{

/* Decrement nCount value */

while (nCount != 0)

{

nCount--;

}

}

例程中使用PC02和PC03引脚进行IO口翻转实验,官方CW32L083VCT6的评估板上这两个引脚外接LED灯,可以看到LED周期闪烁的效果。

其中CW_GPIOC,GPIO_PIN_0以及GPIO_MODE_OUTPUT_PP都是定义在头文件中的宏定义,如下面第一行为CW_GPIOC端口地址映射。


#define CW_GPIOC ((GPIO_TypeDef*) GPIOC_BASE)

#define GPIOC_BASE 0x48000800UL

#define GPIO_PIN_0 ((uint16_t)0x0001) /* Pin 0 selected */

#define GPIO_PIN_1 ((uint16_t)0x0002) /* Pin 1 selected */

#define GPIO_PIN_2 ((uint16_t)0x0004) /* Pin 2 selected */

#define GPIO_PIN_3 ((uint16_t)0x0008) /* Pin 3 selected */

#define GPIO_PIN_4 ((uint16_t)0x0010) /* Pin 4 selected */

#define GPIO_PIN_5 ((uint16_t)0x0020) /* Pin 5 selected */

#define GPIO_PIN_6 ((uint16_t)0x0040) /* Pin 6 selected */

#define GPIO_PIN_7 ((uint16_t)0x0080) /* Pin 7 selected */

#define GPIO_PIN_8 ((uint16_t)0x0100) /* Pin 8 selected */

#define GPIO_PIN_9 ((uint16_t)0x0200) /* Pin 9 selected */

#define GPIO_PIN_10 ((uint16_t)0x0400) /* Pin 10 selected */

#define GPIO_PIN_11 ((uint16_t)0x0800) /* Pin 11 selected */

#define GPIO_PIN_12 ((uint16_t)0x1000) /* Pin 12 selected */

#define GPIO_PIN_13 ((uint16_t)0x2000) /* Pin 13 selected */

#define GPIO_PIN_14 ((uint16_t)0x4000) /* Pin 14 selected */

#define GPIO_PIN_15 ((uint16_t)0x8000) /* Pin 15 selected */

#define GPIO_PIN_All ((uint16_t)0xFFFF) /* All pins selected */

#define GPIO_MODE_ANALOG (0X00)

#define GPIO_MODE_INPUT (0x10)

#define GPIO_MODE_INPUT_PULLUP (0x11)

#define GPIO_MODE_INPUT_PULLDOWN (0x12)

#define GPIO_MODE_OUTPUT_PP (0x20)

#define GPIO_MODE_OUTPUT_OD (0x21)

上面的例子是使用库函数配置的,也可以用寄存器操作,具体步骤如下。


//开启HSI并6分频,Sysclk=HCLK=PCLK=8MHz

CW_SYSCTRL->HSI=(5<

CW_SYSCTRL->CR1|=SYSCTRL_BYPASS|SYSCTRL_CR1_HSIEN_Msk; //Enable HSI

while ((CW_SYSCTRL->HSI SYSCTRL_HSI_STABLE_Msk) != SYSCTRL_HSI_STABLE_Msk) //Wait stable

{

;

}

//开启GPIOC的时钟

REGBITS_SET(CW_SYSCTRL->AHBEN, RCC_AHB_PERIPH_GPIOC);

//配置PC02和PC03为数字功能推挽输出

CW_GPIOC->ANALOG_f.PIN2 = 0; //将PC02设置为数字功能

CW_GPIOC->DIR_f.PIN2 = 0; //将PC02设置成输出模式

CW_GPIOC->OPENDRAIN_f.PIN2 = 0; //将PC02设置成推挽模式

CW_GPIOC->ANALOG_f.PIN3 = 0; //将PC03设置为数字功能

CW_GPIOC->DIR_f.PIN3 = 0; //将PC03设置为输出模式

CW_GPIOC->OPENDRAIN_f.PIN3 = 0; //将PC03设置为推挽模式

while (1)

{

CW_GPIOC->TOG=bv2; //PC02翻转

Delay(0xFFFF);

CW_GPIOC->TOG=bv3; //PC03翻转

Delay(0xFFFF);

}

下面以CW32L083为例通过配置GPIO引脚来驱动SPI2外设,查阅CW32L083的用户手册可以得知, SPI2可以通过PA00,PA01,PA02,PA03复用实现,这个就是上文提到的GPIO口的复用功能。


PA00_AFx_SPI2MISO() //将PA00复用成SPI2的MISO线

PA01_AFx_SPI2MOSI() //将PA01复用成SPI2的MOSI线

PA02_AFx_SPI2SCK() //将PA02复用成SPI2的时钟线

PA03_AFx_SPI2CS() //将PA03复用成SPI2的片选线,如需操作片选线,有特定函数

GPIO_InitTypeDef GPIO_InitStructure = {0};

GPIO_InitStructure.Pins =GPIO_PIN_1|GPIO_PIN_2 |GPIO_PIN_3;

GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStructure.IT= GPIO_IT_NONE;

GPIO_Init(CW_GPIOA, GPIO_InitStructure);

GPIO_InitStructure.Pins =GPIO_PIN_0;

GPIO_InitStructure.Mode = GPIO_MODE_INPUT;

GPIO_Init(CW_GPIOA, GPIO_InitStructure);

另外我们的GPIO支持外部中断,具体的配置如下,如果有不清楚的小伙伴可以查看下节CW32中断控制器,会有详细讲解。


GPIO_InitTypeDef GPIO_InitStruct = {0};

__RCC_GPIOA_CLK_ENABLE();//开启GPIOA的时钟

GPIO_InitStruct.IT = GPIO_IT_RISING | GPIO_IT_FALLING; //上升沿或者下降沿触发

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pins =GPIO_PIN_1;

GPIO_Init(CW_GPIOA, GPIO_InitStruct);

//清除PA01中断标志并使能NVIC

GPIOA_INTFLAG_CLR(bv1);

NVIC_EnableIRQ(GPIOA_IRQn);

上面的例程即可实现外部输入中断,PA01在接收到上升沿或者下降沿的信号的时候会进入到中断函数中去执行相关的程序,具体的例程可以参考官方CW32L083的gpio_int_filter例子。

下面介绍的是CW32L083的GPIO所相关的函数及其功能。


1.void GPIO_SWD2GPIO(void);

将PA13/PA14 SWD设置成GPIO

2.void GPIO_GPIO2SWD(void);

将PA13/PA14设置成SWD

3.void GPIO_LockPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins);

锁定指定引脚配置项,可同时设置多个引脚

4.void GPIO_DeInit(GPIO_TypeDef *GPIOx, uint32_t GPIO_Pins);

GPIO去初始化,可同时设置多个引脚或单个引脚

5.void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

GPIO 初始化,可同时设置多个引脚或单个引脚

6.void GPIO_ConfigFilter(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, uint32_t FltClk);

配置端口滤波

7.void GPIO_WritePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins, GPIO_PinState PinState);

设置指定引脚电平,可同时设置多个引脚

8.void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t Value);

设置指定引脚端口的输出值

9.void GPIO_TogglePin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pins);

翻转指定引脚电平,可同时设置多个引脚

10.GPIO_PinState GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

获取一个引脚的电平

以上是CW32通用输入输出端口的介绍。

来源:武汉芯源半导体

审核编辑:汤梓红

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

    关注

    30

    文章

    5030

    浏览量

    117734
  • 端口
    +关注

    关注

    4

    文章

    820

    浏览量

    31588
  • GPIO
    +关注

    关注

    16

    文章

    1135

    浏览量

    50578
收藏 人收藏

    评论

    相关推荐

    CW32移植Free-RTOS】CW32开发者扶持计划

    CW32配置Free-RTOS全过程,CW32开发者扶持计划
    的头像 发表于 04-18 09:38 5563次阅读
    【<b class='flag-5'>CW32</b>移植Free-RTOS】<b class='flag-5'>CW32</b>开发者扶持计划

    CW32开发者扶持计划#CW32 #芯片

    CW32
    CW32生态社区
    发布于 :2023年05月24日 16:56:14

    通用输入输出端口GPIO配置说明

    【STM32F0系列学习】之—通用输入输出端口GPIO1、GPIO端口配置说明1、GPIO端口配置说明
    发表于 01-24 07:42

    CW32 通用输入输出端口

    10.GPIO_PinState GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);获取一个引脚的电平以上是CW32通用输入输出端口
    发表于 11-02 11:12

    STM32F2技术培训_通用输入输出端口_GPIO

    STM32F2技术培训_通用输入输出端口_GPIO
    发表于 12-03 17:34 0次下载

    F2产品技术培训_8.通用输入输出端口(GPIO)

    F2产品技术培训_8.通用输入输出端口(GPIO)
    发表于 03-15 14:43 11次下载

    笔记本输入输出端口介绍PPT资料下载

    笔记本输入输出端口介绍PPT资料下载
    发表于 04-08 11:09 1次下载

    MCU通用输入输出端口(GPIO)输出模式

    对于常规MCU,通用输入输出(GPIO)是其最基本、最常用的功能,用于实现最基本的数字量输入输出。 信号一般为:以3.3VDC为高电平的LTTL电平以5.0VDC为高电平的TTL电
    发表于 10-28 19:06 16次下载
    MCU<b class='flag-5'>通用</b><b class='flag-5'>输入输出</b><b class='flag-5'>端口</b>(GPIO)<b class='flag-5'>输出</b>模式

    GPIO通用输入输出

    GPIO通用输入输出一、GPIO的功能概述用途:GPIO是通用输入输出(General Purpose I/O)的简称,主要用于工业现场需要用到数字量
    发表于 12-20 18:58 6次下载
    GPIO<b class='flag-5'>通用</b><b class='flag-5'>输入输出</b>

    cw32和stm32的区别

    cw32和stm32的区别 CW32和STM32是两种常见的单片机,被广泛应用于各种电子设备中。在本文中,我们将深入探讨CW32和STM32之间的区别和优劣势。 1. 硬件性能 硬件性能是衡量单片机
    的头像 发表于 08-16 11:15 2254次阅读

    基于CW32的无刷水泵方案

    基于CW32的无刷水泵方案
    的头像 发表于 11-03 17:28 446次阅读
    基于<b class='flag-5'>CW32</b>的无刷水泵方案

    CW32 PWM输出功能介绍

    CW32 PWM输出功能介绍
    的头像 发表于 09-27 16:12 412次阅读
    <b class='flag-5'>CW32</b> PWM<b class='flag-5'>输出</b>功能介绍

    CW32定时器操作讲解——输入捕获

    CW32定时器操作讲解——输入捕获
    的头像 发表于 09-27 16:06 511次阅读
    <b class='flag-5'>CW32</b>定时器操作讲解——<b class='flag-5'>输入</b>捕获

    2023电赛A题国奖CW32 开源分享

    电赛A题开源分享,主控为CW32
    的头像 发表于 11-02 10:16 783次阅读
    2023电赛A题国奖<b class='flag-5'>CW32</b> 开源分享

    基于CW32的物联网应用

    CW32】基于CW32的物联网应用
    的头像 发表于 11-02 15:55 335次阅读
    基于<b class='flag-5'>CW32</b>的物联网应用