华大单片机GPIO配置

关注、星标、置顶公众号



端口结构介绍

无论使用MCU实现什么功能,只要是有意义的功能必然会涉及到IO口的操作。IO口的操作也是MCU的入门操作,按国际惯例一般上手MCU的第一个程序点灯程序就是通过IO口的输出来实现的。

华大M0+系列单片机的端口电路有两种结构,这两种电路结构大体相同,只是存在三个微小的差别。HC32F(L)x3x、HC32F(L)x7x和HC32F(L)x9x系列芯片的端口电路是一种结构,为了便于说明我们称这种结构为结构一,框图如下:
在这里插入图片描述
HC32F003、HC32F005和HC32L110芯片是一种结构,我们称这种结构为结构二,框图如下:
在这里插入图片描述
由上面两个构图我们可以很清楚地知道两种结构的区别如下:
1.结构一的PxOUT(寄存器中出现的x=A,B,C,D,E,F代表芯片含有的端口组,后面的亦是同样的意思)可以通过操作位寄存器(PxBSET、PxBCLR、PxBSETCLR)来直接控制某一位的输出,而不会影响这组寄存器中的其余的位,结构二没有相关的位操作。
2.结构一输出/输入数据寄存器(PxOUT/PxIN)支持AHB/FAST IO总线访问(通过寄存器 GPIO_CTRL2.ahb_sel 位控制),其他寄存器支持AHB总线访问。结构二端口输入值/输出值寄存器(PxIN/PxOUT)只支持 AHB 总线读写。对于这两种不同的总线,系统时钟(HCLK)对这两种总线的处理周期并不相同。下面两幅图为对于两种总线端口翻转的最快时序:
在这里插入图片描述
对于 AHB 总线,每两个 HCLK 周期,IO 翻转一次,而对于 FAST IO 总线,每个 HCLK周期,IO 翻转一次。
3.结构二对应芯片的RST引脚可以复用成带有内部上拉电阻的数字输入引脚,结构一对应的芯片RST引脚不可以复用为IO引脚。

重点来了,说完两种结构的差别后进入正题,说下两种结构和共性
每个端口都可以配置成数字或模拟端口,并且可以实现内部上拉(pull up)/下拉(pull down)的输入,高阻输入(floating input),推挽输出(CMOS output),开漏输出(open drain output),两档驱动能力输出。

数字端口被配置成模拟端口后,数字功能被隔离,不能输出数字“1”和“0”,CPU 读取端口输入值寄存器的结果为“0”。
每个数字端口被配置为输入时,都可以提供外部中断,中断类型可以配置成高电平触发、低电平触发、上升沿触发、下降沿触发 4 种,查询 Px_STAT[n]的中断标志位即可知道相应的中断触发端口。另外,每个数字端口的中断都可以把芯片从睡眠模式/深度睡眠模式唤醒到工作模式。
芯片复位后端口为高阻输入(floating input),目的是防止芯片被异常复位时,对外部器件产生异常动作。
当端口配置为数字端口的时候可以通过设置Px_SEL寄存器接受各功能模块(如 SPI,UART,I2C,Timer 等)的输入输出信号,此内容放到相应外设模块内容来讲解。

端口相关配置介绍

端口相关配置如下:
数字端口(PxADS对应位为0);
模拟端口(PxADS对应位为1);
端口引脚为输入(PxDIR对应位为1);
端口引脚为输出(PxDIR对应位为0);
输入电平状态(PxIN 对应引脚获得高电平对应位为1,获得低电平对应位为0);
输出电平选择(PxOUT 对应位为1相应引脚输出高电平,为0相应引脚输出低电平);
内部上拉(PxPU对应位为1);
内部下拉(PxPD对应位为1);
高阻(PxPU对应位为0且PxPD对应位为0);
推挽输出(PxOD对应位为0);
开漏输出(PxOD对应位为1);
低驱动能力输出(PxDR对应位为1);
高驱动能力输出(PxDR对应位为0);
端口高电平中断使能(PxHIE对应位为1);
端口低电平中断使能(PxLIE对应位为1);
端口上升沿中断使能(PxRIE对应位为1);
端口下降沿中断使能(PxFIE对应位为1);

对于结构一的芯片特有寄存器
端口置位(PxBSET对应位为1置位,为0保持);
端口清零(PxBCLR对应位为1清零,为0保持);
端口置位清零(PxBSETCLR (PxBSET对应位为1置位,为0保持;PxBCLR对应位为1清零,为0保持))。PxBSET 和 PxBCLR 相同位同时置 1 时,PxBCLR 具有高优先级。即该端口被清零。

端口配置操作流程

端口复用配置为模拟端口操作流程

a)设置寄存器 PxADS[n]为 1

