GD32E230程序烧录和开发环境使用介绍

news2024/9/21 0:49:13

GD32E230程序烧录和开发环境使用介绍


从GD32提供的资料来看,支持IAR、Keil、EmbeddedBuilder;目前该软件还是比较粗糙,个人上手体验不佳,面板菜单按键烧操作一下,动不动就卡死,仅支持gdlink调试器。

  • EmbeddedBuilder开发环境体验较差,我不太喜欢,虽然Keil开发环境槽点也是有,用起来还是比前者好用,起码动不动就卡死要好。Keil工程配合VSCode插件Keil Assistant使用起来体验不错。Embedded IDE目前没有安装该插件测试。基于GNU Tools ARM Embedded工具链,开发平台和环境选择还是很多样化的。
  • EmbeddedBuilde 创建并生成的代码工程,不能直接转到Keil开发环境下使用,没有这个功能。生成的代码有点奇葩的是驱动库竟然包含标准库和hal库,但是使能的外设仅做了对hal库函数的初始化,后面会介绍说明。
  • ✨需要注意一点的是,在使用EmbeddedBuilde ,自动自动生成初始化代码后,所有外设和中断都是仅仅做了初始化,并没有使能。在使用前必须先调用使能外设和使能对应外设中断才行。
  • 🔖 例如开启串口功能,在初次调用串口打印函数前,需要调用一次串口使能函数:usart_enable(USART0);

造成这样的原因可能是由于EmbeddedBuilde配置功能,仅仅调用了HAL库中相关的代码进行初始化操作。而 HAL 库代码仅包括这三大类函数,分别为:1.初始化类函数。2.配置类函数。3.功能类函数。原子/位操作需要从标准库中调用。EmbeddedBuilde配置的外设和中断功能,需要单独做使能操作。

📘SWD串行调试接口说明

GD32E23x系列内核只支持SWD调试接口,不支持JTAG接口。

  • GD32E230串行调试(SWD)提供两个引脚的接口:数据输入输出引脚(SWDIO)和时钟引脚(SWCLK)。
    调试引脚分配:
    PA14 : SWCLK
    PA13 : SWDIO

注意:复位后,调试相关端口为输入PU/PD模式,其中:
PA13:SWDIO为上拉模式;
PA14:SWCLK为下拉模式。

  • 🔨调试器:GD-LINK、CMSIS-DAP、J-LINK

✨通过SWD接口连接目标时,芯片不要处于Boot0=1,模式下,否则连接不到目标。在Boot0=1模式下,可以通过GD32AllInOneProgrammer工具,使用串口连接目标。

🧬Boot0=1模式下串口下载程序

In default condition, boot from main Flash memory is selected. The boot loader is located in
the internal boot ROM memory (system memory). It is used to reprogram the Flash memory
by using USART0 (PA9 and PA10) or USART1 (PA14 and PA15 or PA2 and PA3)

  • 🌿USART0 :PA9 and PA10
  • 🌿USART1 :(PA14 and PA15 or PA2 and PA3)
  • 🔧串口烧录程序,GUI上位机软件:GD32AllInOneProgrammer
  • 🔖串口连接后,可以编辑OB选项字节参数:
    在这里插入图片描述
  • 🌿IAR和Keil环境不多做介绍,如果使用EmbeddedBuilder,如果手上有gdlink那可以配合一起调试使用,如果有J-LINK/CMSISI-DAP可以配合MCUProg软件烧录程序使用。
    在这里插入图片描述

📗资源外设库说明

  • 🧨如果使用EmbeddedBuilder,那么所生成的工程中既包含有标准库文件也有hal库文件,std库是方便被hal库调用的。
  • 🌿hal库:GD32E23x_hal_peripheral
  • 🌿std库:GD32E23x_standard_peripheral

在这里插入图片描述

  • 🌿GD32E23x标准固件库:GD32E23x Firmware Libraryhttps://www.gd32mcu.com/cn/download/7?kw=GD32E2

