GD32F103C8T6 – GD32 using cubeMX & sw4stm32

Tested by 老高 ,全程使用 cubeMX生成stm32 库,无修正,无需代换到GD32库。

cost down还要down一直down ,价格只有 同型号stm32的一半不到。

中国心大战美国心,價格一直继续down下去就对了,大家有福了啦

「stm32f103c8t6 pin」的圖片搜尋結果

与 stm32f103c8t6 脚位完全相同  。

PIN脚注意事项 :

  • all VDD & VSS  /  VDDA & VSSA  must connect to VCC and GND ! 
  • if not using HSE & LSE -> OSN_IN  & OSN_OUT –> 10K –> GND 
  • boot0 –>10K–> GND (if  want to use UARTto flash –>  boot0 –> 10K –> VDD)
  • SWDIO & SWCLK  :  with 10K  pull-up to VDD

先测HSI 


焊接好了,实验时要特别注意,因為此封裝LQF48脚位很细,间距只有0.2mm ,所以即使焊好了,但有时候脚位跟焊盘有虚焊的现象,若是觉得程序动作不正常,有可能是脚位没接好的问题,可重新检查脚位或是再捕焊好。

使用 cubeMX 设定为 stm32F103C8T6 , generate code 之后,到sw4wtm32 build –> download  –> 不成功 

被保护了 @@

使用arduino IDE 设定为 stm32f103c8t6 , st link 方式烧录, 可以解除保护。但是 arduino IDE 烧进去的程序,无法正常执行。

保护解除后,回到sw4stm32, 即可正确烧录, 且烧录的˙程序,可以正确点点灯。 第一步算是成功了, GD32可以动作起来了。感动了。。。。。。。。。。。。。。

测试 pwm 

预计使用 PA11 输出

由以上block diagram或时钟树 ,  PA11(TIMER1) 由 APB2 提供时钟。

目前尚未外接时钟,依据时钟树,HSI=8M   –>  CK_SYS=8M  , AHB Prescaler设为1 –> CK_AHB=8M

APB2  Prescaler 设为1  –>  TM1 = 8M 

依照当前设置, SYSCLK , HCLK , PCLK1 , PCLK2 应该都是8M ,来验证一下 ,跑起频率是否正确:

要看频率的函数在 Drivers/Src/stmf1xx_hal_rcc.c 里面。 

在 main() 里面加入检查频率的码 ,进行debug ,

typedef struct
{
uint32_t SYSCLK_Frequency;
uint32_t HCLK_Frequency;
uint32_t PCLK1_Frequency;
uint32_t PCLK2_Frequency;
uint32_t ADCCLK_Frequency;

}RCC_ClocksTypeDef;

uint32_t sysclock = 0;
sysclock = HAL_RCC_GetSysClockFreq();

step over 到这,竟然哇勒  optimized out ….  

加点工  宣告 volatile ,再  debug进去,有了

都是8M 无误。

回到 pwm 现在来设定 timer1 的参数(cubeMx) :

prescaler = 7999  –> 8M/8000 = 1000Hz  , counter period = 9 , so we got a 1000/10=100ms pwm  cycle.

这里的 counter period 跟 设定pwm的占空比有关,
占空比 = pulse/ counter period ,如上设定的话,
当 TIM1->CCR4 = 10就会使 占空比達到100%  ;

cube generate code ,  go to sw4stm32   wirte code . 

呼吸灯正确的跑起来了

I2C   及 RTC  測試 

这里一样,使用stm32的库,完全没有修改的状况下,测试 I2C介面的12864 OLED 显示一个实时运行中的时钟。

使用之前用在stm32F030F4P6上面的 stm_HAL  的 oled库 (https://github.com/4ilo/ssd1306-stm32HAL),直接套用。

相关中断设定 

测试ok,I2C介面 oled 正确显示并且时钟运行无误 。

开始
58分钟后运行中ok

USB

without HSE , we can’t use USB on GD32F1(stm32F1)   ?  

USART

Async test

generate code之后, 在 程序中加入 -> 收到 UART字串 顯示在 oled上并且回传 。

worked as expected . 

USART-IrDA : 手上没有红外模组,下次再试。

SPI

手上目前只有一个LORA 1278是SPI ,就拿这个来测吧。 先做个 breakboard,由于是测试,就自己顺便画个在板天线用吧 433Mhz – 17cm。

这lora板子IntoRobot比较麻烦,多了个 RXTX脚 ,个人觉得逊 。 anyway 这不是重点,只是拿来测试 SPI

所以总共需要7个脚位  : CS(NSS)  , MOSI , MISO , SCK , RST , DIO0, RXTX 

RXTX引脚,接收设置
高电位,发送设置低电位,要在程序里面处理

现在来加上外部晶振

如果要加外部晶振 , 先看一下规格 :HSE 8M , LSE 32.768K

先加上 HSE  (C-HSE电容,手边没有20p的,用22p代,沒有上R-fhse电阻)

generate code 之后,在 sw4stm32 这边,就可以看到 HSE 启动了

build & run  ,正常执行,晶振应该ok了。

由于是使用cubeMX 指定为 stm32f103c8t6的关系,clock 设定受到stm32规格的限制,无法用cubeMX设定到72Mhz以上。如果要充分利用这颗GD32的标准速108Mhz,要做点修改,先看 GD32的 clock tree ,几个限制处要特别注意,不可超过。

所以,回到 cubeMX 的 clock config 来看看 , 发现只要 PLL改成13可以得到104 ,且限制处都没有超过, (還是能在cubeMX产生,只要忽略警告)

这下简单了, RCC_PLL_MUL9 改成 RCC_PLL_MUL13 搞定~
build  & run , 正常启动执行,ok了,這樣就跑在104Mhz 比较没有浪费了。 
观察一下,放著跑了20分钟,没有异常,应该是ok了

再来加上 LSE  32.768K  C-LSE 电容 15p(手邊沒有15p用10p代) ,没有上 R-flse电阻

build & run , 正常 ! HSE & LSE OK !

其他注意事项:



四脚无源晶振MC-306  :

1–> osc_in , 4–> osc_out ,  2 & 3不接或接地。

「mc-306   circuit」的圖片搜尋結果

如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:
①对于100脚或144脚的产品,OSC_IN应接地,OSC_OUT应悬空。 
②对于少于100脚的产品,有2种接法:第1种:OSC_IN和OSC_OUT分别通过10K电阻接地 。此方法可提高EMC性能;第2种:分别重映射OSC_IN和OSC_OUT至PD0和PD1,再配置PD0和PD1为推挽输出并输出’0’。此方法可以减小功耗并(相对上面)节省2个外部电阻。

程序烧录后,无法运行的怪异问题,只能在 debug调适的时候正常执行,硬启动不能正常运行 。
如果boot0 下拉电阻也换了,RST复位电路重做一次,都没用。
试试看 把靠近boot0的 I2C  disable掉(接 12864 oled) ,换到 比较远的 第二个I2C 就可以了。(记得要把ssd1306使用的 hi2c1 改成 hi2c2 )
要注意 io对 boot0的影响??

 

VBAT

The VBAT pin can be connected to the external battery (1.8 V < VBAT < 3.6 V). If no external battery is used, it is recommended to connect this pin to VDD with a 100 nF external ceramic decoupling capacitor