【CS32L015C8T6】GPIO驱动配置方法(内附完整代码及注释)
·
目录
四、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~
前言:
长颈鹿最近在使用芯海的CS32L015C8T6单片机进行工程开发,发现网上有关这款单片机的资料非常少,而且官方提供的驱动代码有些不适用,因此决定记录一下造轮子的过程,前车之鉴,后车之师,希望能够帮助后来的开发者减少一些重复性造轮子的工作,少走一些弯路。
一、CS32L015系列GPIO资源简介:
这款单片机48脚封装的一共有4个GPIO口——GPIOA、GPIOB、GPIOC、GPIOD,每个IO口都有不超过8个复用功能,可以在数据手册的复用功能对照表中查询,例如配置TIM、SPI、PWM、UART等功能,都需要根据IO复用功能对照表来配置GPIO的功能。
二、芯海GPIO配置特殊情况说明:
芯海单片机的GPIO配置和ST的参数有很多不同,例如芯海的GPIO初始化结构体有一个“Debounce”参数,用来控制硬件按键消抖的开关,接下来就简单介绍一下配置GPIO作为输入、输出、模拟输入、中断、以及内部函数的流程方法。
需要特别注意的是,当GPIO配置为输入模式时,配置结构体中的输出模式参数OpenDrain一定要配置为GPIO_OPENDRAIN开漏输出模式,并且需要明确上下拉电阻,尽量不要为浮空输入。因为长颈鹿在配置按键输入时,将按键的端口配置为浮空输入,结果运行后检测按键一直处于低电平“按下”的状态,直到把输出模式参数OpenDrain调整为上拉输入才恢复正常,这也是芯海单片机独特的一个现象。
三、GPIO各模式初始化代码及注释:
/*****************************************************************************
[函数名称]MX_GPIO_Init
[函数功能]GPIO初始化函数
[参 数]
[备 注]这个GPIO初始化函数,只负责配置GPIO基本功能的外设端口
*****************************************************************************/
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
//CS32L015芯片只有GPIOA、B、C、D四个模块
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启GPIO对应的RCC时钟
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
//*************配置 GPIO中断 管脚***************
GPIO_InitStruct.Pin = INT_Pin;
GPIO_InitStruct.Mode = EXTI_MODE; //工作模式:中断
GPIO_InitStruct.Exti.Enable = GPIO_EXTI_INT_ENABLE; //中断使能:开启
GPIO_InitStruct.Exti.EdgeLevelSel = GPIO_EXTI_INT_EDGE; //触发方式:边沿触发
GPIO_InitStruct.Exti.RiseFallSel = GPIO_EXTI_INT_HIGHRISE; //边沿触发方式:上升沿
GPIO_InitStruct.Pull = GPIO_PULLDOWN; //上下拉电阻:下拉
GPIO_InitStruct.SlewRate = GPIO_SLEW_RATE_HIGH; //引脚通信速率:高
GPIO_InitStruct.Debounce.Enable = GPIO_DEBOUNCE_DISABLE; //硬件防抖动:关闭
HAL_GPIO_Init(INT_GPIO_Port, &GPIO_InitStruct);
__HAL_GPIO_EXTI_CLEAR_FLAG( INT_GPIO_Port, INT_Pin ); //中断标志位复位
HAL_NVIC_SetPriority( GPIOB_IRQn, 2 ); //设置GPIO优先级
HAL_NVIC_EnableIRQ( GPIOB_IRQn ); //开启GPIO中断
//*************配置 GPIO输入 管脚***************
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; //工作模式:输入
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.SlewRate = GPIO_SLEW_RATE_HIGH;
GPIO_InitStruct.OpenDrain = GPIO_OPENDRAIN; //输出方式:开漏
GPIO_InitStruct.Debounce.Enable = GPIO_DEBOUNCE_ENABLE;
GPIO_InitStruct.Pin = SHOT_Pin;
HAL_GPIO_Init(SHOT_GPIO_Port, &GPIO_InitStruct);
//*************配置 GPIO输出 管脚****************
//输出模式
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT; //工作模式:输出
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.OpenDrain = GPIO_PUSHPULL; //输出方式:推挽
GPIO_InitStruct.SlewRate = GPIO_SLEW_RATE_HIGH;
GPIO_InitStruct.DrvStrength = GPIO_DRV_STRENGTH_HIGH;
GPIO_InitStruct.Pin = LED_S_Pin | POWER_ON_Pin;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_WritePin(GPIOB, GPIO_InitStruct.Pin, GPIO_PIN_RESET); //初始化GPIO端口电平
}
四、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~
更多推荐



所有评论(0)