【AS32X601驱动系列教程】GPIO_点亮LED详解

在嵌入式开发的奇妙旅程中,GPIO(通用输入输出接口)作为芯片与外部世界交互的重要桥梁,扮演着不可或缺的角色。从简单的 LED 灯控制,到复杂的外设通信,GPIO 的灵活运用为开发者打开了无限可能的大门。自本章开始,正式开始用代码控制AS32x601各外设完成功能配置。

需要注意的是,AS32X601提供了8组GPIO,其中GPIOA~GPIOG寄存器操作完全一致,但在使用GPIOH的时候,寄存器列表中间少了一个32位寄存器,因此在使用过程中容易造成误操作,我们在驱动库中已经做了映射,若想要自行操作寄存器进行控制,需要格外注意这一点。

另外,在芯片的IO复用表中,其默认功能并非全部都是GPIO,还包含了MUL类型,使用此类型IO时,需要先将复用配置为GPIO功能,在完成接下来的操作。

硬件设计

AS32x601评估板板载3颗LED灯用于IO输出评估,原理图如下:

根据上图可以知道,LED"正极"接电源,"负极"接GPIOG三个引脚,当IO拉低时,LED亮,IO输出高时,LED灭,据此设计控制逻辑。

程序设计

操作流程

  1. 开led对应IO时钟

  2. 检查对应引脚默认配置,是否需要复用调整

  3. 初始化gpio结构体

  4. 控制gpio输出

主要代码分析

复制上一小节的工程模板,在工程目录下新建Bsp文件夹用于存放led相关控制代码,在IAR工程界面添加led.c和led.h文件。

在led.c文件中添加相应头文件,之后编写led初始化代码。

  1. /*
  2. * Function: User_LED_Init
  3. * Description: Configure LED GPIO.
  4. * Param: None.
  5. * Return: None.
  6. */
  7. void User_LED_Init()
  8. {
  9. GPIO_InitTypeDef GPIO_InitStructure;
  10. GPIOG_CLK_ENABLE();
  11. /* GPIOB Configure */
  12. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
  13. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  14. GPIO_InitStructure.GPIO_OType = GPIO_Out_PP;
  15. GPIO_InitStructure.GPIO_OStrength = GPIO_OStrength_9mA;
  16. GPIO_Init(GPIOG, &GPIO_InitStructure);
  17. }

在上述代码清单中,根据电路原理图,led与mcu的PG10、14、15引脚相连,因此我们首先打开GPIOG的时钟使能;

之后初始化gpio结构体,通过或操作同时对三个引脚进行初始化,配置推挽输出,同时配置io输出能力位9mA。

接下来,我们用宏定义的形式编写LED的控制函数。

  1. #define LED1_ON() GPIO_WriteBits(GPIOG, GPIO_Pin_15, GPIO_OCtrl_Vol)
  2. #define LED1_OFF() GPIO_WriteBits(GPIOG, GPIO_Pin_15, GPIO_OCtrl_Voh)
  3. #define LED1_TOGGLE() GPIO_ToggleBits(GPIOG, GPIO_Pin_15)
  4. #define LED2_ON() GPIO_WriteBits(GPIOG, GPIO_Pin_14, GPIO_OCtrl_Vol)
  5. #define LED2_OFF() GPIO_WriteBits(GPIOG, GPIO_Pin_14, GPIO_OCtrl_Voh)
  6. #define LED2_TOGGLE() GPIO_ToggleBits(GPIOG, GPIO_Pin_14)
  7. #define LED3_ON() GPIO_WriteBits(GPIOG, GPIO_Pin_10, GPIO_OCtrl_Vol)
  8. #define LED3_OFF() GPIO_WriteBits(GPIOG, GPIO_Pin_10, GPIO_OCtrl_Voh)
  9. #define LED3_TOGGLE() GPIO_ToggleBits(GPIOG, GPIO_Pin_10)

在led.h文件中添加如上代码,AS32驱动库中包含了引脚控制输出函数以及引脚翻转控制函数,通过宏的形式完成led控制名称的转换,便于理解。

此时,代码并不算完成,之后我们需要查询芯片设计手册中,GPIOG所在的总线,在系统时钟配置函数中需要打开对应总线时钟,具体方式参考上一小节。

最后,编写主函数代码,控制三个led灯流水闪烁。

  1. void main()

  2. {

  3. Systemclock_Init();

  4. delay_init(SMU_ClocksStruct.AXIBus0_Frequency/1000000);

  5. /* Initialize LED */

  6. User_LED_Init();

  7. while(1)

  8. {

  9. LED1_ON();LED2_OFF();LED3_OFF();

  10. delay_ms(100);

  11. LED1_OFF();LED2_ON();LED3_OFF();

  12. delay_ms(100);

  13. LED1_OFF();LED2_OFF();LED3_ON();

  14. delay_ms(100);

  15. }

  16. }

补充

在这个代码中调用了一个延时函数,该函数位于库文件System目录下,利用RISCV的CSR定时器,可以理解为系统定时器编写的精确延时函数,因此需要对此函数进行初始化,并传入当前系统时钟。

  1. delay_init(SMU_ClocksStruct.AXIBus0_Frequency/1000000);

SMU_ClocksStruct.AXIBus0_Frequency就是在系统时钟初始化函数中最后一个函数调用所读回来的所有总线时钟,由于Core时钟与AXIBus0同频,所以在此处就利用该参数进行延时初始化,除1000000的作用是,延时计算的时候单位为MHz,所以把后边的数量级给除掉。

相关推荐
深圳市九鼎创展科技3 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计3 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
小龙报4 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业4 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能4 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微
czwxkn4 小时前
4STM32(stdl)TIM定时器
stm32·单片机·嵌入式硬件
Love Song残响5 小时前
NVIDIA显卡终极优化指南
stm32·单片机·嵌入式硬件
qq_672592755 小时前
电源芯片为什么发热
单片机·嵌入式硬件
天天爱吃肉82185 小时前
【跨界封神|周杰伦×王传福(陶晶莹主持):音乐创作与新能源NVH测试,底层逻辑竟完全同源!(新人必看入行指南)】
python·嵌入式硬件·算法·汽车
国科安芯6 小时前
抗辐照MCU在精密时频系统中的单粒子效应评估与可靠性验证
单片机·嵌入式硬件·架构·制造·安全性测试