一、前言
我们会使用keil5进行开发,固件库使用的是gd32c10固件库,J_Link仿真调试。
开发板: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.对相应管脚就行操作