提要:costdown

前言:本以为能很顺利的移植,结果130这颗芯片虽然是M3的core,实际上外部PIN与GPIO等寄存器结构与M0一致,NVIC部分又与M3一致,简言之,130即有M3的“基因”,也有M0的“基因”,主要这颗芯片是为了与ST的M0芯片抢市场。由于刚上市,所以Library从ST M0的Library基础稍作修改。寄存器名称虽然不一样,但是实际地址与功能是完全一样。下面重点列出在移植过程中,我遇到的问题:

A0:在Keil中,Device选型:

A0:GD32f130c6应当选择STM32F101C6/8,因为该系列寄存器与GD130最接近。左图为100,右图为101,实际130的SPI包含I2SCFGR与I2SPR寄存器。

另外使用STLINK读取的Device,如图:

Q1、EXTI中断无效?

A1:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
SYSCFG_EXTILineConfig(PWR_EXTI_PORT_SOURCE, PWR_EXTI_PIN_SOURCE);

其中在操作SYSCFG寄存器时,必须先使能SYSCFG的CLK,这个问题在M0上也是一样的,但是我在移植过程中,忽略了这点。

导致花了一些时间才找到这个问题。找类似这种bug,两方面着手,一用硬件仿真,看外设寄存器是否与预设一直;二设置完后直接串口打印出来。

Q2、NVIC配置部分需要增加下面两句,M0无此配置,M3则有。

A2:

/* NVIC configuration for priority grouping */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
/*定位中断向量表*/
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0); 

另外中断优先级配置因为有组的概念,所以也有所不同,如;

STM32F051:

<span style="font-family: Arial, Helvetica, sans-serif;">NVIC_InitStructure.NVIC_IRQChannelPriority = 0x03;  //0x03,与IRRec保持一致</span>

GD130:

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;

Q3、EXTI在handler mode进入stop mode后不能唤醒,在thread mode中进入可以唤醒?

A3:

如果在Handler mode进入STOP mode,需要唤醒,则唤醒源的中断优先级必须必进入stop mode的handler 优先级更高。否则同级或更低级的中断无法唤醒,除非退出中断。这也是在thread mode进入可以被唤醒的原因。如在timer2中进入stopmode,在exti按键唤醒。demo:

static void PWR_NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;/* Enable the EXTIx global Interrupt */NVIC_InitStructure.NVIC_IRQChannel = PWR_EXTI_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}static void TIM2_NVIC_Configuration(void)
{ NVIC_InitTypeDef NVIC_InitStructure;/* Enable the TIM global Interrupt */NVIC_InitStructure.NVIC_IRQChannel = KEY_TIM_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}  

Q4:SPI寄存器区别:

A4:SPIx_CR1 Bit11,051中该bit(CRCL)是CRC length,130是FF16(FF16)是data frame formate;

SPIx_CR2 bit15-bit8,130中高8位为保留字节,051则有其他定义,如fifo触发值与data size。因此130中没有该库函数:

    SPI_RxFIFOThresholdConfig(LT8900SPI, SPI_RxFIFOThreshold_QF);  //8bitsize->QF,16bit->HF  

通讯库函数区别:

M0:

