GD32F450 使用

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); // MISO
    gpio_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;                // 硬件NSS
    spi_init_struct.endian            = SPI_ENDIAN_MSB;              // MSB优先
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_2EDGE;  // CPOL=0, CPHA=1
    spi_init_struct.prescale          = SPI_PSC_16;                // 预分频(根据系统时钟调整)
    spi_init(SPI1, &spi_init_struct);
    // 使能SPI
    spi_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);                  // 波特率 115200
    usart_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 文件中的两处地方
第一处是开头的系统主晶振频率,将其修改为外部晶振。
在这里插入图片描述
在这里插入图片描述
第二处是选择我们想用的外部晶振对应的频率宏定义即可
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/979109.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 测试:单元、集成与契约测试全解析

一、Spring Boot 分层测试策略 Spring Boot 应用采用经典的分层架构,不同层级的功能模块对应不同的测试策略,以确保代码质量和系统稳定性。 Spring Boot 分层架构: Spring Boot分层架构 A[客户端] -->|HTTP 请求| B[Controller 层] …

(十 三)趣学设计模式 之 模版方法模式!

目录 一、 啥是模板方法模式?二、 为什么要用模板方法模式?三、 模板方法模式的实现方式四、 模板方法模式的优缺点五、 模板方法模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式&a…

汽车刹车系统设计

摘 要 本次设计内容为汽车刹车系统,其可靠性与驾驶人的生命息息相关,是汽车所有组成部分中最重要的一环。刹车系统是在车辆行驶过程中出现紧急情况时首先保护车辆与驾驶人员安全的反应系统,工作原理是依靠制动装置工作时产生的大量摩擦力来抵…

卷积神经网络梯度下降方向与参数更新方向的一致性论述

梯度下降是一种常用的优化算法,用于最小化损失函数,在机器学习和深度学习领域有着广泛的应用。分别对梯度下降、梯度方向以及参数更新采用负梯度方向的原因进行论述。 1.梯度下降 它的基本思想是通过迭代的方式来更新模型的参数,使得损失函数…

Starrocks入门(二)

1、背景:考虑到Starrocks入门这篇文章,安装的是3.0.1版本的SR,参考:Starrocks入门-CSDN博客 但是官网的文档,没有对应3.0.x版本的资料,却有3.2或者3.3或者3.4或者3.1或者2.5版本的资料,不要用较…

可以免费无限次下载PPT的网站

前言 最近发现了一个超实用的网站,想分享给大家。 在学习和工作的过程中,想必做PPT是一件让大家都很头疼的一件事。 想下载一些PPT模板减少做PPT的工作量,但网上大多精美的PPT都是需要付费才能下载使用。 即使免费也有次数限制&#xff0…

[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)

文章目录 1. JVM内存模型2. 常量池中有什么类型?3. 常量池中真正存储的内容是什么4. 判断一个字符串(引用)是否在常量池中5. BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗?6. 获取堆内存使用情况、非堆内存使用情况 1. JVM内…

DeepSeek模型昇腾部署优秀实践

2024年12月26日,DeepSeek-V3横空出世,以其卓越性能备受瞩目。该模型发布即支持昇腾,用户可在昇腾硬件和MindIE推理引擎上实现高效推理,但在实际操作中,部署流程与常见问题困扰着不少开发者。本文将为你详细阐述昇腾 De…

python编写liunx服务器登陆自动巡检脚本

前言: 用户需要一份用Python编写的Linux系统巡检脚本,检查内存、磁盘、CPU使用率,还有网络连通性。 首先,我得确定用户的使用场景。可能用户是系统管理员,需要定期监控服务器状态,确保系统正常运行。 或者…

鸿蒙 ArkUI 实现敲木鱼小游戏

