gd32 用固件库实现按键点灯

发布于:2022-10-28 ⋅ 阅读:(443) ⋅ 点赞:(0)

一、前言

我们会使用keil5进行开发,固件库使用的是gd32c10固件库,J_Link仿真调试。

开发板:GD32103RB
开发板:GD32103RB
**目标:**实现按键按下,灯就亮,再按下,灯就熄灭,4个按键正好对应4个灯。
怎么开发?

直接把GD32C10固件库下载下来,解压,在keil5模板例子里面打开工程。

在这里插入图片描述
前面的东西不好说,基本上要自己整,学过stm32的应该会熟练很多。

开发分析

1.实现LED1的初始化、亮灭

初始化函数:
gd_eval_led_init(LED2);
这里的LED2是模板里面定义的,我们从芯片原理图中找到我们想要的配置,也就是端口和对应的管脚。
在这里插入图片描述
原理图上的LED1就是我们要点亮的,PC10,代表C口时钟,管脚是10,所以我们要修改对应的.h文件配置, 当然你也可以自己重新定义

#define LED2_PIN                         GPIO_PIN_10
#define LED2_GPIO_PORT                   GPIOC
#define LED2_GPIO_CLK                    RCU_GPIOC

GPIO_PIN_x 这个x就是对应的管脚,LED2_GPIO_PORT 里 GPIOx x可以是A-E,对应端口

初始化好之后LED1就亮了

灯的点亮:gd_eval_led_off(LED2); //给低电平灯就点亮,自己看原理图
灯的熄灭:gd_eval_led_on(LED2); //给高电平灯熄灭

2.按键的初始化、检测

初始化函数:gd_eval_key_init(KEY_WAKEUP, KEY_MODE_GPIO);
同样根据上面的原理图找到PB12 B端口,12号引脚,修改定义

/* wakeup push-button */
#define WAKEUP_KEY_PIN                   GPIO_PIN_12
#define WAKEUP_KEY_GPIO_PORT             GPIOB
#define WAKEUP_KEY_GPIO_CLK              RCU_GPIOB

检测:

if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){
	gd_eval_led_toggle(LED2);	//让灯翻转的代码
   delay_1ms(500);
}

或者:
//初始化B口时钟
rcu_periph_clock_enable(RCU_GPIOB);
//KEY4的配置
gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,GPIO_PIN_15);

3.LED0的初始化、亮灭

看到上面原理图 LED0是PA15,A口 15号引脚,很是特殊,因为它是用作调试使用,要让它做普通GPIO使用,应该怎么做呢?
1.打开AFIO时钟
2.打开AFIO重映射功能
3.关闭JTAG,SWJ使能
4.做步骤1,lED的初始化,亮灭

rcu_periph_clock_enable(RCU_AF);	//AFIO备用时钟打开
gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);	//AFIO重映射

这固件库就是简单哈

固件库按键点灯代码

配置

/****************对应LED1 LED2 LED3 LED0******************************/
#define LED2_PIN                         GPIO_PIN_10
#define LED2_GPIO_PORT                   GPIOC
#define LED2_GPIO_CLK                    RCU_GPIOC
  
#define LED3_PIN                         GPIO_PIN_11
#define LED3_GPIO_PORT                   GPIOC
#define LED3_GPIO_CLK                    RCU_GPIOC
  
#define LED4_PIN                         GPIO_PIN_13
#define LED4_GPIO_PORT                   GPIOC
#define LED4_GPIO_CLK                    RCU_GPIOC
  
#define LED5_PIN                         GPIO_PIN_15
#define LED5_GPIO_PORT                   GPIOA
#define LED5_GPIO_CLK                    RCU_GPIOA
/****对应KEY1 KEY2 KEY3  KEY4自己设置,固件库里没有********/
/* wakeup push-button */
#define WAKEUP_KEY_PIN                   GPIO_PIN_12
#define WAKEUP_KEY_GPIO_PORT             GPIOB
#define WAKEUP_KEY_GPIO_CLK              RCU_GPIOB
#define WAKEUP_KEY_EXTI_LINE             EXTI_0
#define WAKEUP_KEY_EXTI_PORT_SOURCE      GPIO_PORT_SOURCE_GPIOA
#define WAKEUP_KEY_EXTI_PIN_SOURCE       GPIO_PIN_SOURCE_0
#define WAKEUP_KEY_EXTI_IRQn             EXTI0_IRQn  

