GB32F450使用
- 1. 相关知识
- 2. 烧写程序
- 3. SPI
- 3.1 spi基础
- 3.2 spi代码
- 4. 串口
- 4.1 串口引脚
- 4.2 串口通信代码
- 问题记录
- 1. 修改晶振频率
注意:GD32F450 总共有三种封装形式,本文所述的相关代码和知识,均为 GD32F450IX 系列。
1. 相关知识
参数 | 配置 |
---|---|
Max Speed | 200MHz |
Flash | 2048k |
SRAM | 512k |
IO | up to 140 |
GPTM (32bit) | 2 |
GPTM (32bit) | 2 |
Advanced TM | 2 |
Basic TM | 2 |
WDG | 2 |
RTC | 1 |
USART + UART | 2+2 |
I2C | 3 |
SPI | 6 |
I2S | 2 |
CAN 2.0B | 2 |
12bit ADC Units | 3; |
2. 烧写程序
注意:使用SWD模式烧写的时候,开发板要单独供电。
3. SPI
3.1 spi基础
SPI1和SPI2支持全双工模式的主从操作;
SPI5支持QSPI(四线SPI)主模式,适合高速数据传输或连接外部存储器(如SPI Flash);
SPI1和SPI2的时钟源为APB1总线(最大50MHz),实际SPI时钟频率为APB1分频后的25MHz;
SPI0、SPI3、SPI4、SPI5的时钟源为APB2总线(最大100MHz),支持最高50MHz的SPI时钟频率
注意 下面所说引脚为 GD32F450IX 系类的引脚。同时考虑到SWD下载功能要一直使用。所以PA13(SWDIO) PA14(SWCLK)的引脚不要使用
引脚 | 功能 |
---|---|
PA5 PB3 | SPI0_SCK |
PA6 PB4 | SPI0_MISO |
PA7 PB5 | SPI0_MOSI |
PA4 PA15 | SPI0_NSS |
PB10 PB13 PC7 PA9 PI1 PD3 | SPI1_SCK |
PC2 PB14 PI2 | SPI1_MISO |
PC1 PC3 PB15 PI3 | SPI1_MOSI |
PB12 PI0 PD1 PB9 | SPI1_NSS |
PC10 PB3 | SPI2_SCK |
PB0 PB2 PB5 PC1 PC12 PD0 PD6 | SPI2_MOSI |
PB4 PC11 | SPI1_MISO |
PA4 PA15 | SPI2_NSS |
PE2 PE12 PB13 PG11 | SPI3_SCK |
PE6 PA1 PE14 PG13 | SPI3_MOSI |
PE5 PE13 PA11 PD0 PG12 | SPI3_MISO |
PE4 PE11 PB12 PG14 | SPI3_NSS |
PF9 PF11 PE14 PA10 PB8 | SPI4_MOSI |
PF8 PE13 PH7 PA12 | SPI4_MISO |
PF7 PB0 PE12 PH6 | SPI4_SCK |
PF6 PH5 PB1 PE11 | SPI4_NSS |
PG13 | SPI5_SCK |
PG14 | SPI5_MOSI |
PG12 | SPI5_MISO |
PG8 | SPI5_NSS |
3.2 spi代码
void spi1_init(void)
{// 启用时钟rcu_periph_clock_enable(RCU_GPIOB); // 启用GPIOB时钟rcu_periph_clock_enable(RCU_SPI1); // 启用SPI1时钟// 配置GPIO引脚// PB12(SPI1_NSS), PB13(SPI1_SCK), PB15(SPI1_MOSI) 复用推挽输出 PB14(SPI1_MISO) 浮空输入gpio_af_set(GPIOB, GPIO_AF_5, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15); // AF6为SPI1功能gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_15);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_15);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_14); // MISOgpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14); // 输入模式无需设置输出选项,但库函数需要// 配置SPI参数spi_parameter_struct spi_init_struct;spi_struct_para_init(&spi_init_struct);spi_init_struct.device_mode = SPI_MASTER; // 主模式spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; // 全双工spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; // 8位数据spi_init_struct.nss = SPI_NSS_SOFT; // 硬件NSSspi_init_struct.endian = SPI_ENDIAN_MSB; // MSB优先spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE; // CPOL=0, CPHA=1spi_init_struct.prescale = SPI_PSC_16; // 预分频(根据系统时钟调整)spi_init(SPI1, &spi_init_struct);// 使能SPIspi_enable(SPI1);
}
void spi1_send(uint8_t data) {/* 等待 SPI1 TX 缓存为空 */while (spi_i2s_flag_get(SPI1, SPI_FLAG_TBE) == RESET);/* 发送数据 */spi_i2s_data_transmit(SPI1, data);
}
uint8_t spi1_receive(void) {/* 等待 SPI1 RX 缓存不为空 */while (spi_i2s_flag_get(SPI1, SPI_FLAG_RBNE) == RESET);/* 读取接收到的数据 */return spi_i2s_data_receive(SPI1);
}
4. 串口
4.1 串口引脚
引脚 | 说明 |
---|---|
PA9 PA15 PB6 | USART0_TX |
PA10 PB3 PB7 | USART0_RX |
PA11 | USART0_CTS |
PA12 | USART0_RTS |
PA8 | USART0_CK |
PA3 PD6 | USART1_TX |
PA2 PD5 | USART1_RX |
PA0 PD3 | USART1_CTS |
PA1 PD4 | USART1_RTS |
PA4 PD7 | USART1_CK |
PB10 PD8 PC10 | USART2_TX |
PC5 PC11 PB11 PD9 | USART2_RX |
PB13 PD11 | USART2_CTS |
PB12 PD12 | USART2_RTS |
PB12 PD10 PC12 | USART1_CK |
4.2 串口通信代码
串口通信代码
void usart0_config(void) {// 1. 使能时钟rcu_periph_clock_enable(RCU_GPIOB); // 使能 GPIOB 时钟rcu_periph_clock_enable(RCU_USART0); // 使能 USART0 时钟// 2. 配置 GPIO 复用模式// PB6: USART0_TX (AF7), PB7: USART0_RX (AF7)gpio_af_set(GPIOB, GPIO_AF_7, GPIO_PIN_6 | GPIO_PIN_7);// 3. 配置 TX (PB6) 为复用推挽输出gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_6);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);// 4. 配置 RX (PB7) 为浮空输入(或上拉输入)gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7);// //配置复用功能
// gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_9); //配置PA9为复用类别7
// gpio_af_set(GPIOA, GPIO_AF_7, GPIO_PIN_10);
// //配置引脚的模式
// gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_9);//配置pa9为复用上拉模式
// gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_9);//配置pa9为推挽输出,速度为50M
// gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP,GPIO_PIN_10);// 5. 配置 USART0 参数usart_deinit(USART0);usart_baudrate_set(USART0, 115200U); // 波特率 115200usart_word_length_set(USART0, USART_WL_8BIT); // 8 位数据usart_stop_bit_set(USART0, USART_STB_1BIT); // 1 停止位usart_parity_config(USART0, USART_PM_NONE); // 无校验usart_receive_config(USART0, USART_RECEIVE_ENABLE); // 使能接收usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); // 使能发送usart_enable(USART0); // 使能 USART0
}
void usart_send_char(char c) {while (usart_flag_get(USART0, USART_FLAG_TBE) == RESET); // 等待发送缓冲区为空usart_data_transmit(USART0, (uint8_t)c); // 发送字符
}// 发送一个字符串
void usart_send_string(const char *str) {while (*str) {usart_send_char(*str++);}
}
// 重定义print
int fputc(int ch, FILE *f)
{usart_data_transmit(USART0, (uint8_t)ch); //调用串口发送函数while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));//等待发送完成return ch;
}
问题记录
1. 修改晶振频率
gd32f450系统自带的晶振频率是25MHz,但程序里默认使用的是16MHz的内部晶振,如果想修改为外部晶振,需要修改下面三处地方。
① 修改 gd32f4xx.h文件中关于外部晶振频率的设置
如果是使用25MHz的则不需要修改。
② 修改 system_gd32f4xx.c 文件中的两处地方
第一处是开头的系统主晶振频率,将其修改为外部晶振。
第二处是选择我们想用的外部晶振对应的频率宏定义即可