敲木鱼是一款具有禅意的趣味小游戏,本文将通过鸿蒙 ArkUI 框架的实现代码,逐步解析其核心技术点,包括动画驱动、状态管理、音效震动反馈等。 一、架构设计与工程搭建 1.1 项目结构解析 完整项目包含以下核心模块: ├── entry…

ShenNiusModularity项目源码学习(14:ShenNius.Infrastructure项目分析)

ShenNius.Infrastructure项目用于定义ShenNius.Admin.Mvc项目和ShenNius.Admin.API项目共用的特性类、数据操作接口实现类、上下文类、通讯类,主要文件的用途如下:   Attributes文件夹保存特性类或过滤器类定义,主要包括:   …

Mysql表字段字符集未设置导致乱码问题

项目场景: 在使用mysql的text类型作为字段类型【未设置编码】,且表结构【设置了编码集】的条件下,查询表这个字段会出现乱码的情况。 问题描述 今日测试小伙伴给题主提出了一个bug,数据库当中的text文本字段在存储json的情况下&…

staruml绘制时序图和用例图

文章目录 1.文章介绍2.绘制用例图3.绘制时序图 1.文章介绍 之前,我们初步介绍了这个staruml软件的安装和如何使用这个软件对于uml类图进行绘制,当时我们是绘制了这个user类,实现了相关的接口,表示他们之间的关系,在今…

火狐浏览器多开指南:独立窗口独立IP教程

无论是跨境电商从业者需要管理多个店铺账号,还是海外社交媒体营销人员要运营多个社交平台账号,亦或是从事多账号广告投放的人员,都面临着一个共同的挑战 —— 如何高效管理多个账号,并确保每个账号的独立性。 在这种情况下&#…

DeepSeek赋能大模型内容安全,网易易盾AIGC内容风控解决方案三大升级

在近两年由AI引发的生产力革命的背后,一场关乎数字世界秩序的攻防战正在上演:AI生成的深度伪造视频导致企业品牌声誉损失日均超千万,批量生成的侵权内容使版权纠纷量与日俱增,黑灰产利用AI技术持续发起欺诈攻击。 与此同时&#…

【论文精读】YOLO-World:实时开放词汇目标检测

论文地址: YOLO-World: Real-Time Open-Vocabulary Object Detection 源代码:YOLO-World 摘要 YOLO系列检测器因其高效性和实用性而被广泛认可。然而,它们依赖于预定义和训练过的物体类别,这限制了其在开放场景中的适用性。为了…

开放标准(RFC 7519):JSON Web Token (JWT)

开放标准:JSON Web Token 前言基本使用整合Shiro登录自定义JWT认证过滤器配置Config自定义凭证匹配规则接口验证权限控制禁用session缓存的使用登录退出单用户登录Token刷新双Token方案单Token方案 前言 JSON Web Token (JWT) 是一种开放标准…

mysql架构查询执行流程(图解+描述)

目录 mysql架构查询执行流程 图解 描述 mysql架构查询执行流程 图解 描述 用户连接到数据库后,由连接器处理 连接器负责跟客户端建立连接、获取权限、维持和管理连接 客户端发送一条查询给服务器 服务器先检查查询缓存,如果命中缓存,则立…

k8s使用containerd作为容器运行时配置Harbor私有仓库与阿里云私有仓库以及镜像加速器,k8s基于containerd如何配置harbor私有仓库

至于containerd大家还需要在去学习以下使用的命令。 版本介绍 k8s:v1.28.2containerd:1.6.33 1.配置containerd镜像加速器 [rootmaster ~]# vim /etc/containerd/config.toml ---编辑containerd配置文件找到以下位置新添加 [plugins."io.contain…

【MySql】EXPLAIN执行计划全解析:15个字段深度解读与调优指南

文章目录 一、执行计划核心字段总览二、关键字段深度拆解1. type(访问类型)——查询性能的晴雨表典型场景分析: 2. key_len(索引使用长度)——索引利用率的检测仪计算示例: 3. Extra(附加信息&a…