/* tamper push-button */
#define TAMPER_KEY_PIN                   GPIO_PIN_13
#define TAMPER_KEY_GPIO_PORT             GPIOB
#define TAMPER_KEY_GPIO_CLK              RCU_GPIOB
#define TAMPER_KEY_EXTI_LINE             EXTI_13
#define TAMPER_KEY_EXTI_PORT_SOURCE      GPIO_PORT_SOURCE_GPIOC
#define TAMPER_KEY_EXTI_PIN_SOURCE       GPIO_PIN_SOURCE_13
#define TAMPER_KEY_EXTI_IRQn             EXTI10_15_IRQn

/* user push-button */
#define USER_KEY_PIN                     GPIO_PIN_14
#define USER_KEY_GPIO_PORT               GPIOB
#define USER_KEY_GPIO_CLK                RCU_GPIOB
#define USER_KEY_EXTI_LINE               EXTI_14
#define USER_KEY_EXTI_PORT_SOURCE        GPIO_PORT_SOURCE_GPIOB
#define USER_KEY_EXTI_PIN_SOURCE         GPIO_PIN_SOURCE_14
#define USER_KEY_EXTI_IRQn               EXTI10_15_IRQn

main.c



#include "gd32c10x.h"
#include "systick.h"
#include <stdio.h>
#include "main.h"
#include "gd32c10x_eval.h"

/********这个函数不能删除************/
void led_spark(void)
{
    static __IO uint32_t timingdelaylocal = 0U;

    if(timingdelaylocal){

        if(timingdelaylocal < 500U){
            //gd_eval_led_on(LED2);
        }else{
            //gd_eval_led_off(LED2);
        }

        timingdelaylocal--;
    }else{
        timingdelaylocal = 1000U;
    }
}

int main(void)
{
    /* configure systick */
    systick_config();
		
	rcu_periph_clock_enable(RCU_AF);
	gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);
    /* initilize the LEDs, USART and key */
    gd_eval_led_init(LED2); 
    gd_eval_led_init(LED3); 
    gd_eval_led_init(LED4);
	gd_eval_led_init(LED5);

    gd_eval_key_init(KEY_WAKEUP, KEY_MODE_GPIO);
	gd_eval_key_init(KEY_TAMPER, KEY_MODE_GPIO);
	gd_eval_key_init(KEY_USER, KEY_MODE_GPIO);
    
	/* enable the key GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOB);
    /* configure button pin as input */
    gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ,GPIO_PIN_15);		
	
	//初始化成功,多有灯都会亮,先关掉
	gd_eval_led_on(LED2);
	gd_eval_led_on(LED3);
	gd_eval_led_on(LED4);
	gd_eval_led_on(LED5);
    while (1){			
    	//检查按键是否按下
        if(RESET == gd_eval_key_state_get(KEY_WAKEUP)){
			gd_eval_led_toggle(LED2);	//按键按下就翻转
            delay_1ms(500);		//延迟
        }
		if(RESET == gd_eval_key_state_get(KEY_TAMPER)){
			gd_eval_led_toggle(LED3);
            delay_1ms(500);
        }
		if(RESET == gd_eval_key_state_get(KEY_USER)){
			gd_eval_led_toggle(LED4);
			delay_1ms(500);
        }
				
		if(RESET == gpio_input_bit_get(GPIOB,GPIO_PIN_15)){
			gd_eval_led_toggle(LED5);
			delay_1ms(500);
        }
    }
}

总结

大致步骤和stm32差不多,使用固件库开发简单很多,只需要会使用函数,和知道怎么使用就行。
GPIO的操作:
1.初始化端口时钟
2.对GPIO就行配置

灯的配置就是推挽输出 10MHZ
按键配置就是悬浮输入(因为只检测按键状态)

3.对相应管脚就行操作

本文含有隐藏内容,请 开通VIP 后查看

网站公告


今日签到

点亮在社区的每一天
去签到