端口复用配置为数字通用端口操作流程

a) 设置寄存器 PxADS[n]为 0
b) 设置寄存器 Px_SEL 为 0
c) 设置寄存器 PxDIR[n]为 1:端口方向为输入,CPU 可以读取端口的状态 PxIN[n]。
d) 设置寄存器 PxDIR[n]为 0:端口方向为输出
e) 设置寄存器 PxOUT[n]为 1:端口输出高电平
f) 设置寄存器 PxOUT[n]为 0:端口输出低电平

端口上拉使能配置操作流程

a)设置寄存器 PxPU[n]为 1

端口下拉使能配置操作流程

a) 设置寄存器 PxPU[n]为 0
b) 设置寄存器 PxPD[n]为 1
注:当 PxPU[n],PxPD[n]同时置 1 时,PxPU[n]优先级高,PxPD[n]无效。

端口增强驱动配置操作流程

a)设置寄存器 PxDR[n]为 0

端口开漏输出配置操作流程

a)设置寄存器 PxOD[n]为 1

配置代码

无上下拉输入配置

    stc_gpio_cfg_t stcGpioCfg;
   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);   //打开GPIO外设时钟

    stcGpioCfg.enDir = GpioDirIn;                            //端口方向配置->输入
    stcGpioCfg.enDrv = GpioDrvL;	                         //驱动能力配置->高驱动能力
    stcGpioCfg.enPu = GpioPuDisable;                         //端口上下拉配置->无
    stcGpioCfg.enPd = GpioPdDisable;
    stcGpioCfg.enOD = GpioOdDisable;                         //开漏输出配置->开漏输出关闭
    stcGpioCfg.enCtrlMode = GpioAHB;                         //总线控制模式配置->AHB
    Gpio_Init(STK_USER_PORT, STK_USER_PIN, &stcGpioCfg);     // GPIO IO USER KEY初始化

推挽输出配置

    stc_gpio_cfg_t stcGpioCfg;
   
    Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);  //打开GPIO外设时钟

    stcGpioCfg.enDir = GpioDirOut;                          //端口方向配置->输出
    stcGpioCfg.enDrv = GpioDrvL;	                        //驱动能力配置->高驱动能力
    stcGpioCfg.enPu = GpioPuDisable;                        //端口上下拉配置->无
    stcGpioCfg.enPd = GpioPdDisable;
    stcGpioCfg.enOD = GpioOdDisable;                        //开漏输出配置->开漏输出关闭
    stcGpioCfg.enCtrlMode = GpioAHB;                        //总线控制模式配置->AHB
    Gpio_Init(STK_LED_PORT, STK_LED_PIN, &stcGpioCfg);      // GPIO IO LED端口初始化
    Gpio_ClrIO(STK_LED_PORT, STK_LED_PIN);                  // LED关闭

常用的端口操作库函数

单端口操作

单个IO口输出低电平

原型  en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
举例  Gpio_ClrIO(GpioPortA ,GpioPin1 );                                    //PA01端口输出低电平

单个IO口输出高电平

原型  en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
举例  Gpio_SetIO(GpioPortA ,GpioPin1 );                                   //PA01端口输出高电平

获得IO口输入值

原型  boolean_t Gpio_GetInputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
举例  u8PA1Stat = Gpio_GetInputIO(GpioPortA ,GpioPin1);                  //u8PA1Stat 为PA1端口输入电平状态

获得IO口输出值

原型  boolean_t   Gpio_ReadOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
举例  u8PA1Stat = Gpio_ReadOutputIO(GpioPortA ,GpioPin1);                //u8PA1Stat 为PA1端口输出电平状态

多端口操作

同时让一组端口中的多个引脚输出低电平

原型  en_result_t Gpio_ClrPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
举例  Gpio_ClrPort(GpioPortA , 0x000F);                              //PA0~PA3输出低电平,其余保持

同时让一组端口中的多个引脚输出高电平

原型  en_result_t Gpio_SetPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
举例  Gpio_SetPort(GpioPortA , 0x000F);                             //PA0~PA3输出高电平,其余保持

获取一组IO口的输入数据

原型  uint16_t  Gpio_GetInputData(en_gpio_port_t enPort)
举例  u16PAInputData = Gpio_GetInputData(GpioPortA );               //u16PAInputData的值为PA组输入数据

同时让一组端口输出多个高低电平

原型  en_result_t Gpio_SetClrPort(en_gpio_port_t enPort, uint32_t u32ValMsk)
举例  Gpio_SetClrPort(GpioPortA , 0x00f0000f);                     //PA4 ~ PA7输出高电平PA0 ~ PA3输出低电平

