本帖最后由 LIZARD925 于 2025-6-14 22:08 编辑
#技术资源# #申请原创#
APM32E030系列使用记录--点亮一个LED灯
将极海官网的例程根据江科大的例程,生成了一个工程模版,在这里介绍一下如何在这个工程模板上进行点灯操作,例程已上传附件
我们先打开工程模版,新建一个system 的文件夹,放我们的延时函数,延时函数可直接拿stm32f1的延时函数直接用,并添加文件的路径

将延时函数复制过来即可使用,添加进工程后,如图所示
#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的初始化也可参考例程进行更改
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
我们初始化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);
}
}
#ifndef __LED_H__
#define __LED_H__
#include "apm32e030.h" // Device header
#include "apm32e030_gpio.h"
#include "apm32e030_rcm.h"
void LED_init(void);
void LED1_on(void);
void LED1_off(void);
void LED2_on(void);
void LED2_off(void);
void LED1_turn(void);
void LED2_turn(void);
#endif
#include "apm32e030.h" // Device header
#include "Delay.h"
#include "LED.h"
int main (void)
{
LED_init();
while(1)
{
LED1_turn();
Delay_ms(500);
LED2_turn();
}
}
|