Tested by 老高 ,全程使用 cubeMX生成stm32 库,无修正,无需代换到GD32库。
cost down还要down一直down ,价格只有 同型号stm32的一半不到。
中国心大战美国心,價格一直继续down下去就对了,大家有福了啦



与 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 正确显示并且时钟运行无误 。


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


USART

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

高电位,发送设置低电位,要在程序里面处理
现在来加上外部晶振
如果要加外部晶振 , 先看一下规格 :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不接或接地。

如果使用内部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