APM32E103系列单片机之LED与蜂鸣器(仿江科大工程)

工程的创建

  • 复制我们的工程模板,改名为 APM32 点亮LED ,再在此文件夹下创建 system 和 hardware 文件夹,用来存放系统的延时函数和外设的初始化函数,如图所示:
  • 我们将江科大的延时函数复制到 system 文件夹下,将LED文件复制到 hardware 文件夹下,到此工程创建结束,如图所示:
  • KEIL配置与程序修改

  • 添加如图所示两个文件夹,将刚才的延时和LED文件添加进来:
  • 由于此芯片支持120M的主频,我们修改主频为120M,此时需要修改延时函数的参数,如图所示:
  • 修改后的延时函数如下所示:
  • #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
  • main函数修改后,如下所示:
  • #include "apm32e10x.h"                  // Device header
    #include "Delay.h" 
    #include "led.h" 
    
    int main (void)
    {
    	LED_init();
    	
    	while(1)
    	{
    		LED1_turn();
    		Delay_ms(1000);
    	}
    }
    

    蜂鸣器工程创建

  • 像LED一样,添加 buzzer 文件:
  • 添加工程文件
  • 修改蜂鸣器的程序,如下所示:
    #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);
    	}
    }

  • 作者:m0_65148866

    物联沃分享整理
    物联沃-IOTWORD物联网 » APM32E103系列单片机之LED与蜂鸣器(仿江科大工程)

    发表回复