前言:本文记录一下用GD32E10x替代STM32F10x程序移植过程,两个芯片是pin to pin的,因此无须修改硬件设计,只需修改软件即可。
1、开发工具
IDE:MDK、IAR均可
调试下载工具:stlink v2、jlink ob、jlink均可。
2、数据类型定义
在stm32早期的库中使用了u8,u16,u32等数据类型,需要在gd32e10x.h文件中定义u8,u16,u32等数据类型。
3、时钟配置
根据硬件设计,在system_gd32e10x.c里选择使用内部8M,倍频到120M。
4、systick延时
由于GD32E10x最大主频是120M,STM32f10x只能到72M,所以在延时函数里面的SysTick->LOAD 赋值上要把72改为120,当然最大延时时长也就发生了变化。systick属于内核的东西,两个芯片的寄存器包括命名都是一样的。
5、gpio操作
stm32需要先创建一个结构体变量,再给结构体成员赋值;GD32更简单,直接用gpio_init函数初始化,例如:
gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_10MHZ,GPIO_PIN_2);
6、Timer
操作和STM32基本一样,在GD32E10x系列中,使用普通定时器timer 5,配置自动重载,1ms产生更新一次中断。
7、串口
GD32E10x的串口从USART0开始,对应的就是STM32的USART1。其他操作和STM32类型。例如操作GD32E10x的USART0:
初始化串口:
//a、时钟使能 rcu_periph_clock_enable(RCU_GPIOA); rcu_periph_clock_enable(RCU_USART0); //b、GPIO配置 gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); //c、串口配置 usart_deinit(USART0); usart_baudrate_set(USART0, 115200U); usart_word_length_set(USART0, USART_WL_8BIT); usart_stop_bit_set(USART0, USART_STB_1BIT); usart_parity_config(USART0, USART_PM_NONE); usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE); usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE); usart_receive_config(USART0, USART_RECEIVE_ENABLE); usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); usart_enable(USART0); //d、中断配置 nvic_irq_enable(USART0_IRQn, 3, 0); usart_interrupt_enable(USART0, USART_INT_RBNE);
串口中断:
void USART0_IRQHandler(void) { u8 ch; if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)) { ch = usart_data_receive(USART0); usart_data_transmit(USART0,ch); } }
8、flash编程
GD32E10x系列flash只能字(32bit)、双字(64bit)编程,不支持半字(16bit)编程。
注意在GD32的外设中,将flash命名为fmc,相应的库文件是gd32e10x_fmc.c/h。
通过移植可以看出,GD32的库文件和STM32的很像,甚至有的库函数用起来比STM32更简单,但是在外设的命名以及一些细微之处还是有区别的。
本文分享自微信公众号 - 物联网思考(everythinglink),作者:everythinglink
原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。
原始发表时间:2020-10-27
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句