本帖最后由 LIZARD925 于 2025-6-22 00:24 编辑
#技术资源# #申请原创#
APM32E030系列使用记录--GPIO的使用
我将极海官网APME030的例程,根据B站江科大的例程,新建了一个工程模版,在这里介绍一下模板的结构,并说明如何在这个工程模板上进行GPIO的操作,如点灯、按键等,例程已上传附件,仅供参考。
工程模板的介绍:
1、DebugConfig
2、library
3、Listings
4、Objects
5、start
6、user
模版分为这六个文件夹,其中DebugConfig、Listings和Objects文件夹是 Keil MDK 5 自动生成的,DebugConfig文件夹用于存储一些调试配置文件,Listings和Objects文件夹用来存储 Keil MDK 5 编译过程的一些中间文件;library文件夹下放的是APM32E030用到的驱动标准库文件,不需要改;start文件下放的是外设寄存器文件、内核寄存器描述文件、时钟文件等,也不需要更改;user文件夹下,存放中断函数与主函数,可根据自己喜好进行添加。
GPIO操作之点亮LED灯:
我们先打开工程模版,新建一个system 的文件夹,放我们的延时函数,延时函数使用 系统嘀嗒定时器 进行实现,文件添加完成后,记得在工程中添加文件的路径

将延时函数复制过来即可使用,添加进工程后,如图所示
- #include "apm32e030.h" // Device header
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] 微秒级延时
- * @param xus 延时时长,范围:0~233015
- * @retval 无
- */
- void Delay_us(uint32_t xus)
- {
- SysTick->LOAD = 72 * xus; //设置定时器重装值
- SysTick->VAL = 0x00; //清空当前计数值
- SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
- while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
- SysTick->CTRL = 0x00000004; //关闭定时器
- }
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] 毫秒级延时
- * @param xms 延时时长,范围:0~4294967295
- * @retval 无
- */
- void Delay_ms(uint32_t xms)
- {
- while(xms--)
- {
- Delay_us(1000);
- }
- }
-
- /**
- * [url=home.php?mod=space&uid=247401]@brief[/url] 秒级延时
- * @param xs 延时时长,范围:0~4294967295
- * @retval 无
- */
- void Delay_s(uint32_t xs)
- {
- while(xs--)
- {
- Delay_ms(1000);
- }
- }
此时我们写一个简单的IO翻转来测试延时函数的准确性,使用逻辑分析仪进行测量,可看到时间和我们设置的时间相差无几,IO的初始化也可参考例程进行更改
- int main (void)
- {
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB); //打开GPIOB的时钟
- GPIO_Config_T GPIO_InitStructure;
-
- GPIO_InitStructure.mode = GPIO_MODE_OUT; // 输出模式
- GPIO_InitStructure.pin = GPIO_PIN_6;
- GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
- GPIO_InitStructure.outtype = GPIO_OUT_TYPE_PP; //推挽输出
- GPIO_Config(GPIOB,&GPIO_InitStructure);
- while(1)
- {
- Delay_ms(500);
- GPIO_WriteBitValue(GPIOB,GPIO_PIN_6,0);
- Delay_ms(500);
- GPIO_WriteBitValue(GPIOB,GPIO_PIN_6,1);
- }
- }
此时可看到延时函数没问题,我们将点灯程序进行封装,添加hardware文件夹,放入led.c\led.h文件,如图所示,硬件原理图在此链接进行下载:
- https://www.geehy.com/uploads/tool/APM32E030R%20Micro-EVB%20V1.0.SchDoc.pdf
添加好后,我们根据原理图初始化对应的GPIO口,初始化PB6和PB7这个两个引脚,调用后测试无误,为流水灯的现象,具体代码如下:



- #include "LED.h"
- void LED_init(void)
- {
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB); //打开GPIOB的时钟
- GPIO_Config_T GPIO_InitStructure;
-
- GPIO_InitStructure.mode = GPIO_MODE_OUT; // 输出模式
- GPIO_InitStructure.pin = GPIO_PIN_6|GPIO_PIN_7;
- GPIO_InitStructure.speed = GPIO_SPEED_50MHz;
- GPIO_InitStructure.outtype = GPIO_OUT_TYPE_PP; //推挽输出
- GPIO_Config(GPIOB,&GPIO_InitStructure);
- GPIO_SetBit(GPIOB, GPIO_PIN_6|GPIO_PIN_7); //初始化LED为灭
- }
- void LED1_on(void)
- {
- GPIO_ClearBit(GPIOB,GPIO_PIN_6); //亮
- }
- void LED1_off(void)
- {
- GPIO_SetBit(GPIOB,GPIO_PIN_6); //灭
- }
- void LED2_on(void)
- {
- GPIO_ClearBit(GPIOB,GPIO_PIN_7); //亮
- }
- void LED2_off(void)
- {
- GPIO_SetBit(GPIOB,GPIO_PIN_7); //灭
- }
- void LED1_turn(void)
- {
- if(GPIO_ReadOutputBit(GPIOB,GPIO_PIN_6)==0) //电平反转
- {
- GPIO_SetBit(GPIOB,GPIO_PIN_6);
- }
- else
- {
- GPIO_ClearBit(GPIOB,GPIO_PIN_6);
- }
- }
- void LED2_turn(void)
- {
- if(GPIO_ReadOutputBit(GPIOB,GPIO_PIN_7)==0) //电平反转
- {
- GPIO_SetBit(GPIOB,GPIO_PIN_7);
- }
- else
- {
- GPIO_ClearBit(GPIOB,GPIO_PIN_7);
- }
- }
|