实例介绍
GD32的性价比和稳定性都很高。我更喜欢用GD32.。但不是100%兼容的。需要注意一些细节。
2.内部 Flash 1)芯片设置读保护用法 描述由于GD的Fash是自己的专利技术,STM的Fash是第三方提供的,所以GD 的 Flash和STM的Fash有些许差异。GD的擦除时间会长一点 解决方法在写完KEY序列以后,需要读该位,确认key已生效。 所以,这里应该插入 While(! (FLASH->CR &0x200);//Wait OPTWRE 或可简单插入两个NOP NOPO NOPO 在ST库中,只有 FLASH Status FLaSH Erase Option Bytes(void) FLaSH Status FlaSH ProgramOption Byte Data(uint32 t Address, uint8 t Data FLASH Status FLASH_ Enable WriteProtectionuint32 t FLASH Pages FLASH Status FLASH ReadOutProtection (Functional State New State) 四个函数需要修改。 2)IAP在应用中编程 描述GD32由于有fash的0访问时序,同SM32在Fash的Ease和 Program上 存在差别,GD32的 Erase和 Program时间比STM32的稍微长些建议对 Erase 和 Progran时间进行修改 解决方法将宏定义 井 define erase timeout (luint32 t)OX000B000O) #define ProgramTimeout (uint32_t)ox00002000 修改为: #define erasetimeout ((uint32_t)OX00OFFFFF #define ProgramTimeout (uint32 t)OxOOOOFFFF 备注: Erase和 Program时间宏定义在stm3210 x flash. c源文件中 路径:\ braies\STM32F10 x Std Periph Driver\sr) 3)用IAR下载配置 解决方法在批量牛产的时候首先会烧写一个USB的boot,这个boot自动运行后在由上 位机软件进行烧写应用程序。如果boot程序不能自动运行则需要重新插拔 次电源。给生产造成一些麻烦。产生不能自动运行程序的原因是如果程序设置 读保护的话需要等待 FLASH CR的第9[ OPTWRE]位为1.如果没有置位的话继续 执行就会出错。由」ST的执行速度慢,程序执行到读 FLASH CR寄存器的时候 该位已经置1,GD的执行速度比较快,程序运行到这的时候该位还没置1,因 此需要在 FLASH ReadOut Protection函数里面添加一些轮询该位为1或者加 延时 3.ISP烧写软件 1)ISP烧写,建议使用官方烧写软件 性述 芯片内部同有区别 解决方法建以到 下载最新版本的 另外 也有专门的 烧写软件( 可以到 论坛下毂 如果使用自制的软件或脱机编程器,实现和完全兼容,建议修改 以下参数。 页擦除等待超时时间增加至 整片擦除等待超时时间增加至左 右 字编程等待超时时间增加至,臾编程等笭超时时间增加至 I/0日 1)I0口外部中断使用方法 措述 在关闭期间,如果外部引脚有电平的变化,在使用MR打开中断后会马上进 入中断服务程序。理论是打开中断前,不管管脚是否有电平的变化,都不会影 响到打开后的中断响应。 解决方法所以解决方法就是通过禁用上升沿或者下降沿检测寄存器来开关中断,不能使 用IMR屏蔽奇存器。程序如下 关闭沿检测,以达到关闭中断的 目的,下降沿使用 寄存器,上升沿使用 寄存器 2)在待机模式,PA8引脚特殊设置 描述 在使用低功耗的情况下,PA8会被MCU在内部被设置为地 PA8复用为MU内部频率输出,超低功耗设时需要悬空 解决方法在待机模式,PA8悬空不用 3)低功耗下必须注意 描述 在使用低功耗情况下,把软件全部端口(AF)时钟关掉,无论是否有该端凵。 4)当有脉冲群冲击管脚 摧述 需要在在进入中断后关闭中断 4.定时器 1)定时器输入捕获模式需要软件清中断 描述 sTM定吋时器输入捕获模式默认能硬件清中断,GD为了更加严格要求配置,需 要做软件清中断 解决方法软件清除标志位 2)定时器向上脉冲计数模式设置 述 定时器的用法差异 解决方法脉冲计数模式下,装载值必须设置为比预期值大,否则不计数 在ST上如果重载值不设置(初始为0)的时候,CNT可以正常计数。 在GD上如果重载值不设置保持初始为0的时候,会因为重载值为零,即便是 来一个脉冲也会导致所有的寄存器复位从而不能正常计数。 型号GD32F1系列MCUF|ah256B8及以上的型号) 3)TIM、ADC模块 描述Tmer、ADC模块的触发信号宽度要求 解决方法|由于内部有高速和低速两条外围总线,Tmer、ADC模块和其他外设共同使用 这两个总线。GD32F103/101系列Fash128KB及以下的型号, Timer、ADC等 模块识別触发信号的条件是触发信号宽度大于模块所在总线的时钟宽度 5.串口 USART 1) USART连续发送数据字节有空闲位 带述 字节间有空闲位 解决方法|对于一般的通讯米说,不会有影响,只对于一般在通讯上有特殊协议的,才会 产生数据不准确的情况 所以,特定情况,修改程序 6.I2C总线 1)硬件L2C特殊配置 述GD的C相对STM的来说要少一个标志位 解决、宏地址定义改交 方法 2、硬件I2C在会在向从机发送7bits地址完成后,从札还没来得及识别。(看客户 应用) 我们可以在发送完7bits后加个延时,让从机完全识别 I2C Send7bitAddress(I2C1, EEPROM ADDRESS, I2C Direction Transmitter int Offf hile(i -- 3、检测ADDR不能使用I2 C Checkevent函数,因为他会清除ADR,可以使用 I2 C Get FlagStatus函数 就是把 while(! I2C CheckEvent(I2C1 I2C EVENT MASTER TRANSMITTER MODE SELECTED)) Ey while(! I2C GetFlagStatus(I2C1, I2C FLAG ADDR)) 4、还有个关于编程步骤的严谨性,跟STW想比,我们是先 Clcar ack,再 Clear Arrd。 7.ADC采集 1)ADC采样设置 述ADC启动 解决方法|分三个方面 时写入后,需要等待一段时间 ,如果用库的话 就在 ADC CMD后面加20us左右的延付 如果采用中断获得采样数据后,需要软件清除中断。 8. SDio 1) SDIO DAT3pin的在1 bit bus mode和4 bit bus mode下的配置 摧述 1、SD|O在1 bit bus mode下,DAT3pin是低电平,这样会导致 SD Card进 入SP!模式。 原因:初始化失败的原因主要是因为GD32的芯片SDO的DAT3∏存在 BUG 2、在4位模式下,通过上面的方法,程序能止常初始化,但不能正常读写SD 卡 原因:因为DAT3∏在前面已经配置成推挽输出,所以在4位模式下,不 危正常读下。 在调用4位模式前,把DAT3的端凵配置成复用推挽输入即可解决问题 解决方法「1、1 bit bus mode的解决方法:建议在使能之前,先把 配置成推挽输出,)且要置成高电平,使 保持高电 平即可 2、4 bit bus mode的解决方法:在调用4位模式前,把DAT3的端口配置成 复用输出即可解决问题。 2)程序在刚烧完后能正常读写SD卡,断电再上电后,SD卡初始化失败,需要手动 复位一次后才正常 描述 在某些SD卡中,GD32断电再上电,会引起SD卡上的时钟信号不正常,导致 SD卡发送命令失败。 解决方法在程序中,打开时钟后,增加一小段延时,以保证下时钟信号稳定。 这个延时添加的地方:在 即 的配置文件中,然后在 这个函数中找到 就在这个后面加个延时。 10. USB A, USB OTG 1)客户使用 的原工程时需要注意几点 解|1、在 中,增加如下图红色字体语句 for (1=0; 18; i++) EPli= GetEndPoiNT(i) for(i=0:i<8;i-+) 法 SetEnDPoinT (i, EP[i] &0x7070) 2、在 中,按照下图红色字体语句进行修改 defined(STM32L 1XX MD) defined(STM32L1XX HD)II defined (STM32L1XX MD PLUS) tdefine INTErn FLASH SECTOR ERASE TIME 100 tdefine INtern FLaSH SectoR WritE time 104 #define intern flash sector erase time 100 #define intern FLasH SeCtor WRITE Time 100 把固件库中的 使用附件的进行替换。 4、软件进行读保护位时需要选使用 FLASH Unlock;函数 2)部分UsB兼容性 解|1.部分U盘有3个端点,数组越界导致 Itf Desc被清空,所以主机不能识别设各 决 类型。 USBH con.h文件的 USBH MAX NUM ENDPOINTS的定义由2改成3就可以了 法|将:# define USBH MAX Num endpoints 改为:# define USBH mAX NUM endpoints 2.在In端点中断处理程序USB0TGUS班 handle hc n In isr中,对于NAK中断, V1.0.0版本的处理如下 else if(hcint b nak f(hcchar. b. eptype == EP TYPE_INTR UNMASK HOST INT CHH (num) USB OTG HC Halt(pdev, num CLEAR HC INT(hcreg, nak) else if ((hcchar b eptype = EP TYPE CTRL) (hcchar b eptype = EP TYPE BULK)) *k re-activate the channel * hcchar, b chen 1 hcchar. b. chdis USB OTG WRITE REG32 &pdey->regs. HC REGS [num]->HCCHAR, hcchar d3 2) pdev->host hc Status =HC NAK 而V2.1.0版本的NAK处理过程如下 else if (hcint b nak) if(hcchar b. eptype = EP TYPE_ INTR) UNMASK HOST INT CHH(num) USB OTG HC Halt(pdev, num else if ((hcchar. b. eptype = EP TYPE CTRL) (hcchar b eptype = EP_ TYPE BULK)) A re-activate the channel * hcchar, b chen =1 hcchar b chris =0 USB OTG WRITE REG32(&pdev->regs. HC REGS [num]->HCCHAR, hcchar d32) pdey->host HC Status [num]=HC_NAK CLEAR HC INT(hcreg, nak) 唯一的区别就是 CLEAR HC INT( here,nak)的位置,在Ⅵ1.0.0版本中对于CTRL和 BUK端点的NAK中断没有清除NAK,我们的芯片会因此产生多次IN传输的请求,导 致数据传输错误。改为V2.1.1的写法后传输正常。(注意 HC Status在V2.1.0是数 组,在Ⅵ1.0.0是单个数据,直接拷贝的话要去掉后面的[num]) B.USB外设的工作频率有限制 摧述 有最低工作频率的要求,也就是APB1分频后的时钟必须大于12MHz,比如 HCLK为56MHz,APB1的最大分频系数为4,56/4=14MHz,可以正常工作。 11 SPI 1)输入与输出配置要求(STM32不需要如此要求) 解决丨GD32在使用SP时,o的配置必须严格遵守主从模式下的输入与输出配置,而 方法STM32无此要求,相关代码如下 主机模式下|o配置(主机以SP为例): GPIO InitStructure gPio Mode gPio Mode af pl GPIO_ Init Structure GPIo Speed GPlO Speed 50MHz GPIO InitStructure. GPio Pin= GPlO Pin 5 GPIO Pin_ 7; GPIO Init(GPIOA, &GPIO Initstructure GPio Init Structure gPio Mode gPio Mode IN floating: GPio InitStructure gpio Pin gpio pin 6 GPIO Init(GPIOA, &GPIO InitStructure) 从机模式下o配置(从机以SP2为例) GPIo Init Structure GPio Mode gPlo Mode IN Floating GPIO InitStructure GPIO Speed= GPl Speed 50MHz GPIO_InitStructure GPIO_ Pin GPIO Pin_13 GPIO_ Pin_15 GPIO Init(GPIOB, &GPIO InitStructure) gPio Initstructure gpio mode gpio mode af pp. GPIO InitStructure. GPio Pin= GPIo Pin 14: GPIO_Init(GPIOB, &GPIO_Initstructure); 3)在GD32的SP的时钟信号,空闲状态需要配置成高电平,以保证数据的稳定性, 具体代码如下:红色字体代码 解决 SPI_ InitStructure SPl Direction =SPI_ Direction_ 2Lines fullDuplex; 方法 SPI InitStructure SPl Mode SPi Mode master. SPI Initstructure SPl Data Size= SPl Data Size 8b SPlInitStructure SPl_CPOL= SPI CPOL High SPl Initstructure SPl CPHA= SPI CPHA 2Edge SPI InitStructure SPI NSS= SPI NSS Soft SPI InitStructure SPl BaudRate Prescaler =SPI Baud Rate Prescaler 256: SPI Initstructure, Spi FirstBit= SPI FirstBit MSB SPI InitStructure SPl CRCPolynomial =7; SPl Init(sPl1, &SPl Initstructure); 4)当作为从机时,在GD32中,时钟信号必须为8的整数倍。 例如:红色字体代码 解决 SPI_InitStructure SPl_ Direction =SPl_ Direction_ 2Lines_ Full Duplex; 方法 SPI InitStructure. SPl Mode= SPl Mode Master SPI InitStructure SP SPi Data Size 8 SPl InitStructure SPl CPOL= SPI CPOL High; SPI Init Structure. SPl CPHA SPI CPHA_ 2Edge SPI Initstructure SPl NSS= SPI NSs Soft SPI Initstructure Spl BaudRatePrescaler= SPl BaudRatePrescaler 256 SPI InitStructure. SPl FirstBit= SPl First Bit MSB SPl Initstructure SPl CRCPolynomial =7; SPI Init(SPI1, &SPl InitStructure) 5)在GD32中,不能使用SPLS_FLAG_BSY该位来判断SP总线数据是否接收或发送 完成 12.看门狗 1)进入SToP模式前打开看门狗,通过RTc的ALR唤醒后,程序会不断被复位的现像 摧述 WDG内部有个 Reload信号,KEY奇器写AAA会使其拉高,过段时间自 动拉低。在拉底之前进入STOP状态会使 Reload信号一直为高,等到退出SToP 后也保持为高,之后再写AAAA没有办法让 Reload产生上升沿,也就没办法更 新计数器了 解决方法「进STOP之前不要 Reload,也可以调整下程序的顺序,把WwDG的配置放到RIC 配置之前,效果是一样的。 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论