(一)GD32F230F4P6
GD32F230F4P6 是 GD 基於 ARM ® CortexTM-M23 內核 推出的超值型單片機 GD32E230 系列中的一個型號,
基本特征有:
- 16K Flash 4K RAM
- SOP20 封裝,可用 IO 有 15 個,跟 ST32F0 & STM32L0 系列 中的 TSSOP20 封裝的芯片是 PIN2PIN的
- 1 個 I2C、1 個 SPI 、1 個 UART
- 9 個外部 + 2 個 內部 通道的 分辨率高達 12 bit 的 ADC
等等,
(二)GD32F230F4P6 的資源
要把該芯片用起來所需的基本資源在官網就能找到:
-
datasheet : GD32E230xx_Datasheet
-
keil & IAR 支持包:GD32E23x_AddOn
-
外設庫 跟 DEMO 板例程:gd32e230xxxx-firmware-library、gd32e230xxxx-demo-suites
(三)GD32F230F4P6 最小系統
搞這行,只有軟件不行,還得有實際得硬件,我使用的板子是這個:
左邊是焊接了 GD32F230F4P6 的最小系統,這板子本來是給 STM32F042F4 做的,有點不好看,右邊是我用 STM32F042F4 做的 Daplink。
(四)用起來
首先把 GD32E23x_AddOn 下載下來並安裝,里面分 IAR 跟 KEIL,安裝對應的即可
然后下載固件庫gd32e230xxxx-firmware-library,里面有外設庫、外設例程、工程模板。這里直接使用里面的工程模板。
我這里使用 keil,進入相關目錄打開工程:
在現有的環境下我要用最少的時間,驗證下我的環境能不能用、我的板子能不能跑起來,當然最簡單的是控制個 IO 口來點個燈,可是我的板子上的 MCU 的 IO 沒有接 LED燈,所幸的是我的 Daplink 有 USB 轉 TTL 功能,也連接到了 MCU ,看了下 SDK 里面的例程,也有 UART 部分,那我實現一個 MCU 通過 UART 發送數據的程序就可以驗證了。
那么要在我的板子上跑起來,需要做 4 個修改:
- 修改調試器,沒有合適的調試器,就無法給 GD32E230 下載程序、調試程序了
- 時鍾,我的板子上沒有晶振,只能用內部時鍾
- 把例程里面的 uart 適配到我的板子
- 實現測試程序
(4.1)修改調試器
首先修改所用調試器,選擇使用 CMISI-DAP,然后進入調試器設置選中,使用 SW 接口,如下:
(4.2)修改時鍾
工程中 GD32F230 使用的時鍾是外部晶振的,我的板子上沒有外部晶振,只能使用內如 RC 了,打開文件 system_gd32e23x.c,修改為如下:
(4.3)修改 UART
我這個 Daplink 上有個 usb 轉 ttl,RX、TX 分別連接到 GD32F230F4p6 的 PA2、PA3,看了下源碼,還需要改下代碼上使用的 UART0 對應的 IO,打開 gd32e230c_eval.h,修改如下:
(4.4)測試程序
然后是應用,測試程序,本來是這樣的:
int main(void)
{
/* configure systick */
systick_config();
/* initilize the LEDs, USART and key */
gd_eval_led_init(LED1);
gd_eval_led_init(LED2);
gd_eval_led_init(LED3);
gd_eval_com_init(EVAL_COM);
gd_eval_key_init(KEY_WAKEUP, KEY_MODE_GPIO);
/* print out the clock frequency of system, AHB, APB1 and APB2 */
printf("\r\nCK_SYS is %d", rcu_clock_freq_get(CK_SYS));
printf("\r\nCK_AHB is %d", rcu_clock_freq_get(CK_AHB));
printf("\r\nCK_APB1 is %d", rcu_clock_freq_get(CK_APB1));
printf("\r\nCK_APB2 is %d", rcu_clock_freq_get(CK_APB2));
while (1){
if(SET == gd_eval_key_state_get(KEY_WAKEUP)){
gd_eval_led_on(LED2);
delay_1ms(500);
gd_eval_led_off(LED2);
gd_eval_led_toggle(LED3);
}
}
}
由於板子上沒有 LED 燈、按鍵,這里把 LED 燈跟按鍵部分去掉,保留串口部分,如下:
int main(void)
{
/* configure systick */
systick_config();
/* initilize the LEDs, USART and key */
gd_eval_com_init(EVAL_COM);
/* print out the clock frequency of system, AHB, APB1 and APB2 */
printf("\r\nCK_SYS is %d", rcu_clock_freq_get(CK_SYS));
printf("\r\nCK_AHB is %d", rcu_clock_freq_get(CK_AHB));
printf("\r\nCK_APB1 is %d", rcu_clock_freq_get(CK_APB1));
printf("\r\nCK_APB2 is %d\r\n", rcu_clock_freq_get(CK_APB2));
while (1){
delay_1ms(500);
printf("This is GD32E230F4P6\r\n");
}
}
編譯運行,結果如下: