GD32F130 使用ST库开发项目

文章目录

  • 前言
  • 一、选开发库
  • 二、使用步骤
    • 1.安装pack包和配置
    • 2.项目编译和功能debug
  • 总结

前言

近来STM32的MCU货源紧张,考虑用GD的芯片待用,以前也有用GD32F10X代替STM32F10X系列的,发现兼容性挺好的,ST的库基本上拿过来后就看直接使用。但这次用GD32F130来替换STM32F030,发现ST软件库有好多地方不兼容,特别是ADC功能,特此记录一下debug的过程。(如果直接使用GD的例程库可忽略本文)


一、选开发库

从芯片角度看,硬件上是PIN2PIN的,GD32F130外设地址设计是参考STM32F030,但STM32F030是M0内核,GD32F130是M3内核,时钟也可以到72M,多了APB2总线等。所以考虑用STM32F030的库来改写,本次实验采用的是STM32F0xx_DFP.1.5.0版本。

二、使用步骤

1.安装pack包和配置

从GD官网下载编译器芯片支持包:GigaDevice.GD32F1x0_DFP.3.2.0.pack
然后找一个原先用STM32f030做过的项目模板,配置一下编译环境。

Device选项里选择GD的对应的具体芯片,本次用的是130C8系列,效果图如下:

工程架构如下,继续采用ST的系统,如下

启动文件startup_stm32f0xx.s可以不用修改,直接使用。
系统文件system_stm32f0xx.c可以简单修改,主要是SetSysClock()函数,
主频提高到72MHz,

 RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6 )

改为

RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL9 )

另外增加APB2 配置,

 /* PCLK2 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;

后面发现以上几项参数不修改也可以直接使用。

2.项目编译和功能debug

现在直接编译后下载到芯片,发现GPIO,串口,PWM, 软件I2C(为代码通用性一些低速的通讯都采用软件模拟方式)等功能都能正常使用了。但ADC无法工作,表现为程序卡住,后debug发现是查询ADC转换是否完成始终没返回,

while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));

后需仔细核对后,发现虽然GD32F130的ADC内存地址段(0x40012400-0x400127ff)和STM32F030是一致的,但各个具体寄存器定义的状态和标志位还是不一样的,例如ADC_FLAG_EOC,ADCx->DR,ADC_CHANNEL定义都不一致。甚至宏定义ADC_BASE都不一样,在STM库里要用ADC1_BASE这个宏,前面这么顺利,这个地方轻敌了,debug了很久,被坑了一把…

最后参考了GD32F130的官方库中ADC内容,抽取出部分必要的内容,导入到现项目中,终于把ADC功能模块搞定。

具体参考代码如下
头文件增加内容

//
//for GD130
#define gdREG32(addr)       (*(volatile uint32_t *)(uint32_t)(addr))
#define gdBIT(x)            ((uint32_t)((uint32_t)0x01U<<(x)))
#define gdBITS(start, end)  ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end)))) #define gdADC_STAT          gdREG32(0x40012400U)
#define gdADC_CTL1          gdREG32(0x40012408U)
#define gdADC_RDATA         gdREG32(0x4001244CU)#define gdADC_RSQ0          gdREG32(0x4001242CU)
#define gdADC_RSQ1          gdREG32(0x40012430U)
#define gdADC_RSQ2          gdREG32(0x40012434U)
#define gdADC_SAMPT0        gdREG32(0x4001240CU)
#define gdADC_SAMPT1        gdREG32(0x40012410U)     #define gdADC_CTL1_ADCON    gdBIT(0)
#define gdADC_CTL1_CLB      gdBIT(2)
#define gdADC_CTL1_RSTCLB   gdBIT(3)
#define gdADC_CTL1_SWRCST   gdBIT(22)                             #define gdADC_FLAG_EOC        gdBIT(1)/* gd_ADC channel definitions */
#define gdADC_CHANNEL_0                   ((uint8_t)0x00U)
#define gdADC_CHANNEL_1                   ((uint8_t)0x01U)
#define gdADC_CHANNEL_2                   ((uint8_t)0x02U)
#define gdADC_CHANNEL_3                   ((uint8_t)0x03U)
#define gdADC_CHANNEL_4                   ((uint8_t)0x04U)
#define gdADC_CHANNEL_5                   ((uint8_t)0x05U)
#define gdADC_CHANNEL_6                   ((uint8_t)0x06U)
#define gdADC_CHANNEL_7                   ((uint8_t)0x07U)
#define gdADC_CHANNEL_8                   ((uint8_t)0x08U)
#define gdADC_CHANNEL_9                   ((uint8_t)0x09U)
#define gdADC_CHANNEL_10                  ((uint8_t)0x0AU)
#define gdADC_CHANNEL_11                  ((uint8_t)0x0BU)
#define gdADC_CHANNEL_12                  ((uint8_t)0x0CU)
#define gdADC_CHANNEL_13                  ((uint8_t)0x0DU)
#define gdADC_CHANNEL_14                  ((uint8_t)0x0EU)
#define gdADC_CHANNEL_15                  ((uint8_t)0x0FU)
#define gdADC_CHANNEL_16                  ((uint8_t)0x10U)
#define gdADC_CHANNEL_17                  ((uint8_t)0x11U)
#define gdADC_CHANNEL_18                  ((uint8_t)0x12U)                    /* adc_samptx register value */
#define gdSAMPTX_SPT(regval)              (gdBITS(0,2) & ((uint32_t)(regval) << 0))
#define gdADC_SAMPLETIME_1POINT5          gdSAMPTX_SPT(0)
#define gdADC_SAMPLETIME_7POINT5          gdSAMPTX_SPT(1)
#define gdADC_SAMPLETIME_13POINT5         gdSAMPTX_SPT(2)
#define gdADC_SAMPLETIME_28POINT5         gdSAMPTX_SPT(3)
#define gdADC_SAMPLETIME_41POINT5         gdSAMPTX_SPT(4)
#define gdADC_SAMPLETIME_55POINT5         gdSAMPTX_SPT(5)
#define gdADC_SAMPLETIME_71POINT5         gdSAMPTX_SPT(6)
#define gdADC_SAMPLETIME_239POINT5        gdSAMPTX_SPT(7)                      #define gdADC_RSQX_RSQN                   gdBITS(0,4)
#define gdADC_RSQ0_RL                     gdBITS(20,23)
#define gdADC_SAMPTX_SPTN                 gdBITS(0,2)                          ///
...
void  gdADC_Init(void);
u16 gdGet_Adc(uint8_t ch);

