GD32VF103_环境配置_GPIO_外部中断

前言

某商城花了70块顺便淘了块GD32VF103C-START的板子, RISC-V用来水几篇博客美滋滋.
板子长这个样子:
在这里插入图片描述
右边是GD-Link, 插上Win10联网会自动安装驱动, 安装时候显示的其实就是 DAP-Link, 用JLink方式调试运行, 没有虚拟串口!!! 所以你看到的, 上面又弄了个CH340转成了USB, 为了对称, 下面又弄一个MCU自己引出的USB, 一个板子怼了3个USB口我也是…而且上面的USB转串口的那个不支持供电, 板子要供电, 就得插上GD-Link的USB. Arduino的排座没有焊, 排针还是排座自己应付吧. 70块钱带调试器其实还算国产良心了! 废话有点多, 开撸了.

环境配置

如下:

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

新建工程

参考 Nuclei Studio IDE快速上手手册:

  • File -> New -> C/C++ Project, 选择C Managed Build: 在这里插入图片描述
  • 选择GigaDevice RISC-V Project, 填入工程名:
    在这里插入图片描述
  • MCU默认暂时只有GD32VF103, 然后Demo也没法选, 只有Running_LED, 不变: 在这里插入图片描述
  • 保持不变: 在这里插入图片描述
  • 完成: 在这里插入图片描述

引脚连接

板子只有一个连接到PA7的LED, 高电平点亮:
在这里插入图片描述

点灯

打开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);
    }
}

调试运行

Run -> Debug Configuration, GDB OpenOCD Debugging选工程名开头的那个:
在这里插入图片描述
其他不用变, 然后点击Debug, 就开始保存编译调试了, 点击下图按钮, 就可以看到板子的灯间隔1s亮灭了:
在这里插入图片描述
如果修改了代码想重新调试, 需要先点击红色方块停止, 再重新进入调试.

外部中断

板子还有一个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按键, 灯亮, 再按一下, 灯灭.

工程代码

clean project后再压缩, 会小一点.

https://download.csdn.net/download/weifengdq/11935057

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
配置STM32F103CB的GPIO口为外部中断模式,需要进行以下步骤: 1. 首先,需要在RCC时钟配置中使能GPIO口的时钟,可以使用以下代码: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOX, ENABLE); 其中,GPIOX是具体要配置的GPIO口所在的端口,例如,若要配置PA0口,则GPIOX为GPIOA。 2. 接下来,需要配置GPIO口对应的Pin脚为输入模式,可以使用以下代码: GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_X; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOX, &GPIO_InitStructure); 其中,GPIO_Pin_X是具体要配置的Pin脚对应的编号,例如,若要配置PA0口,则GPIO_Pin_X为GPIO_Pin_0。 3. 然后,需要配置NVIC中断向量表和优先级分组,可以使用以下代码: NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_X); NVIC_InitStructure.NVIC_IRQChannel = EXTIx_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = X; NVIC_InitStructure.NVIC_IRQChannelSubPriority = Y; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 其中,NVIC_PriorityGroup_X是中断优先级分组,X和Y是具体的优先级设置,EXTIx_IRQn是外部中断线对应的中断向量表编号。 4. 最后,需要配置EXTI外部中断线,可以使用以下代码: EXTI_InitTypeDef EXTI_InitStructure; EXTI_InitStructure.EXTI_Line = EXTI_Line_X; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_XYZ; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); 其中,EXTI_Line_X是外部中断线编号,例如,若要配置PA0口,则EXTI_Line_X为EXTI_Line0;EXTI_Trigger_XYZ是触发模式,包括EXTI_Trigger_Rising、EXTI_Trigger_Falling和EXTI_Trigger_Rising_Falling。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值