关注微信公众号『芯缘意码』,查看更多内容,回复“加群”加入技术交流群。
淘宝 店铺 搜索 『芯缘意码』,购买开发学习板仿真器。
公众号:芯缘意码https://shop219666036.taobao.com

### 回答1: STC8单片机GPIO库函数是一套用于控制GPIO(通用输入输出)引脚的函数集合。GPIO引脚可以进行输入和输出操作,并且可以通过使用GPIO库函数来配置引脚的工作模式和状态。 STC8单片机GPIO库函数包括了以下几个主要函数: 1. GPIO_ModeConfig:用于配置引脚的工作模式,包括输入模式和输出模式。通过指定引脚号和工作模式参数,可以将引脚配置为普通或者开漏输出,以及浮空输入或带上下拉电阻的输入。 2. GPIO_SetBit:用于将某个引脚置高,即输出高电平。通过指定引脚号,可以使特定的引脚输出高电平。 3. GPIO_ClearBit:用于将某个引脚置低,即输出低电平。通过指定引脚号,可以使特定的引脚输出低电平。 4. GPIO_GetBit:用于获取某个引脚的当前电平状态。通过指定引脚号,可以获取该引脚的输入电平。 5. GPIO_InvertBit:用于反转某个引脚的电平状态。通过指定引脚号,可以将特定引脚的输出状态反转。 6. GPIO_ConfigIntBit:用于配置某个引脚的中断功能。通过指定引脚号和中断类型参数,可以在特定的引脚上使能上升沿、下降沿、或者双边沿触发中断。 使用STC8单片机GPIO库函数,可以方便地控制引脚的工作模式、输出状态和输入电平。通过这些函数,我们可以实现对外设的控制和与外部设备的交互。 ### 回答2: STC8单片机GPIO库函数包括了一系列用于控制GPIO(General Purpose Input/Output)口的函数。GPIO口是单片机的通用输入输出口,可以通过控制GPIO口的电平状态实现与外部设备的数据交互。 STC8单片机GPIO库函数常用的有以下几个函数: 1. `void GPIO_Init(PUINT8 port, UINT8 pin, UINT8 mode)`:初始化GPIO口。通过该函数可以设置指定的GPIO口为输入或输出模式,其中port为具体的GPIO口所属的端口,pin为具体的GPIO口号,mode为GPIO口的模式。 2. `void GPIO_SetPin(PUINT8 port, UINT8 pin, UINT8 level)`:设置指定的GPIO口电平状态。通过该函数可以将指定的GPIO设置为高电平或低电平,其中level参数为0表示低电平,非0表示高电平。 3. `void GPIO_TogglePin(PUINT8 port, UINT8 pin)`:翻转指定的GPIO口电平状态。通过该函数可以将指定的GPIO口电平状态翻转,即由高电平变为低电平,或由低电平变为高电平。 4. `UINT8 GPIO_ReadPin(PUINT8 port, UINT8 pin)`:读取指定的GPIO口电平状态。通过该函数可以读取指定的GPIO口的电平状态,返回值为0表示低电平,非0表示高电平。 通过使用以上几个GPIO库函数,可以对STC8单片机GPIO口进行初始化设置、电平状态设置、电平状态翻转以及读取电平状态等操作,实现对外设的控制和数据交互。同时,通过合理利用GPIO库函数,可以提高单片机的工作效率和性能。 ### 回答3: STC8单片机GPIO库函数是一组用于控制STC8系列单片机的通用输入输出口的库函数。这些函数可以方便地实现对引脚配置和操作,帮助开发者快速实现各种功能的电路设计。 具体来说,STC8单片机GPIO库函数包括以下几个主要函数: 1. `GPIO_ConfigPort` 函数:用于配置GPIO口的模式和驱动能力,可以设置引脚为输入、输出模式,并调整驱动能力。 2. `GPIO_ReadInputData` 函数:用于读取输入引脚的电平值,可以获取引脚当前的逻辑电平,方便开发者实现输入信号的处理。 3. `GPIO_Write` 函数:用于向输出引脚写入电平值,可以设置引脚的输出电平,帮助开发者实现对外部设备的控制。 4. `GPIO_SetBits` 函数:用于将指定引脚的电平设置为高电平,可以快速将输出引脚置为高电平,实现特定的控制逻辑。 5. `GPIO_ResetBits` 函数:用于将指定引脚的电平设置为低电平,可以快速将输出引脚置为低电平,实现特定的控制逻辑。 通过使用这些GPIO库函数,开发者可以轻松地配置和操作STC8单片机GPIO口,实现不同的功能需求。同时,这些库函数还提供了一些方便的高级功能,如中断控制和引脚状态的快速读写操作,更加便于开发者进行项目开发和调试。总之,STC8单片机GPIO库函数为开发者提供了一种便捷高效的方式来控制和操作单片机GPIO口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值