目录

前言:

一、CS32L015系列GPIO资源简介:

二、芯海GPIO配置特殊情况说明:

三、GPIO各模式初始化代码及注释:

四、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~


前言:

        长颈鹿最近在使用芯海的CS32L015C8T6单片机进行工程开发,发现网上有关这款单片机的资料非常少,而且官方提供的驱动代码有些不适用,因此决定记录一下造轮子的过程,前车之鉴,后车之师,希望能够帮助后来的开发者减少一些重复性造轮子的工作,少走一些弯路。

一、CS32L015系列GPIO资源简介:

        这款单片机48脚封装的一共有4个GPIO口——GPIOA、GPIOB、GPIOC、GPIOD,每个IO口都有不超过8个复用功能,可以在数据手册的复用功能对照表中查询,例如配置TIM、SPI、PWM、UART等功能,都需要根据IO复用功能对照表来配置GPIO的功能。

GPIO复用功能示意图

二、芯海GPIO配置特殊情况说明:

        芯海单片机的GPIO配置和ST的参数有很多不同,例如芯海的GPIO初始化结构体有一个“Debounce”参数,用来控制硬件按键消抖的开关,接下来就简单介绍一下配置GPIO作为输入、输出、模拟输入、中断、以及内部函数的流程方法。

        需要特别注意的是当GPIO配置为输入模式时,配置结构体中的输出模式参数OpenDrain一定要配置为GPIO_OPENDRAIN开漏输出模式,并且需要明确上下拉电阻,尽量不要为浮空输入。因为长颈鹿在配置按键输入时,将按键的端口配置为浮空输入,结果运行后检测按键一直处于低电平“按下”的状态,直到把输出模式参数OpenDrain调整为上拉输入才恢复正常,这也是芯海单片机独特的一个现象。

GPIO初始化结构体成员参数及说明

三、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端口电平
}

四、如果这篇文章能帮助到你,请点个赞鼓励一下吧ξ( ✿>◡❛)~

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