/* Send byte through the SPI1 peripheral */
SPI_SendData8(LT8900SPI, *pu32Data);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(LT8900SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_ReceiveData8(LT8900SPI);

GD130:

/* Send byte through the SPI1 peripheral */
SPI_I2S_SendData(LT8900SPI, *pu32Data);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(LT8900SPI, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(LT8900SPI);

Q5:使用HSE时,有效采样数的区别:

A5:

ST
#define HSE_STARTUP_TIMEOUT   ((uint16_t)0x0500) /*!< Time out for HSE start up */
GD130:
#define HSE_STARTUP_TIMEOUT   ((uint16_t)0x5000) /*!< Time out for HSE start up */

Q6:中断向量表区别,GD兼容051,但又涵盖M3的中断入口。另外051不支持自定义中断入口偏移地址。

A6:

 /* 自动重定位中断向量表 */
//  NVIC_SetVectorTable(NVIC_VectTab_FLASH, (BaseOfROM - NVIC_VectTab_FLASH));   //CM0不支持该功能    

Q7:GPIO区别:

A7:虽然130为M3,但是GPIO部分与M0的寄存器结构完全一致。

Q8:Flash区别:

A8:虽然130为M3,但是Flash部分与M0结构大概相同,包含对OB区域的读写与读保护等级,多了一个烧断功能,此时不能还原为保护或无保护状态。

加读保护功能与M0一致,在使用JLink Flash中使用去除读保护是,device必须选择STM32F101系列,否则去除保护功能无效。

但有部分寄存器位有所不同,如:

    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY; //M3不支持该设置

Q9:RCC区别:

A9:M0中只有APB总线给外设提供CLK,但是M3中分了两组不同的CLK对应不同的外设,分别为APB1,APB2。如下:

M0:

   uint32_t SYSCLK_Frequency;uint32_t HCLK_Frequency;uint32_t PCLK_Frequency;uint32_t ADCCLK_Frequency;/* PCLK = HCLK */
   RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

GD130:

  uint32_t SYSCLK_Frequency;  /*!< returns SYSCLK clock frequency expressed in Hz */uint32_t HCLK_Frequency;    /*!< returns HCLK clock frequency expressed in Hz */uint32_t PCLK1_Frequency;   /*!< returns PCLK1 clock frequency expressed in Hz */uint32_t PCLK2_Frequency;   /*!< returns PCLK2 clock frequency expressed in Hz */uint32_t ADCCLK_Frequency;  /*!< returns ADCCLK clock frequency expressed in Hz <span style="font-family: Arial, Helvetica, sans-serif;">  </span>
<span style="font-family: Arial, Helvetica, sans-serif;">
</span>
   /* PCLK2 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE2_DIV1;    /* PCLK1 = HCLK */RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV1;

Q10:ID读取位置:

Flashsize位置不同,130与M3一致,但UID却与M0一致。如:

M0:

#define rFlashSizeReg    (*((uint16_t *)(0x1ffff7cc)))
#define Stm32_UIDBase   (uint8_t *)(0x1ffff7ac)

GD130:

#define rFlashSizeReg    (*((uint16_t *)(0x1ffff7e0)))
#define Stm32_UIDBase   (uint8_t *)(0x1ffff7ac)

Q11:电源特性区别:

A11:

(1)工作电压2.6-3.6V,待机时电流为250uA;;
(2)由于mcu启动功耗大于st,因此mcu稳压电容验证将1uF改为47uF,解决上电瞬间电流过大,电源特性不稳定,电压输出被拉低至2V被强制关机问题;

如下图:

(1)进入stopmode休眠后,sensorpwr关闭,中断唤醒后启动,下图为电源端与sensorpwr端电压图形。GD32端稳压电容为1uF。

           同样由于上电瞬间电压不稳导致无法启动芯片,区别图(3)。

(2)进入stopmode休眠后,sensorpwr关闭,中断唤醒后启动,下图为电源端与sensorpwr端电压图形。STM32端稳压电容为1uF。

3、GD130睡眠后被外部中断唤醒的SensorPwr,SensorPwr端加47uF稳压电容,可以正常启动,但是睡眠后唤醒会出现电压过低关机的现象。

(4)进入stopmode休眠后,sensorpwr关闭,中断唤醒后启动,下图为电源端与sensorpwr端电压图形。GD32端稳压电容为47uF,Sensor端为1uF电容。

综上,由于GD32启动电压较ST高0.6V,导致开机或休眠被唤醒瞬间电压不稳导致关机,图中多次启动是因为按键开关抖动导致多次触发。

(5)待机功耗,如图:


STM32F05x移植GD32F1x0注意事项相关推荐

  1. 转载】将32位代码向64位平台移植的注意事项

    转载]将32位代码向64位平台移植的注意事项 新近的64位平台在二进制上与32位应用程序兼容,这意味着可以非常简单地移植现有的程序.许多目前在32位平台上运行良好的程序也许不必移植,除非程序有以下要求 ...

  2. MPU6050使用/正点原子代码移植/MPU6050注意事项/关于几个频率的解释/STM32F103

    关于MPU6050 MPU6050简单介绍 对于各位接触到MPU6050的同学们来说,应该不缺MPU6050的参考资料, 其中有一篇<MPU-6000 / MPU-6050 产品说明书>- ...

  3. linux移植过程注意事项,linux移植过程的错误记录

    1.Kernel panic - not syncing: Attempted to kill init! [原因]:内核和文件系统编译时选用的配置不一致:一般是文件系统启用了ARM EABI,但内核 ...

  4. uboot和Linux内核移植

    这篇文章是一个读者昨晚发给我的,文章很长,里面的细节也比较多,但是微信公众号只能发 50000 字的文章,如果想阅读全文. 请发送「 uboot和Linux内核移植 」到公众号后台获取下载链接. 这篇 ...

  5. uboot移植——启动内核

    文章目录 1. uboot和内核到底是什么 1.1 uboot是一个裸机程序 1.2内核本身也是一个"裸机程序" 1.3部署在SD卡中特定分区内 1.4运行时必须先加载到DDR中链 ...

  6. linux模块移植到freertos,FATFS在嵌入式操作系统FreeRTOS中的移植与应用

    摘 要: FreeRTOS作为一款免费的实时操作系统,系统内核小.裁剪方便.移植性好,广泛应用于对成本敏感的小型嵌入式系统中,但是FreeRTOS本身不带文件管理功能,不便于很多需要经常进行文件存储与 ...

  7. 2021-09-14 uboot移植开发

    引言:最近要改动uboot,实现像微软PC上,u盘一键刷机或手机上安全模式下刷机的操作 专门去好好研究了点uboot的启动过程:以下为总结: 嵌入式系统                         ...

  8. UBOOT启动内核过程

    1.摘要 (1).启动4步骤 第一步:将内核搬移到DDR中 第二步:校验内核格式.CRC等 第三步:准备传参 第四步:跳转执行内核 (2).涉及到的主要函数是:do_bootm和do_bootm_li ...

  9. MogDB秘籍 之 乾坤大挪移

    MogDB秘籍 之 乾坤大挪移 引子 前文"MogDB企业应用 之 七种武器"介绍了MogDB客户端七种驱动,文章末尾提到"除了武器之外MogDB的一些拳脚功夫" ...

最新文章

  1. PIG 中COGROUP中的空值验证
  2. mysql f参数_MySQL 数据类型
  3. nginx日志切割定时执行脚本
  4. Android JNI 使用的数据结构JNINativeMethod详解
  5. 虚函数与纯虚函数的区别
  6. (27)TLB番外篇——ShadowWalker
  7. pytorch如何计算导数_Pytorch的自动求导机制与使用方法(一)
  8. gitolite 踩坑记
  9. 高质量c/c++编程(9)
  10. 我的JavaWeb学习2
  11. c语言基础知识孙小红,基于J2EE的C语言在线学习系统的设计与实现
  12. oa办公系统文件存取错误_出现文件存取错误解决方法
  13. 李宏毅机器学习——循环神经网络(一)
  14. 前端cookie详解
  15. 生物信息学数据库资源 {#database}
  16. OpenCV:minMaxLoc vs minMaxIdx
  17. android,键盘遮挡了输入框,完美解决android键盘遮挡问题
  18. 【迁移学习】深度域自适应网络DANN在EEG睡眠质量检测上的应用
  19. Egret QQ玩一玩适配【踩坑日记】
  20. PyQt6中的第一个程序

热门文章

  1. java案例之制作系统
  2. 【彻底解决】谷歌或Edge浏览器登录谷歌账户提示浏览器不安全请重新登录
  3. 揭秘udesk智能质检:质检+分析双剑合璧
  4. pytorch训练网络冻结某些层
  5. docker容器里无法使用vi命令
  6. dockers安装redis
  7. 消防工程师答题做试题模拟真题微信小程序,margin:25px 50px 75px 100px;
  8. BI Publisher rtf模板页眉页脚
  9. FCRA部分考试题目及答案
  10. 《大明王朝》以牺牲换来大义