工程的创建
- 复制我们的工程模板,改名为 APM32 点亮LED ,再在此文件夹下创建 system 和 hardware 文件夹,用来存放系统的延时函数和外设的初始化函数,如图所示:
![](https://i-blog.csdnimg.cn/direct/8586b429e05a48d4ba6616c1287b7d68.png)
- 我们将江科大的延时函数复制到 system 文件夹下,将LED文件复制到 hardware 文件夹下,到此工程创建结束,如图所示:
![](https://i-blog.csdnimg.cn/direct/adc87a01021c4feb9080a2c1ba39b011.png)
![](https://i-blog.csdnimg.cn/direct/16d2d76fa4604fb2af8f0d69daaf1375.png)
KEIL配置与程序修改
- 添加如图所示两个文件夹,将刚才的延时和LED文件添加进来:
![](https://i-blog.csdnimg.cn/direct/5516a85acb784be0b2ddb8abda086d14.png)
![](https://i-blog.csdnimg.cn/direct/ee9ed554313a44d48c9986b0a7c1b895.png)
- 由于此芯片支持120M的主频,我们修改主频为120M,此时需要修改延时函数的参数,如图所示:
![](https://i-blog.csdnimg.cn/direct/aaf3484d80c441a0a464b9aaa4f1da32.png)
![](https://i-blog.csdnimg.cn/direct/d2ef53c4eb084101974637e1d1ffc531.png)
- 修改后的延时函数如下所示:
#include "apm32e10x.h" // Device header
/**
* @brief 微秒级延时
* @param xus 延时时长,范围:0~233015
* @retval 无
*/
void Delay_us(uint32_t xus)
{
SysTick->LOAD = 120 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
/**
* @brief 毫秒级延时
* @param xms 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_ms(uint32_t xms)
{
while(xms--)
{
Delay_us(1000);
}
}
/**
* @brief 秒级延时
* @param xs 延时时长,范围:0~4294967295
* @retval 无
*/
void Delay_s(uint32_t xs)
{
while(xs--)
{
Delay_ms(1000);
}
}
#ifndef __DELAY_H
#define __DELAY_H
void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);
#endif
- 修改LED的初始化程序,打开时钟函数用 RCM_EnableAPB2PeriphClock() ,GPIO初始化用 GPIO_Config() , 头文件需添加 apm32e10x_gpio.h 和 apm32e10x_rcm.h 具体如下所示:
#include "led.h"
void LED_init(void)
{
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB);
GPIO_Config_T configStruct;
configStruct.pin = GPIO_PIN_8;
configStruct.mode = GPIO_MODE_OUT_PP;
configStruct.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOB, &configStruct);
GPIO_SetBit(GPIOB,GPIO_PIN_8);
}
void LED1_on(void)
{
GPIO_ResetBit(GPIOB,GPIO_PIN_8); //liang
}
void LED1_off(void)
{
GPIO_SetBit(GPIOB,GPIO_PIN_8); //灭
}
void LED1_turn(void)
{
if(GPIO_ReadOutputBit(GPIOB,GPIO_PIN_8)==0) //电平反转
{
GPIO_SetBit(GPIOB,GPIO_PIN_8); //灭+
}
else
{
GPIO_ResetBit(GPIOB,GPIO_PIN_8);
}
}
#ifndef __LED_H__
#define __LED_H__
#include "apm32e10x.h"
#include "apm32e10x_gpio.h"
#include "apm32e10x_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 "apm32e10x.h" // Device header
#include "Delay.h"
#include "led.h"
int main (void)
{
LED_init();
while(1)
{
LED1_turn();
Delay_ms(1000);
}
}
蜂鸣器工程创建
![](https://i-blog.csdnimg.cn/direct/2a27106d90d944ba87c6a7631ca38a60.png)
![](https://i-blog.csdnimg.cn/direct/c63265c75ba84b6696c0d8cf56eebc1e.png)
- 修改蜂鸣器的程序,如下所示:
#include "buzzer.h"
void buzzer_init(void)
{
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOB);
GPIO_Config_T configStruct;
configStruct.pin = GPIO_PIN_9;
configStruct.mode = GPIO_MODE_OUT_PP;
configStruct.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOB, &configStruct);
GPIO_SetBit(GPIOB,GPIO_PIN_9);
}
void buzzer_on(void)
{
GPIO_ResetBit(GPIOB,GPIO_PIN_9);
}
void buzzer_off(void)
{
GPIO_SetBit(GPIOB,GPIO_PIN_9);
}
void buzzer_turn(void)
{
if(GPIO_ReadOutputBit(GPIOB,GPIO_PIN_9)==0) //电平反转
{
GPIO_SetBit(GPIOB,GPIO_PIN_9);
}
else
{
GPIO_ResetBit(GPIOB,GPIO_PIN_9);
}
}
#ifndef __BUZZER_H__
#define __BUZZER_H__
#include "apm32e10x.h"
#include "apm32e10x_gpio.h"
#include "apm32e10x_rcm.h"
void buzzer_init(void);
void buzzer_on(void);
void buzzer_off(void);
void buzzer_turn(void);
#endif
#include "apm32e10x.h" // Device header
#include "Delay.h"
#include "led.h"
#include "buzzer.h"
int main (void)
{
buzzer_init();
while(1)
{
buzzer_turn();
Delay_ms(1000);
}
}