打印

GD32VF103_环境配置_GPIO_外部中断

[复制链接]
2210|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
晓伍|  楼主 | 2021-6-4 21:40 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
板子长这个样子:



右边是GD-Link, 插上Win10联网会自动安装驱动, 安装时候显示的其实就是 DAP-Link, 用JLink方式调试运行, 没有虚拟串口!!! 所以你看到的, 上面又弄了个CH340转成了USB, 为了对称, 下面又弄一个MCU自己引出的USB, 一个板子怼了3个USB口我也是…而且上面的USB转串口的那个不支持供电, 板子要供电, 就得插上GD-Link的USB. Arduino的排座没有焊, 排针还是排座自己应付吧. 70块钱带调试器其实还算国产良心了! 废话有点多, 开撸了.

使用特权

评论回复
沙发
晓伍|  楼主 | 2021-6-4 21:41 | 只看该作者
环境配置
如下:

GD-Link驱动, 上面已经说了, Win10联网会自动安装.
IDE可以用的比较多, 但还是得选一个, 就芯来科技(NUCLEI)的 Nuclei Studio, 免安装, 基于eclipse, 所以java要装, java环境变量要设置好(自己搜去), 然后就可以直接双击 NucleiStudio_IDE_201909\NucleiStudio\eclipse.exe 打开IDE了.


使用特权

评论回复
板凳
晓伍|  楼主 | 2021-6-4 21:43 | 只看该作者
新建工程

File -> New -> C/C++ Project, 选择C Managed Build:

选择GigaDevice RISC-V Project, 填入工程名:

MCU默认暂时只有GD32VF103, 然后Demo也没法选, 只有Running_LED, 不变:

保持不变:

完成:


使用特权

评论回复
地板
晓伍|  楼主 | 2021-6-4 21:43 | 只看该作者
引脚连接

板子只有一个连接到PA7的LED, 高电平点亮:


使用特权

评论回复
5
晓伍|  楼主 | 2021-6-4 21:43 | 只看该作者
点灯
打开Application/main.c, 看到里面是用 gd32vf103v_eval 的板子来点灯, 我们是start板子, 就一个灯, main.c里面的代码可以全删了, 改成下面的:

#include "gd32vf103.h"
#include "systick.h"

#define LED_PIN           GPIO_PIN_7
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_CLK  RCU_GPIOA

int main(void)
{
        rcu_periph_clock_enable(LED_GPIO_CLK);        //enable the peripherals clock
        gpio_init(LED_GPIO_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED_PIN);        //GPIO output with push-pull
        GPIO_BC(LED_GPIO_PORT) = LED_PIN;        //bit clear

    while(1){
            GPIO_BOP(LED_GPIO_PORT) = LED_PIN;        //1
            delay_1ms(1000);
            GPIO_BC(LED_GPIO_PORT) = LED_PIN;        //0
        delay_1ms(1000);
    }
}


使用特权

评论回复
6
晓伍|  楼主 | 2021-6-4 21:44 | 只看该作者
调试运行
Run -> Debug Configuration, GDB OpenOCD Debugging选工程名开头的那个:

其他不用变, 然后点击Debug, 就开始保存编译调试了, 点击下图按钮, 就可以看到板子的灯间隔1s亮灭了:


如果修改了代码想重新调试, 需要先点击红色方块停止, 再重新进入调试.


使用特权

评论回复
7
晓伍|  楼主 | 2021-6-4 21:45 | 只看该作者
外部中断
板子还有一个Wakeup的按键, 连到PA0, 默认低电平, 按键按下是高电平:

注意按键相邻有一个Reset按键, 是MCU复位用的, 看丝印可以分清, 不要弄混.
下面代码中ECLIC是 Enhancement Core-Local Interrupt Controller 的缩写.
我们设置按键的下降沿中断, 每次按键释放, LED更改一次状态:

#include "gd32vf103.h"
#include "systick.h"

#define LED_PIN           GPIO_PIN_7
#define LED_GPIO_PORT GPIOA
#define LED_GPIO_CLK  RCU_GPIOA

#define KEY_PIN           GPIO_PIN_0
#define KEY_GPIO_PORT GPIOA
#define KEY_GPIO_CLK  RCU_GPIOA
#define KEY_EXTI          EXTI0_IRQn
#define KEY_PORT_SOURCE GPIO_PORT_SOURCE_GPIOA
#define KEY_PIN_SOURCE GPIO_PIN_SOURCE_0
#define KEY_LINE EXTI_0

int main(void)
{
        //LED
        rcu_periph_clock_enable(LED_GPIO_CLK);        //enable the peripherals clock
        gpio_init(LED_GPIO_PORT, GPIO_MODE_OUT_PP,
                        GPIO_OSPEED_50MHZ, LED_PIN);        //GPIO output with push-pull
        GPIO_BC(LED_GPIO_PORT) = LED_PIN;        //bit clear

        //KEY
        eclic_global_interrupt_enable();        //enable the global interrupt
        eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1);        //set the priority group
        rcu_periph_clock_enable(KEY_GPIO_CLK);        //enable the peripherals clock
        rcu_periph_clock_enable(RCU_AF);        //enable alternate function clock
        gpio_init(KEY_GPIO_PORT, GPIO_MODE_IN_FLOATING,
                        GPIO_OSPEED_50MHZ, KEY_PIN);        //configure button pin as input
        eclic_irq_enable(KEY_EXTI, 1, 1);        //enable the EXTI0 interrupt @priority(1, 1)
        gpio_exti_source_select(KEY_PORT_SOURCE,
                        KEY_PIN_SOURCE);        //select GPIO pin exti sources
        exti_init(KEY_LINE, EXTI_INTERRUPT, EXTI_TRIG_FALLING);        //configure key EXTI line
        exti_interrupt_flag_clear(KEY_LINE);        //clear EXTI lines pending flag

    while(1){
            //GPIO_BOP(LED_GPIO_PORT) = LED_PIN;        //1
            //delay_1ms(1000);
            //GPIO_BC(LED_GPIO_PORT) = LED_PIN;        //0
        //delay_1ms(1000);
    }
}

void Toggle_LED(void) {
        gpio_bit_write(LED_GPIO_PORT, LED_PIN,
                        (bit_status)(1-gpio_input_bit_get(LED_GPIO_PORT, LED_PIN)));
}

void EXTI0_IRQHandler(void)
{
    if(RESET != exti_interrupt_flag_get(KEY_LINE)){
        exti_interrupt_flag_clear(KEY_LINE);
        Toggle_LED();
    }
}


按键设置下降沿中断的代码真的是又臭又长, 如果有自动代码生成工具就好了. 调试运行, 按一下Wakeup按键, 灯亮, 再按一下, 灯灭.


使用特权

评论回复
8
yklstudent| | 2021-6-28 09:30 | 只看该作者
楼主这用的什么开发环境

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

60

主题

3893

帖子

1

粉丝