发新帖我要提问
12
返回列表
打印

GD32 介绍与 STM32 兼容性汇总

[复制链接]
楼主: wangjiahao88
手机看帖
扫描二维码
随时随地手机跟帖
21
wangjiahao88|  楼主 | 2017-6-2 17:11 | 只看该作者 回帖奖励 |倒序浏览
10.  USB
A. USB_OTG
1)  客户使用 STM32 的 的 DFU  原工程时需要注意几点




1 1 、 在 在 usb_istr.c  中 , 增加如下图红色字体语句
for (i=0;i<8;i++) EP[i] = _GetENDPOINT(i);
for (i=0;i<8;i++)
_SetENDPOINT (i, EP[i] & 0x7070);
2 2 、 在 在 usb_conf.h  中 , 按照下图红色字体语句 进行修改
#if  defined(STM32L1XX_MD)  ||  defined(STM32L1XX_HD)||
defined(STM32L1XX_MD_PLUS)
#define INTERN_FLASH_SECTOR_ERASE_TIME 100
#define INTERN_FLASH_SECTOR_WRITE_TIME 104
#else
#define INTERN_FLASH_SECTOR_ERASE_TIME 100
#defin e INTERN_FLASH_SECTOR_WRITE_TIME 100
3 、  把固件库中的 stm32f10x_flash.c  使用附件的进行替换 。
4 4 、  软件进行读保护位时需要选使用  FLASH_Unlock(); 函数
int main(void)
{
#if defined (USE_STM32L152D_EVAL)
FLASH_Unlock();
FLASH_ClearFlag(FLASH_FLAG_OPTVERRUSR);
#endif
FLASH_Unlock();
FLASH_ReadOutProtection(ENABLE);
FLASH_Lock();
2)  部分 USB  兼容性




1.  部分 U U  盘有 3 3  个端点 , 数组越界导致 c Itf_Desc  被清空 , 所以主机不能识别设备
类型。 。h USBH_conf.h  文件的 S USBH_MAX_NUM_ENDPOINTS  的定义由 2 2  改成 3 3  就可以了
将 : #define USBH_ MAX_NUM_ENDPOINTS 2 2
改为 : #define USBH_MAX_NUM_ENDPOINTS 3 3
2. 在 在 n In  端点中断处理程序 R USB_OTG_USBH_handle_hc_n_In_ISR  中 , 对于 K NAK  中断 ,
0 V1.0.0  版本的处理如下 :
else if (hcint.b.nak)
{
if(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))
{ {
/* re- - activate the channel */
hcchar.b.chen = 1;
hcchar.b.chdis = 0;
USB_OTG_WRITE_REG3 2(&pdev- - >regs.HC_REGS[num]- - >HCCHAR, hcchar.d32);
} }
pdev- - >host.HC_Status = HC_NAK;
} }
而 0 V2.1.0  版本的 K 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))
{ {
/* re- - activate the channel */
hcchar.b.chen = 1;
hcchar.b.chdis = 0;
USB_OTG_WRITE_REG32(&pdev- - >regs.HC_REGS[num]- - >HCCH AR, hcchar.d32);
} }
pdev- - >host.HC_Status[num] = HC_NAK;
CLEAR_HC_INT(hcreg , nak);
} }
唯一的区别就是  CLEAR_HC_INT(hcreg , nak) 的位置 ,在 在 0 V1.0.0  版本中对于 L CTRL  和
K BULK  端点的 K NAK  中断没有清除  NAK , 我们的芯片会因此产生多次 N IN  传输的请求 , 导
致数据传输错 误 。 改为 1 V2.1.1  的写法后传输正常 。( ( 注意 s HC_Status 在 在 0 V2.1.0  是数
组 ,在 在 0 V1.0.0  是单个数据 , 直接拷贝的话要去掉后面的 [num] )
B.  USB  外设的工作频率有限制
描述  有最低工作频率的要求,也就是 APB1 分频后的时钟必须大于 12MHz,比如
HCLK 为 56MHz,APB1 的最大分频系数为 4,56/4 = 14MHz,可以正常工作。

使用特权

评论回复
22
wangjiahao88|  楼主 | 2017-6-2 17:12 | 只看该作者
11. SPI
1)  输入与输出配置要求 (STM32  不需要如此要求 )
解 决
方法
GD32 在使用 SPI 时,IO 的配置必须严格遵守主从模式下的输入与输出配置,而
STM32 无此要求,相关代码如下:
主机模式下 IO  配置 ( 主机以 SPI  为例 ):
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_7;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOA,&GPIO_InitStructure);
从机模式下 IO  配置 ( 从机以 SPI2  为例 ):
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_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);

使用特权

评论回复
23
wangjiahao88|  楼主 | 2017-6-2 17:22 | 只看该作者
3) 在 在 GD32 的 的 SPI  的时钟信号 , 空闲状态需要配置成高电平 , 以保证数据的稳定性 ,
具体代码如下 : 红色字体代码
解 决
方法
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);

使用特权

评论回复
24
wangjiahao88|  楼主 | 2017-6-2 17:22 | 只看该作者
4)  当作为从机时 ,在 在 GD32  中 , 时钟信号必须为 8  的整数倍 。
例如 : 红色字体代码
解 决
方法
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
5) 在 在 GD32  中, , 不能使用 SPI_I2S_FLAG_BSY  该位来判断 SPI  总线数据是否接收或发送
完成

使用特权

评论回复
25
wangjiahao88|  楼主 | 2017-6-2 17:23 | 只看该作者
12.  看门狗
1)  进入 STOP  模式前打开看门狗 , 通过 RTC 的 的 ALR  唤醒后 , 程序会不断被复位的现像
描述  IWDG 内部有个 Reload 信号,KEY 寄存器写 AAAA 会使其拉高,过一段时间自
动拉低。在拉底之前进入 STOP 状态会使 Reload 信号一直为高,等到退出 STOP
后也保持为高,之后再写 AAAA 没有办法让 Reload 产生上升沿,也就没办法更
新计数器了。
解决方法  进 STOP 之前不要 Reload,也可以调整下程序的顺序,把 IWDG 的配置放到 RTC
配置之前,效果是一样的。

使用特权

评论回复
26
tomyoct| | 2017-6-15 15:09 | 只看该作者
这是以前的GD版本,现在的GD都慢慢有自己的特色,都不屑于模仿了。

使用特权

评论回复
27
magicoctoy| | 2017-6-15 15:14 | 只看该作者
到M4的芯片,就必须用自己的库了,用STM32的库无法搞定了。

使用特权

评论回复
28
myidear| | 2017-6-17 19:18 | 只看该作者
型号命名方式 : 完全相同
仅仅针对于F10x的型号,后面的命名就不能混在一起了。

使用特权

评论回复
29
gaoxiansheng| | 2017-6-17 19:28 | 只看该作者
GD32现在在国产的MCU芯片来说,做的是最好的了。

使用特权

评论回复
30
壹家芯| | 2017-8-9 17:50 | 只看该作者
谢谢分享

使用特权

评论回复
31
wangjiahao88|  楼主 | 2017-8-16 14:05 | 只看该作者
请问 STM32F103VCT6 可以用哪个来代替呢》

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则