从零开始创建GD32F4系列单片机工程模板&移植涂鸦MCU-SDK

Posted 三明治开发社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从零开始创建GD32F4系列单片机工程模板&移植涂鸦MCU-SDK相关的知识,希望对你有一定的参考价值。

从零开始创建GD32F4系列单片机工程模板&移植涂鸦MCU-SDK

 兆易创新的GD32单片机在中国MCU厂商市场中一直有着不算太小的份额。最近由于ST系列单片机的大幅度涨价,国产MCU凭借价格优势逐渐扩大了在开发群体中的影响力和接受度。

  本文将教大家如何从0开始上手GD32系列单片机,并移植涂鸦MCU-SDK来对接涂鸦WB3S wifi模块,快速接入涂鸦云。

工程搭建


  本文选用的MCU型号为GD32F450,按照以下流程操作即可创建一个Keil5环境的工程模板:

  • 前去官网下载GD32F4xx的环境支持包和标准固件库:

  • 按照自己使用的IDE选择相应的支持包进行安装:

  • 创建一个文件夹,并在其中按照下图创建数个子文件夹:

  • 将下载的GD32F4xx_Firmware_Library_V2.1.2\\Firmware\\CMSIS文件夹下的所有内容拷贝到我们自己创建的CMSIS文件夹下,同时将GD32F4xx_Firmware_Library_V2.1.2\\Template中的gd32f4xx_libopt.h文件拷贝到CMSIS\\GD\\GD32F4xx\\include中:

  • 将GD32F4xx_Firmware_Library_V2.1.2\\Firmware\\GD32F4xx_standard_peripheral文件夹拷贝到Peripherals文件夹中:

  • 将GD32F4xx_Firmware_Library_V2.1.2\\Firmware\\CMSIS\\GD\\GD32F4xx\\Source\\ARM中的文件拷贝到Startup中:

  • 将GD32F4xx_Firmware_Library_V2.1.2\\Template中的gd32f4xx_it.c、systick.c和它们对应的头文件都拷贝到User文件夹内,同时创建main.c文件:

  • 打开Keil5,创建新工程,位置在刚刚创建的MDK-ARM文件夹里,然后选择对应的MCU型号。

  • 打开Manage Project Items,添加如下Groups:

  • 在每个组内添加如下文件:

(Peripherals组内添加Soure文件夹下所有源文件)

mcu_sdk内暂时是空的,到后面移植SDK的时候再说。

  • 点击魔法棒,添加include paths:

  • 在main.c文件中添加:
#include "gd32f4xx.h"
#include "systick.h"

int main(void){

    while(1){

    }
}

点击编译,显示无报错,就完成了工程模板的创建。

MCU SDK移植

  进入涂鸦智能IoT平台,点击创建产品。这里不用纠结产品品类的选择,重点是为了拿到MCU-SDK文件,实际使用时可以根据具体的产品修改sdk内部的pid即可适配自己的产品。

  • 这里以普通的灯为例,选择照明->光源->自定义方案

  • 输入任意产品名称,通讯协议选择 WiFi+蓝牙,确认创建。

  • 跳出的功能添加页面直接点确定,点开硬件开发一栏,对接方式选择“涂鸦标准模组MCU SDK开发”,模组选择WB3S Wi-Fi&Bluetooth模组(在实际开发过程中可选择手上已有的涂鸦模组即可)

  • 拉到页面最下方,在下载资料一栏点击下载全部:

  • 在解压后的文件夹中找到mcu_sdk相关源文件和头文件,全部拷贝到我们创建好的GD32工程模板里的mcu_sdk文件夹里:

  • 打开GD32工程,将mcu_sdk的源文件添加进对应组里,同时添加include paths:

点击编译,会崩出几个error,接下来就需要按照出error的地方的注释提示一步步修改代码。

  • uart_receive_input()为串口接收数据处理接口,只需将它放进串口中断中即可,这里我们以串口0作为与通讯串口为例,首先在main函数中添加串口0初始化代码,并使能接收中断:
void system_init(void);
void uart_init(void);

int main(void)
{
    system_init();
    
    while(1){

    }
}

void system_init(void)
{
    /* configure systick */
    systick_config();
	
    /* USART interrupt configuration */
    nvic_irq_enable(USART0_IRQn, 0, 0);

    /* configure uart */
    uart_init();

    /* enable USART0 receive interrupt */
    usart_interrupt_enable(USART0, USART_INT_RBNE);

}

void uart_init(void)
{   
    /* enable USART clock */
    rcu_periph_clock_enable(RCU_USART0);
	
    /* connect port to USART0_Tx */
    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9);

    /* connect port to USART0_Rx */
    gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10);
	
    /* configure USART Tx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_9);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_9);

    /* configure USART Rx as alternate function push-pull */
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_10);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_10);

    /* USART configure */
    usart_deinit(USART0);
    usart_baudrate_set(USART0,115200U);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    usart_enable(USART0);
}
  • 然后在 gd32f4xx_it.c 文件中添加串口0中断处理函数,然后包含 wifi.h 文件并将uart_receive_input()接口添加进去,添加完成后,删除error注释即可:

/*!
    \\brief      this function handles USART RBNE interrupt request and TBE interrupt request
    \\param[in]  none
    \\param[out] none
    \\retval     none
*/
void USART0_IRQHandler(void)
{

    if((RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) && 
       (RESET != usart_flag_get(USART0, USART_FLAG_RBNE))){

        uart_receive_input((uint8_t)usart_data_receive(USART0));		

    }
}

再来看下一个errror:

由于我们上一步已经通过中断接收的形式实现了串口数据接收处理了,这个多字节处理我们可以不用,直接把error注释删除即可。

下一个:

按照提示将该接口放在main函数的while循环内即可,别忘了在 main.c 中包含 wifi.h 头文件。

再来看下一个error:

同样的,按照提示将该函数放到main函数开头部分即可。

然后是串口发送相关:

这里只需实现串口0的数据发送函数然后放进去即可。使用GD32的串口单字节发送的库函数,同时对发送情况做一个判断,添加代码如下:

void usart_sendbyte(unsigned char data)
{
    usart_data_transmit(USART0, data);
	
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)){
    }
}

然后是DP数据点上报相关的:

这里我们可以直接注释掉error提示,在实际开发过程中再实现该功能即可。


最后是产测相关的:

一般开发者不涉及生产测试的话直接删除注释不用管就行。

修改完上述几处地方后,再次编译,显示error全部消除,至此涂鸦MCU SDK就已移植完毕,后续可使用涂鸦模组调试助手进行测试。涂鸦模组调试助手的使用方法可参考调试助手文档

以上是关于从零开始创建GD32F4系列单片机工程模板&移植涂鸦MCU-SDK的主要内容,如果未能解决你的问题,请参考以下文章

STM32F4系列单片机上使用CUBE配置MBEDTLS实现pem格式公钥导入

STM32F4基于库函数移植DSP源码“DSP简介及工程创建“

STM32F4基于库函数移植DSP源码“DSP简介及工程创建“

GD32F450初次使用

GD32F450初次使用

stm32f405和stm32f407的区别