在源文件中添加,


void gdadc_enable(void)
{if(RESET == (gdADC_CTL1 & gdADC_CTL1_ADCON)){gdADC_CTL1 |= (uint32_t)gdADC_CTL1_ADCON;}
}void gdadc_disable(void)
{gdADC_CTL1 &= ~((uint32_t)gdADC_CTL1_ADCON);
}void gdADC_StartOfConversion()
{gdADC_CTL1 |= gdADC_CTL1_SWRCST;
}uint16_t gdADC_GetConversionValue()
{return ((uint16_t)gdADC_RDATA);
}void gdadc_flag_clear(uint32_t flag)
{gdADC_STAT &= ~((uint32_t)flag);
}void gdadc_calibration_enable(void)
{gdADC_CTL1 |= (uint32_t) gdADC_CTL1_RSTCLB;while((gdADC_CTL1 & gdADC_CTL1_RSTCLB)){}gdADC_CTL1 |= gdADC_CTL1_CLB;while((gdADC_CTL1 & gdADC_CTL1_CLB)){}
}void gdadc_regular_channel_config(uint8_t channel, uint32_t sample_time)
{uint32_t rsq,sampt;#ifdef GD32F130_150if(gdADC_CHANNEL_18 == channel){channel = gdADC_CHANNEL_0;}
#endifrsq = gdADC_RSQ2;rsq &=  ~((uint32_t)gdADC_RSQX_RSQN);rsq |= ((uint32_t)channel );gdADC_RSQ2 = rsq;if(channel < 10U){sampt = gdADC_SAMPT1;sampt &= ~((uint32_t)(gdADC_SAMPTX_SPTN << (3U*channel)));sampt |= (uint32_t)(sample_time << (3U*channel));gdADC_SAMPT1 = sampt;}else if(channel < 18U){sampt = gdADC_SAMPT0;sampt &= ~((uint32_t)(gdADC_SAMPTX_SPTN << (3U*(channel-10U))));sampt |= (uint32_t)(sample_time << (3U*(channel-10U)));gdADC_SAMPT0 = sampt;}else{}
}void  gdADC_Init(void)
{   ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure;RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE );GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0 | GPIO_Pin_1;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStructure); ADC_DeInit(ADC1);  ADC_StructInit(&ADC_InitStructure);//ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;  //not supportADC_InitStructure.ADC_ContinuousConvMode = DISABLE;      ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;    ADC_Init(ADC1, &ADC_InitStructure);    ADC_Cmd(ADC1, ENABLE);   //gdadc_enable(); //OK alsodelay_ms(1);gdadc_calibration_enable();} u16 gdGet_Adc(uint8_t ch)
{   u16 ValResult=0;gdadc_regular_channel_config(ch,gdADC_SAMPLETIME_55POINT5);gdADC_StartOfConversion();      gdADC_StartOfConversion();  //a bug here related to trigger config abovewhile(!ADC_GetFlagStatus(ADC1, gdADC_FLAG_EOC));ValResult = gdADC_GetConversionValue();gdadc_flag_clear(gdADC_FLAG_EOC); return ValResult;
}

在main()中ADC测试OK

 ....gdADC_Init();while(1){   delay_ms(1000);adc_value =    gdGet_Adc(gdADC_CHANNEL_0); printf("ADC0= %d\r\n", adc_value);}

