GD32F450 使用

devtools/2025/3/1 21:31:01/

GB32F450使用

  • 1. 相关知识
  • 2. 烧写程序
  • 3. SPI
    • 3.1 spi基础
    • 3.2 spi代码
  • 4. 串口
    • 4.1 串口引脚
    • 4.2 串口通信代码
  • 问题记录
    • 1. 修改晶振频率

注意:GD32F450 总共有三种封装形式,本文所述的相关代码和知识,均为 GD32F450IX 系列。

1. 相关知识

参数配置
Max Speed200MHz
Flash2048k
SRAM512k
IOup to 140
GPTM (32bit)2
GPTM (32bit)2
Advanced TM2
Basic TM2
WDG2
RTC1
USART + UART2+2
I2C3
SPI6
I2S2
CAN 2.0B2
12bit ADC Units3;

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 PB3SPI0_SCK
PA6 PB4SPI0_MISO
PA7 PB5SPI0_MOSI
PA4 PA15SPI0_NSS
PB10 PB13 PC7 PA9 PI1 PD3SPI1_SCK
PC2 PB14 PI2SPI1_MISO
PC1 PC3 PB15 PI3SPI1_MOSI
PB12 PI0 PD1 PB9SPI1_NSS
PC10 PB3SPI2_SCK
PB0 PB2 PB5 PC1 PC12 PD0 PD6SPI2_MOSI
PB4 PC11SPI1_MISO
PA4 PA15SPI2_NSS
PE2 PE12 PB13 PG11SPI3_SCK
PE6 PA1 PE14 PG13SPI3_MOSI
PE5 PE13 PA11 PD0 PG12SPI3_MISO
PE4 PE11 PB12 PG14SPI3_NSS
PF9 PF11 PE14 PA10 PB8SPI4_MOSI
PF8 PE13 PH7 PA12SPI4_MISO
PF7 PB0 PE12 PH6SPI4_SCK
PF6 PH5 PB1 PE11SPI4_NSS
PG13SPI5_SCK
PG14SPI5_MOSI
PG12SPI5_MISO
PG8SPI5_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 PB6USART0_TX
PA10 PB3 PB7USART0_RX
PA11USART0_CTS
PA12USART0_RTS
PA8USART0_CK
PA3 PD6USART1_TX
PA2 PD5USART1_RX
PA0 PD3USART1_CTS
PA1 PD4USART1_RTS
PA4 PD7USART1_CK
PB10 PD8 PC10USART2_TX
PC5 PC11 PB11 PD9USART2_RX
PB13 PD11USART2_CTS
PB12 PD12USART2_RTS
PB12 PD10 PC12USART1_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 文件中的两处地方
第一处是开头的系统主晶振频率,将其修改为外部晶振。
在这里插入图片描述
在这里插入图片描述
第二处是选择我们想用的外部晶振对应的频率宏定义即可
在这里插入图片描述


http://www.ppmy.cn/devtools/163736.html

相关文章

labview中VISA串口出现异常的解决方案

前两天在做项目时发现,当用VISA串口读取指令时出现了回复异常的情况,不管发什么东西就一直乱回,针对这个情况,后面在VISA串口中加了一个VISA寄存器清零的函数。加了之后果然好多了,不会出现乱回的情况,但是…

Spring Boot 实战:轻松实现文件上传与下载功能

目录 一、引言 二、Spring Boot 文件上传基础 (一)依赖引入 (二)配置文件设置 (三)文件上传接口编写 (一)文件类型限制 (二)文件大小验证 &#xff0…

docker简介-学习与参考

docker Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱…

在AI中,tokens是自然语言处理(NLP)的基本单位,用于文本的分割和处理。

在AI中,tokens是自然语言处理(NLP)的基本单位,用于文本的分割和处理。‌ Tokens可以是单个单词、字符、子词或标点符号,具体形式取决于使用的分词方法。‌12 Tokens在AI模型中的作用 ‌文本处理‌:在AI模…

【分布式锁通关指南 04】redis分布式锁的细节问题以及RedLock算法原理

引言 在03篇中我们讲解了lua脚本的使用(Ps:如果你没跳过的话),目前我们通过api也好,lua脚本也好,已经基于redis实现了分布式锁,但看似完美的它其实还存在一些细节问题,本章节将会带领…

验证码识别:一文掌握手机验证码的自动化处理

文章目录 一、获取手机验证码1.1 通过短信接收验证码1.2 使用第三方短信接收服务1.3 使用ADB读取手机短信1.4 通过API获取验证码1.5 通过邮件接收验证码二、解析和提取验证码2.1 正则表达式提取2.2 JSON解析三、自动化输入验证码3.1 使用Selenium自动化Web应用3.2 使用Appium自…

量子计算的数学基础:复数、矩阵和线性代数

量子计算是基于量子力学原理的一种新型计算模式,它与经典计算机在信息处理的方式上有着根本性的区别。在量子计算中,信息的最小单位是量子比特(qubit),而不是传统计算中的比特。量子比特的状态是通过量子力学中的数学工具来描述的,因此,理解量子计算的数学基础对于深入学…

MySQL零基础教程09—正则表达式搜索(上)

回顾 正则表达式开始之前,先回顾一下在数据过滤也就是select语句的介绍中,已经学过的知识点: 正则表达式是一种用于文本处理和模式匹配的强大工具。它通过特定的字符序列和语法规则来定义搜索模式,能够在文本中快速查找、替换符…