1.软件移植注意事项1.1系统方面的注意事项1.1.1HSE相关内容修改在V3.x的库,启动时间宏定义在xxx32f10x.h头文件中;在V3.0以前的库,其启动时间宏定义在xxx32f10x_rcc.c中(HSEStartUp_TimeOut);修改前://#defineHSE_STARTUP_TIMEOUT((uint16_t)0x0500)/*!TimeoutforHSEstartup*/修改后:#defineHSE_STARTUP_TIMEOUT((uint16_t)0xFFFF)/*!TimeoutforHSEstartup*/修改原因:GD和STM32的晶振部分电路设计有一定的差异,两者对外部高速晶振的参数要求也不一样,修改HSE_STARTUP_TIMEOUT宏定义可以保证晶振正常起振。当然你会在应用中发现有一些应用不修改也能照常跑,这是由于晶振的参数差异造成了,为了保证程序的正常运行还是修改该宏定义。1.1.2代码执行速度方面的修改GD32采用专利技术,提高了相同工作频率下的代码执行速度,带来了高性能的使用体验。这样一些在ST下面编写的程序如While或者是For循环的延时,移植到GD上面来肯定相应的延时会变短。所以如果客户的应用有用到这种延时方法的得根据实际情况进行一定的调整。GD的代码执行速度比ST更快,那么在客户的应用中如果有一些判断的结构不够严谨也可能会导致问题。案例1:客户在软件中编写了一个延时函数如下:voiddelay(void){U8I;For(i=0;i75;i++);}通过实测相同的这一段代码:ST执行该函数的延时时间是7.4usGD执行该函数的延时时间是5.4us。如果客户的应用对时间要求比较严格请不要忽略GD代码执行速度的问题,参数需要做一定的调整。案例2:客户采用IO模拟I2C他的查应答函数的编写如下#defineSDA_Status()GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)VoidCheckACK(void){cAcknowledge=TRUEif(SDA_Status()){cAcknowledge=FalSE;}}客户反馈这段代码在ST上面执行OK,但是在GD上面运行不正常,其实这是由于GD的执行速度更快,ACK信号还出来,语句就已经执行完成了。建议客户修改代码:#defineSDA_Status()GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)VoidCheckACK(void){U8ErrTimer=0;cAcknowledge=TRUEwhile(SDA_Status()){ucErrTime++;if(ucErrTime250){cAcknowledge=FalSE;}}}代码修改后客户的问题得以解决,使用ST没有问题是因为ST的代码执行速度没有GD的快,刚好客户的代码能满足他的应用,换了GD以后由于代码执行速度更快,只能通过更严谨的逻辑来进行代码的移植。1.1.3BOOT管脚注意事项BOOT0及BOOT1管脚在芯片复位时的电平状态决定了复位后从哪个区域开始执行程序。典型情况下,BOOT0需外接10K下拉电阻,就可以从Flash启动。如BOOT0悬空,则不能保证一定从Flash启动。1.1.4低功耗注意事项如果在STOP模式设置低功耗需要将C口和E口也设置成模拟输入,因为GD的MCU内部没有将C口和E口拉至默认的电平,为了实现低功耗只能是增加相关的配置C口和E口模拟输入的语句。1.1.5功耗注意事项MCU上电所有IO口默认是浮空输入,IO口的高低电平会受到外界影响,从而影响MCU的功耗。为了芯片能够获得一致的功耗性能,需要将所有用不到的IO口都配置成模拟输入。1.2GPIO方面说明1.2.1EXTI中断相应异常(128K以下F1系列产品适用)如果EXTI配置好后关闭EXTI,IO有沿跳变,再次打开EXTI时,系统会响应EXTI关闭过程中的外部触发,(小容量存在该问题,大容量没有)。软件可以参考以下例程设置IMR屏蔽寄存器来使能中断(这里以EXTI7为例):使用上升沿触发:{/*ClearRisingFallingedgeconfiguration*/EXTI-RTSR&=~EXTI_Line7;/*ClearEXTIlineconfiguration*/EXTI-IMR|=EXTI_Line7;EXTI-EMR|=EXTI_Line7;/*RisingFallingedge*/EXTI-RTSR|=EXTI_Line7;}使用下降沿触发:{/*ClearRisingFallingedgeconfiguration*/EXTI-FTSR&=~EXTI_Line7;/*ClearEXTIlineconfiguration*/EXTI-IMR|=EXTI_Line7;EXTI-EMR|=EXTI_Line7;/*RisingFallingedge*/EXTI-FTSR|=EXTI_Line7;}使用上升沿和下降沿同时触发:{/*ClearRisingFallingedgeconfiguration*/EXTI-RTSR&=~EXTI_Line7;EXTI-FTSR&=~EXTI_Line7;/*ClearEXTIlineconfiguration*/EXTI-IMR|=EXTI_Line7;EXTI-EMR|=EXTI_Line7;/*RisingFallingedge*/EXTI-RTSR|=EXTI_Line7;EXTI-FTSR|=EXTI_Line7;}1.2.2PA8和低功耗关系(128K及以下F1系列产品适用)PA8管脚如果外接上拉电阻,会导致在standby模式下有较大的漏电流,会增加standby模式下的功耗,但是对stop模式下的功耗无影响。因此如果要获得比较低的功耗。PA8管脚要保持悬空或者是下拉,或者在进入standby模式之前,断开PA8管脚与外部的连接。1.2.3PB1和PB2关系(128K及以下F1系列产品适用)PB1设置成IPUIPDAF_PP,AF_OD四种模式的时候,PB2不受控。为了能正常使用PB2,PB1必须配制成Out_PP,AIN,FLOATING;1.2.4PA8上电状态(128K及以下F1系列产品适用)当PA8设置为输出高电平时,开机的第一次翻转会比ST的慢2.5ms左右,1.3定时器方面的说明1.3.1TIM中断标志位清除问题当TIM的Channel配置成InputCapturemode时,GD32F103readingtheTIMx_CCRx寄存器不会自动清除TIMx_SR寄存器的CCxIF标志,该中断标志位需要软件清除。1.3.2TIM输入捕获/正交编码配置问题有客户反馈使用GD的MCU,用定时器工作在正交编码或者是输入捕获不能工作,同一程序ST的工作正常。检查客户的程序,发现客户编程的时候没有配置定时器的周期,而ST的定时器不配置定时器的周期的话会给出一个默认值,GD不会。在程序中加上配置定时器周期的语句就OK了。TIM_TimeBaseStructure.TIM_Period=0xffff;TIM_TimeBaseStructure.TIM_Prescaler=0;TIM_TimeBaseStructure.TIM_ClockDivision=0;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInit(TIMx,&TIM_TimeBaseStructure);1.4ADC方面的说明1.4.1ADC输入通道模式配置使用GD的MCU的时候,输入通道必须配制成模拟输入的模式GPIO_Mode_AIN,配制成其他模式不能正常工作。1.4.2ADC时钟配置问题使用GD的MCU的时候,需要ADC的采样配置时钟(特别是小容量,一定要配置采样时钟),而且不能大于14MHz。采样周期配置如下:RCC_ADCCLKConfig(RCC_PCLK2_Divx);1.4.3ADC输入阻抗和采样周期选择从ST移植到GD,使用到ADC的话需要根据具体情况相应的修改采样周期。具体参数见下表:STM32GD321.4.4ADC_CR2中的ADON使用方法(128K及以下F1系列产品适用)当ADON=0时写入1后,需要等待一段时间t_WAIT,才能进行后续操作。t_WAIT的计算公式如下:t_WAIT≥14×t_ADCClk。参见AN003文档Section2.2。1.4.5ADC_SR中的EOC标志位使用(128K及以下F1系列产品适用)GD32F103/101系列Flash128KB及以下的型号,在ADC的Regulargroup或Injectedgroup转换完成时,由硬件自动置1;由软件写入0清除该位。参见AN003文档Section3。1.4.6ADC采集三角波问题ADC采集三角波会出现横向偏移软件上去除软件校准,GD出厂的时候已经校准过。1.4.7非5V耐受管脚电压输入问题大容量的ADC如果在非5V的IO口上串入了高于3.3V的电压,内部温度传感器采样值全为0XFFF;同时DAC也存在这个现象。小容量不会出现采样值为0XFFF的情况;2.5SDIO方面的说明2.5.1SDIODAT3PIN的在1bitbusmode下的问题。SDIO在1bitbusmode下,DAT3pin是低电平,这样会导致SDCard进入SPI模式。建议在SDIO使能之前,先把SDIODAT3pin配置成GPIOOUTPUTHigh或者input功能,使SDIODAT3pin保持高电平即可。1.6RTC方面的说明1.6.1RTC硬件方面问题GD的RTC正常使用起来和ST的没有差别,但是客户使用的过程中经常会在设计硬件的时候增加一个电阻或者是不加电容等问题,所以关于RTC方面的设计请严格参照下面的原理图:1.7SPI方面的说明1.7.1CLK线重复配置客户反馈当SPI处于主模式下,重复配置SPI的CLK线会引起内部计数器紊乱:问题代码:GPIO-CRL&=0x000fffff;GPIO-CRL|=0xBBB00000;上面这段代码是执行SPI口的IO初始化,调用两次后会使CLK上面产生一个脉冲。引起内部计数器出错,ST的在SPI再次初始化的时候会将内部计数器清零,GD不会将内部计数器清零。修改办法:vu32temp;temp=GPIOA-CFL;temp&=0x000fffff;temp|=0xbbb00000;GPIOA-CRL=temp;先进行运算再去进行赋值,内部的SPI计数器就不会因为CLK数据的变化引起误操作。1.7.2SPI通信BSY标志位在SPI程序编写的过程中,轮询使用BSY作为检测标志位,传送数据丢失或者是错误。这是因为GD的BSY标志位不是在写入DR后就置位的,而是有很小的一个延时后才置起的。传输过程中不要使用BSY作为每次传输的判断,使用TXE和RXNE来进行判断。1.7.3SPI控制寄存器1(SPI_CR1)配置流程客户如果从低到高一位一位配置该寄存器会出现MODF的错误,经过排查是由于GD的MCU在SPE使能之前就开始检测是否有模式错误,而ST是在SPE使能之后,所以在MSTR写1之前要保证模式正确。SSM为0时保证外接高电平或者SSM和SSI都写1或者是把SSOE打开。130\150没有该问题.案例:BIDIMODE=0;RXONLY=0;MSTR=1;DFF=0;CPOL=0;CPHA=0;SSM=1;SSOE=1;TXEIE=1;BR=2;LSBFIRST=0;CRCPOLY=7;SPE=1;这个顺序在ST上正常,在GD上出现MODF错误,解决的话可以将整个寄存器一次写入,也可调整初始化顺序,同时加上SSI的配置。1.7.4SPICLK时钟线配置小容量的产品,从机模式下CK线需要将IO配置成Input_floating,才