总结

以上是个人在学习使用GD32F130项目的一些使用记录,对GD32F1X0系列芯片也可参考,可能还有其他一些未涉及功能没有验证,遇到问题时需要去研读对比两个芯片的手册和例程,待后续再来补充。

GD32F130 使用ST库开发项目相关推荐

  1. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )

    文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...

  2. 可爱的python测试开发库及项目(python测试开发工具库汇总)

    转载: https://www.jianshu.com/p/ea6f7fb69501 可爱的python测试开发库及项目(python测试开发工具库汇总) github地址 相关书籍下载 Python ...

  3. 怎么使用ST的库开发STM32

    摘自:http://blog.chinaunix.net/uid-2595338-id-2139587.html 觉得这篇文章还是不错的,至少讲清了很多初学者不理解的概念,值得推荐! 我使用的芯片是 ...

  4. 几百个Android开源个性化控件、工具库、项目、开发工具快快收藏

    场景 如果之前是学过Java的,那么Android将很好上手. 新手入门,往往不会利用已经开源并实现效果的个性化控件和工具库等. 比如像下面这些控件效果 又比如一些工具库,包括依赖注入框架.图片缓存. ...

  5. [野火]STM32 F103 HAL库开发实战指南笔记之基础总结

    1.本书配套的仿真器为 Fire-Debugger,遵循 ARM 公司的 CMSIS-DAP 标准,支持所有基于 Cortex-M 内核的单片机,常见的 M3.M4 和 M7 都可以完美支持.Fire ...

  6. 推荐一些嵌入式、C/C++的开源库和项目

    前言 想用代码实现一个功能时,我们可以先看看是否有前辈已经实现了该功能,并且开源分享在网上.一般我们自己造出来的轮子的可用性基本上是很难和大神们造的轮子相比的. 因此多了解一下优秀的开源库的使用,可以 ...

  7. angular模块库开发实例

    angular模块库开发实例 随着前端框架的诞生,也会随之出现一些组件库,方便日常业务开发.今天就聊聊angular4组件库开发流程. 下图是button组件的基础文件. nk-button.comp ...

  8. 如何在时间紧迫情况下进行机器学习:构建标记的新闻 数据 库 开发 标记 网站 阅读1629 原文:How we built Tagger News: machine learning on a

    如何在时间紧迫情况下进行机器学习:构建标记的新闻 数据 库 开发 标记 网站 阅读1629  原文:How we built Tagger News: machine learning on a ti ...

  9. 团队在Github上协同开发项目流程

    2019独角兽企业重金招聘Python工程师标准>>> 多用户基于同一个Github上得项目并行开发,当前用户的开发流程: 注: origin:默认的远程主机名 master:默认的 ...

最新文章

  1. 斯坦福iOS7公开课4-6笔记及演示Demo
  2. 图解Detours实例
  3. jsp mysql utf-8 中文乱码_jsp插入mysql数据库显示中文乱码问题
  4. delphi 安卓图片保存数据库_delphi 把图片存入数据库
  5. go分析和kegg分析_干货预警:3分钟搞定GO/KEGG功能富集分析(2)
  6. 阿里开源深度学习框架XDL,面向高维稀疏数据,支持千亿参数训练规模
  7. Python练习题(四)
  8. 频率与振幅的关系图怎么画_手拉手模型怎么画?5步教你分分钟完成模型图
  9. html怎么让字体自动变色,html怎么给字体设置颜色
  10. 模糊神经网络算法matlab,模糊神经网络算法原理
  11. 好消息:GAX/GAT February 2008 Final Release
  12. Centos7 下配置mail使用163邮箱发送邮件
  13. 在利用计算机高级语言进行,2016计算机一级考试多选题专项训练及答案
  14. GBase 8a 集群维护工具C3介绍
  15. actran安装教程linux,Linux平台Actran软件安装
  16. 【源码阅读】SIR-GN: A Fast Structural Iterative Representation Learning Approach For Graph Nodes
  17. oracle收购了什么意思,BEA为何会被Oracle收购?
  18. 白领患上“网聊依赖症”
  19. Ardublock的安装
  20. 如何将下拉框中的值传到后台

热门文章

  1. 获取Class的三种方法
  2. 榆熙电商:拼多多优惠券都有哪些作用?
  3. pyecharts将html转换图片,如何把pyecharts的炫酷延续到PPT里?
  4. 完全零基础,如何系统地学习视频剪辑
  5. UI设计师如何脱颖而出 面试过程中要注意什么
  6. Java毕设项目超市会员积分管理系统计算机(附源码+系统+数据库+LW)
  7. 微信支付报错:用户传入的appid不正确,请联系商户处理
  8. 计算机课怎么考试时间,考研专业课考试时间介绍
  9. 使用备份软件快速备份VMware虚拟机
  10. axios库读不到cookie_axios客户端无法存储cookie