🧲EmbeddedBuilder工程移植到Keil环境说明

  • 🔰移植对比图:
    在这里插入图片描述
  • 🌿EmbeddedBuilder工程移植到Keil环境,.s底层驱动文件不同。在Keil环境工程中可以直接拷贝标准库工程中的.s底层文件来用。("路径\GD32E23x_Firmware_Library_V2.1.0\Firmware\CMSIS\GD\GD32E23x\Source\ARM\startup_gd32e23x.s"
    在这里插入图片描述
  • 🌿添加宏GD32E230和设置头文件路径:

在这里插入图片描述
在这里插入图片描述

  • 🌿如果是新建工程,需要配置程序起始地址和大小:
    在这里插入图片描述
  • 🌿连接器配置选项:(与下载有关,没有勾选或上面的地址配置错误,烧录时会报错:No Algorithm found for: 00008000H - 00009EABH
    在这里插入图片描述

📚EmbeddedBuilder`移植到Keil工程模板

  • 🎉为了方便在Keil环境下,使用EmbeddedBuilder自动配置初始化代码的便利。可以直接将EmbeddedBuilder自动配置的初始化代码拷贝到Keil工程中使用。
  • 🔖如果只在EmbeddedBuilder中使用,那么此模板没有用处。
通过网盘分享的文件:HAL_Template.rar
链接: https://pan.baidu.com/s/19-5Kc3Xyv5wW9JJns2O6cQ?pwd=ijah 提取码: ijah

在这里插入图片描述

📘串口标准输出代码实现

  • 🌿支持printf函数,需要选择Use MicroLIB.
int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t)ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}
  • 🌿支持printf函数,而不需要选择Use MicroLIB
//加入以下代码,支持printf函数,而不需要选择use MicroLIB
#if 1
#if (__ARMCC_VERSION >= 6010050)
__asm(".global __use_no_semihosting\n\t");
__asm(".global __ARM_use_no_argv \n\t");
#else
#pragma import(__use_no_semihosting)
//标准库需要的支持函数
struct __FILE
{
	int handle;
};

#endif
int _ttywrch(int ch)
{
    ch = ch;
    return ch;
}
void _sys_exit(int x)
{
    x = x;
}
char *_sys_command_string(char *cmd, int len)
{
    return NULL;
}
FILE __stdout;

int fputc(int ch, FILE *f)
{
    usart_data_transmit(USART0, (uint8_t)ch);
    while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
    return ch;
}
#endif

📗24位滴答定时器做延时使用实现

  • 🌿做延时使用,不影响滴答定时器中断功能
volatile static uint32_t delay;
/*!
    \brief      configure systick
    \param[in]  none
    \param[out] none
    \retval     none
*/
void systick_config(void)
{
    /* setup systick timer for 1000,000 Hz interrupts */
    if (SysTick_Config(SystemCoreClock / 1000U)){
        /* capture error */
        while (1){
        }
    }
    /* configure the systick handler priority */
    NVIC_SetPriority(SysTick_IRQn, 0x00U);
}

/*!
    \brief      delay decrement
    \param[in]  none
    \param[out] none
    \retval     none
*/
void delay_decrement(void)
{
    if (0U != delay){
        delay--;
    }
}

/*!
    \brief      delay a time in milliseconds
    \param[in]  count: count in milliseconds
    \param[out] none
    \retval     none
*/
void delay_1ms(uint32_t count)
{
    delay = count;

    while(0U != delay){
    }
}
/*!
    \brief      delay a time in seconds
    \param[in]  count: count in seconds
    \param[out] none
    \retval     none
*/
void delay_1s(uint32_t count)
{
    uint32_t i;

    for(i = 0U; i < count; i++){
        delay_1ms(1000U);
    }
}

void SysTick_Handler(void)
{
    /* user code [SysTick_IRQn local 0] begin */
    /* user code [SysTick_IRQn local 0] end */
  //  hal_basetick_irq();
	delay_decrement();
    /* user code [SysTick_IRQn local 1] begin */
    /* user code [SysTick_IRQn local 1] end */
}
  • 🌿滴答定时器仅做延时使用,中断不能使用。
olatile static float count_1us = 0;
volatile static float count_1ms = 0;

/*!
    \brief      configure systick
    \param[in]  none
    \param[out] none
    \retval     none
*/
void systick_config(void)
{
    /* systick clock source is from HCLK/8 */
    systick_clksource_set(SYSTICK_CLKSOURCE_HCLK_DIV8);
    count_1us = (float)SystemCoreClock/8000000;
    count_1ms = (float)count_1us * 1000;
}

/*!
    \brief      delay a time in microseconds in polling mode
    \param[in]  count: count in microseconds
    \param[out] none
    \retval     none
*/
void delay_1us(uint32_t count)
{
    uint32_t ctl;
    
    /* reload the count value */
    SysTick->LOAD = (uint32_t)(count * count_1us);
    /* clear the current count value */
    SysTick->VAL = 0x0000U;
    /* enable the systick timer */
    SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
    /* wait for the COUNTFLAG flag set */
    do{
        ctl = SysTick->CTRL;
    }while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
    /* disable the systick timer */
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
    /* clear the current count value */
    SysTick->VAL = 0x0000U;
}

/*!
    \brief      delay a time in milliseconds in polling mode
    \param[in]  count: count in milliseconds
    \param[out] none
    \retval     none
*/
void delay_1ms(uint32_t count)
{
    uint32_t ctl;
    
    /* reload the count value */
    SysTick->LOAD = (uint32_t)(count * count_1ms);
    /* clear the current count value */
    SysTick->VAL = 0x0000U;
    /* enable the systick timer */
    SysTick->CTRL = SysTick_CTRL_ENABLE_Msk;
    /* wait for the COUNTFLAG flag set */
    do{
        ctl = SysTick->CTRL;
    }while((ctl&SysTick_CTRL_ENABLE_Msk)&&!(ctl & SysTick_CTRL_COUNTFLAG_Msk));
    /* disable the systick timer */
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
    /* clear the current count value */
    SysTick->VAL = 0x0000U;
}
  • 🌿使用Hal库调用延时函数

使用hal库时,滴答定时器默认是启用的,在系统初始化函数中一起被初始化。

void msd_system_init(void)
{
    /* user code [system_init local 0] begin */
    /* user code [system_init local 0] end */
    hal_fmc_prefetch_enable();
    hal_rcu_periph_clk_enable(RCU_CFGCMP);
    hal_nvic_periph_irq_enable(NonMaskableInt_IRQn, 0);
    hal_nvic_periph_irq_enable(HardFault_IRQn, 0);
    hal_nvic_periph_irq_enable(SVCall_IRQn, 0);
    hal_nvic_periph_irq_enable(PendSV_IRQn, 0);
    hal_nvic_periph_irq_enable(SysTick_IRQn, 0);
    hal_basetick_init(HAL_BASETICK_SOURCE_SYSTICK);//滴答定时器初始化

    /* user code [system_init local 1] begin */
    /* user code [system_init local 1] end */
}

void SysTick_Handler(void)
{
    /* user code [SysTick_IRQn local 0] begin */
    /* user code [SysTick_IRQn local 0] end */
    hal_basetick_irq();
    /* user code [SysTick_IRQn local 1] begin */
    /* user code [SysTick_IRQn local 1] end */
}
  • 🌿毫秒延时函数:
hal_sys_basetick_delay_ms(1000);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2118085.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第100+24步 ChatGPT学习:概率校准 Beta Calibration

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

元宇宙的崛起:重塑2024年游戏行业的新趋势

最早可以追溯到1994年&#xff0c;当时出现了世界上第一个轴测图界面的多人互动社交游戏《Web World》。‌这个游戏允许用户实时聊天、旅游、改造场景&#xff0c;开启了游戏中的UGC模式&#xff0c;可以视为元宇宙游戏的雏形。 2021年Roblox元宇宙的概念股上市&#xff0c;Fac…

学生护眼台灯哪个品牌比较好?分享五款效果好的学生护眼台灯

现在孩子的很多兴趣班和课后辅导班都是在线上举行&#xff0c;通常对着手机电脑长时间。电子产品有大量蓝光和辐射&#xff0c;会伤害到孩子的眼睛。但为了学习&#xff0c;也是没办法。护眼台灯的出现可以让孩子们的眼睛得到保护&#xff0c;防止蓝光对眼睛的伤害。学生护眼台…

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹&#xff0c;比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”&#xff0c;打开命令提示符&#xff0c;进入到发布代码目录 命令行启动.netcore项目的命令为: dotnet 项目启动文件.dll --urls"ht…

CSP-J基础之数学基础 计数原理与排列组合 一篇搞懂

文章目录 前言加法原理加法原理是什么使用场景 乘法原理举个例子总结 区别加法原理乘法原理总结 乘法原理的运用排列组合**排列****组合**总结 计算排列的可能种数举个例子数学定义数学公式应用公式例子应用 总结全排列举个例子数学定义数学公式作用 组合数学定义组合的公式举个…

系统安全设计规范(Word完整版)

1.1 总体设计 1.1.1 设计原则 1.2 物理层安全 1.2.1 机房建设安全 1.2.2 电气安全特性 1.2.3 设备安全 1.2.4 介质安全措施 1.3 网络层安全 1.3.1 网络结构安全 1.3.2 划分子网络 1.3.3 异常流量管理 1.3.4 网络安全审计 1.3.5 网络访问控制 1.3.6 完整性检查 1.…

天洑软件荣获国家级专精特新“小巨人”企业认定

近日&#xff0c;江苏省工业和信息化厅公布了第六批国家级专精特新"小巨人"企业名单&#xff0c;南京天洑软件有限公司&#xff08;以下简称“天洑软件”&#xff09;获得国家级专精特新“小巨人”企业认定。继2023年被评为江苏省“专精特新”中小企业后&#xff0c;…

【828华为云征文|华为云Flexus X实例:从选购到登录,一站式指南】

华为云Flexus X实例&#xff1a;从选购到登录&#xff0c;一站式指南 华为云Flexus X实例的优势大揭秘操作指南&#xff1a;一步步带你开通华为云Flexus X实例注册与登录华为云账号选择配置并购买选择Flexus X实例配置选择基础配置实例规格镜像存储网络弹性公网IP您可能需要&am…

佰朔资本:换手率是什么指标?换手率高股价为什么不涨呢?

换手率&#xff0c;也叫”周转率“&#xff0c;指的是在必定时间内商场中股票易手买卖的频率&#xff0c;是反映股票流通性强弱的指标之一。 换手率某段时期内成交量/发行总股数*100%。 通常而言&#xff0c;在股票商场上&#xff0c;换手次数多&#xff0c;筹码互动多&#…

Docker 部署 Kafka (图文并茂超详细)

部署 Kafka ( Docker ) Kafka对于zookeeper是强依赖&#xff0c;保存kafka相关的节点数据&#xff0c;所以安装Kafka之前必须先安装zookeeper [Step 1] : 部署 Zookeeper -> 拉取 Zookeeper 镜像 ➡️ 启动 Zookeeper 容器 docker pull zookeeper:3.4.14 docker run -d --…

Linux网络:网络协议栈协议

1.网络在体系结构的位置与网络协议栈的层状结构 2.协议栈各层的功能 协议栈分层设计达到了解耦目的&#xff0c;层与层之间只有接口之间的关系&#xff0c;提高了代码之间的可维护性与拓展性。同一层之间使用的协议相同&#xff0c;达到了跨设备的作用 3.协议 协议本质是一…

【详解】文件操作,Stream流

文件(File)操作——I/O流 Windows&#xff08;大多数&#xff09;进行文件操作的类File。 文件?文件夹?路径? 文件 能够使用工具打开操作的&#xff0c;文件是不能存储文件的。 一般文件具有后缀——.mp4 文件夹 存储文件的 路径问题——“/” 正右\ 反左/ ——统一朝左&am…

什么是点对点专线、SDH专线以及MSTP专线?

点对点专线&#xff08;Point-to-Point Circuit&#xff09;、SDH专线&#xff08;Synchronous Digital Hierarchy&#xff09;以及MSTP专线&#xff08;Multi-Service Transport Platform&#xff09;都是企业级通信服务中常见的网络连接类型&#xff0c;主要用于提供高带宽、…

SprinBoot+Vue停车场管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

《语文新读写》是知网收录吗?语文新读写编辑部查询

《语文新读写》是知网收录吗&#xff1f;语文新读写编辑部查询 《语文新读写》是知网收录。 一、期刊简介 《语文新读写》是经国家新闻出版总署正式批准&#xff0c;由上海世纪出版&#xff08;集团&#xff09;有限公司主管&#xff0c;上海少年儿童出版社有限公司主办的综合…

超宽带uwb芯片模块测距,扫地机器人轨迹跟随,自动导航定位、测距避障

智能家居产品正以未有的速度改变着我们的生活。从智能音箱到智能门锁&#xff0c;再到今天我们要深入探讨的主角——搭载了超宽带&#xff08;Ultra-Wideband, UWB&#xff09;芯片模块的扫地机器人&#xff0c;它们正悄然开启一场家庭清洁的创新。想象一下&#xff0c;一个不仅…

Python | 练习作业 2

为学生登录系统新增搜索功能。 第二天作业的解题思路&#xff1a; # 1.创建一个空列表保存搜索结果 # 2.让用户输入要搜索的内容 # 3.遍历学生信息&#xff0c;检查学生的id name age gender score # 中的属性值 是否跟用户搜索的内容一致 # 4.如果有一致的属性 那么就将该学生…

全局共用一个线程池竟然发生死锁了

在我们进行代码开发时&#xff0c;我也见过很多全局注册一个自定义线程池&#xff08;也有可能不是自定义的&#xff0c;直接使用更不推荐Executors 创建的线程池&#xff09;&#xff0c;也许是业务量不高、也许是其他原因&#xff0c;反正全局可这一个线程池使劲造。 先给大家…

深入FastAPI:掌握使用多个关联模型的高级用法[Union类型]

在FastAPI中&#xff0c;响应模型可以声明为Union类型&#xff0c;这允许你为同一个端点定义多种可能的响应模型。这种灵活性使得API可以根据不同的情况返回不同类型的数据结构。 例如&#xff0c;根据请求中的查询参数或数据库中的数据&#xff0c;一个API端点可能有时返回一…

零信任安全:重新思考数字世界的访问

目录 ​编辑 网络安全形势的演变 数字安全的变化 引入零信任安全 零信任的当今意义 了解零信任原则 零信任架构的核心概念 实施微分段 持续验证&#xff1a;积极主动的立场 与传统安全模型的对比 在现代企业中实施零信任 零信任实施基础知识 多重身份验证 (MFA) 的…