欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GD32E230X-从STM32到GD32

程序员文章站 2022-07-04 20:07:49
...

2018年11月1日,业界领先的半导体供应商兆易创新(GigaDevice)正式推出主频高达72MHz的GD32E230系列超值型微控制器新品,并宣布开启Arm® Cortex®-M23内核普及应用的全新世代。详细介绍请看兆易创新官网,相关官方资料点击下载

声明:本人非GD官方人员,只是众多嵌入式软件开发者的一员,把自己开发调试的过程,用笔记的形式记录。


目录


前言

初识

点灯

分析

结语


前言


近两年国内在电子芯片行业,发生了两个比较大的事件:“中兴事件”和“华为事件”;种种迹象表明,在未来的一段时间,老外的芯片都有可能出现不可预期的断供或者无限期延时供货的情况。

一部分国内电子产品厂商开始走向芯片国产化之路,为国货中的关键芯片寻找国产芯片,未雨绸缪,我所在的公司也成为了这一部分厂商之一,经过一段时间的寻找,最终在2019年底,作为开发者的我在这样的情形下,也开始了从STM32到GD32之旅。


初识


遇到一颗全新的MCU,先阅读这颗MCU的Datasheet,会有助于快速了解这颗陌生的MCU,经过激烈选型会议,我们决定用GD32E230C8T6来替换现在所使用的STM32F030C8T6。GD32E230C8T6这里我就不过多的介绍了,详细请看GD官方的GD32E230xx_Datasheet文档;

仔细读 Datasheet 的时候你就会发现,卧槽~,PIN脚这不是跟 STM32F030C8T6 一毛一样吗?是的,就是这样,兆易创新的目的很明确,这就是用来替换 STM32F030C8T6 的,功能基本不缺,该有的都有,没有的也有,而且成本还更便宜,看到这里,硬件工程师要集体高潮了,PIN对PIN直接替换上去不就可以了,完美的替换方案,PCB 都不用改的,然而,苦逼的永远是软件工程师,硬件底层驱动程序仍然需要一点一点的调试;选型会议上面,还是干不过硬件和成本,最后老大拍板了,就这个了。

作为软件工程师虽然很苦逼,但是仔细思考一下,此时也体现出了软件工程师的价值…喝下这口鸡汤,开干吧!


 点灯


 等待一周之后,收到了代理商寄给来的样片和 demo 板,看了几天的开发资料了,终于有开发板了,仔细一下就是GD官方GD32E230C_START开发板如下图 ↓

GD32E230X-从STM32到GD32
GD32E230C_START开发板

 

拿到开发板,一定要仔细看官方的文档,尤其是这种官方出的开发板,看看原理图,先老老实实的按照文档 GD32E230C-START评估板用户指南_V1.0 搭建开发环境, MDK 建议 5.25 以上,支持 M23 内核,过程不多说了。

搭建好开发环境,点个灯吧,demo 例程编译,下载,你就会看到开发板上面四个流水灯,经典的一逼!经典归经典,经典有经典的存在,点灯看起来很简单,其实有很大的意义:

1. 编译成功:开发环境没有问题,这是干活最基本的工具;

2. 下载成功:看来开发工具没有问题,这是后续开发的基础;

3. 流水灯运行成功:说明 MCU 从上电到正常运行,软件编程有效;


 分析


1.  详细说一下点灯例程意义第三点,结合代码看一下,先看下 main 函数你可以看到,systick_config 里面可以看到延时程序的设置, 再往下可以看到GPIO 的配置和使用过程,这里不深究了,再深究就到寄存器里面了,总之这里可以让我们简单的了解开发流程。

int main(void)
{
    systick_config();
    
    /* enable the LED1 GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    /* configure LED1 GPIO port */ 
    gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_7);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);
    /* reset LED1 GPIO pin */
    gpio_bit_reset(GPIOA,GPIO_PIN_7);

 

2. 看也看了,分析也分析了,是不是觉得卧槽,尼玛一个点灯,让你讲的很牛B的样子,其实漏了一个非常重要的东西,时钟!!MCU的主频现在设置的是多少??main 函数并没有设置时钟,去哪里找?参考STM32的开发,先看一下有没有启动文件,果然存在,打开看一下:

Reset_Handler   PROC
                EXPORT  Reset_Handler                     [WEAK]
                IMPORT  SystemInit
                IMPORT  __main
                LDR     R0, =SystemInit
                BLX     R0
                LDR     R0, =__main
                BX      R0
                ENDP

看到这里是不觉得好熟悉,那还犹豫什么啊,SystemInit 函数走起~~~~

void SystemInit (void)
{
    /* enable IRC8M */
    RCU_CTL0 |= RCU_CTL0_IRC8MEN;
    while(0U == (RCU_CTL0 & RCU_CTL0_IRC8MSTB)){
    }
    /* reset RCU */
    RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC |\
                  RCU_CFG0_ADCPSC | RCU_CFG0_CKOUTSEL | RCU_CFG0_CKOUTDIV | RCU_CFG0_PLLDV);
    RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLMF4 | RCU_CFG0_PLLDV);
    RCU_CTL0 &= ~(RCU_CTL0_HXTALEN | RCU_CTL0_CKMEN | RCU_CTL0_PLLEN | RCU_CTL0_HXTALBPS);
    RCU_CFG1 &= ~(RCU_CFG1_PREDV);
    RCU_CFG2 &= ~(RCU_CFG2_USART0SEL | RCU_CFG2_ADCSEL);
    RCU_CFG2 &= ~RCU_CFG2_IRC28MDIV;
    RCU_CFG2 &= ~RCU_CFG2_ADCPSC2;
    RCU_CTL1 &= ~RCU_CTL1_IRC28MEN;
    RCU_INT = 0x00000000U;

    /* configure system clock */
    system_clock_config();
    
#ifdef VECT_TAB_SRAM
    nvic_vector_table_set(NVIC_VECTTAB_RAM,VECT_TAB_OFFSET);
#else
    nvic_vector_table_set(NVIC_VECTTAB_FLASH,VECT_TAB_OFFSET);
#endif
}

剩下的看 GD32E230_gujiankuyonghu*n_V1.0,GD32E230xx_Datasheet_Rev1.3这两个文档吧,你会找到答案的,不多说,受人以鱼,不如受人以渔!


结语


1. 今天就到这里吧,也算一个入门吧。

2. 吐槽一下这个开发板,板载的是 GD-LINK,大眼一看你就会知道,想掰下来,没门,想拥有一个板载的 GD-LINK 都不行,看一下官网 GD-LINK 价格,299?! 深呼吸平复一下心情,既然支持SWD,要什么GD-LINK,要什么299!直接用 J-LINK 开发它不香吗??

3. 当我觉得接下来可以快快乐乐的用 J-LINK 开发的时候,结果又被上了一课,别说SWD 接口了, SWD 的 IO 口都没有引出来, 想用其他调试工具,不好意思,飞…飞…线吧…吧…我尼玛,真的想打人了啊?!再次深呼吸,既然都 PIN 对 PIN 了,找个STM32F030C8T6的开发板,直接替换不就有了。

4. 废话不多说,开始吧,下次分享使用 J-LINK 开发的过程!


原创不易,禁商用,可转载,但记得通知我一声!说实话,码字真的很费时间啊!!


 

相关标签: GD32 c语言