GD32F450 使用

news2025/3/2 7:16:51

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 文件中的两处地方
第一处是开头的系统主晶振频率,将其修改为外部晶振。
在这里插入图片描述
在这里插入图片描述
第二处是选择我们想用的外部晶振对应的频率宏定义即可
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 动静态库和_make_进度条(一)

文章目录 一、如何理解条件编译二、动静态库1. 理论2. 实践3. 解决普通用户的sudo问题4. 技术上理解库 三、make和make_file 一、如何理解条件编译 1. gcc code.c -o code -DM 命令行级别的宏定义预处理的本质就是修改编辑我们的文本代码 头文件展开到源文件中去注释宏替换条…

Android 图片压缩详解

在 Android 开发中,图片压缩是一个重要的优化手段,旨在提升用户体验、减少网络传输量以及降低存储空间占用。以下是几种主流的图片压缩方法,结合原理、使用场景和优缺点进行详细解析。 效果演示 直接先给大家对比几种图片压缩的效果 质量压缩 质量压缩:根据传递进去的质…

LLM中的Benchmark是什么

LLM中的Benchmark是什么 “DeepSeek推动价值重估Benchmark” DeepSeek这家公司或其相关技术的发展,促使Benchmark这家机构对相关资产或企业的价值进行重新评估。“Benchmark”在这里是一家研究机构或金融分析机构。 “Benchmark”常见的意思是“基准;水准点,基准点”,作…

梯度下降法(Gradient Descent) -- 现代机器学习的血液

梯度下降法(Gradient Descent) – 现代机器学习的血液 梯度下降法是现代机器学习最核心的优化引擎。本文从数学原理、算法变种、应用场景到实践技巧,用三维可视化案例和代码实现揭示其内在逻辑,为你构建完整的认知体系。 优化算法 一、梯度下降法的定义…

微服务学习(2):实现SpringAMQP对RabbitMQ的消息收发

目录 SpringAMQP是什么 为什么采用SpringAMQP SpringAMQP应用 准备springBoot工程 实现消息发送 SpringAMQP是什么 Spring AMQP是Spring框架下用于简化AMQP(高级消息队列协议)应用开发的一套工具集,主要针对RabbitMQ等消息中间件的集成…

StarRocks 在爱奇艺大数据场景的实践

作者:林豪,爱奇艺大数据 OLAP 服务负责人 小编导读: 本文整理自爱奇艺工程师在 StarRocks 年度峰会的分享,介绍了爱奇艺 OLAP 引擎演化及引入 StarRocks 后的效果。 在广告业务中,StarRocks 替换 ImpalaKudu 后&#x…

JAVA入门——IO流

一、了解File类 这个类里面提供了一些文件相关的方法,了解即可,方法有很多,不好背下面这个是最常用的只能对文件本身操作,不能读取数据 public File[] listFiles();//获取当前路径下的所有内容 注意:如果是需要权限才…

Spring Boot 流式响应豆包大模型对话能力

当Spring Boot遇见豆包大模型:一场流式响应的"魔法吟唱"仪式 一、前言:关于流式响应的奇妙比喻 想象一下你正在火锅店点单,如果服务员必须等所有菜品都备齐才一次性端上来,你可能会饿得把菜单都啃了。而流式响应就像贴…

【多模态】Magma多模态AI Agent

1. 前言 微软杨建伟团队,最近在AI Agent方面动作连连,前两天开源了OmniParser V2,2月26日又开源了Magma,OmniParser专注在对GUI的识别解析,而Magma则是基于多模态技术,能够同时应对GUI和物理世界的交互&…

DeepSeek掘金——DeepSeek R1驱动的PDF机器人

DeepSeek掘金——DeepSeek R1驱动的PDF机器人 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人。逐步学习如何增强AI检索能力,并创建一个能够高效处理和响应文档查询的智能聊天机器人。 本指南将引导你使用DeepSeek R1 + RAG构建一个功能性的PDF聊天机器人…

DeepSeek在PiscTrace上完成个性化处理需求案例——光流法将烟雾动态可视化

引言:PiscTrace作为开放式的视图分析平台提供了固定格式的类型参数支持个性化定制处理需求,本文一步步的实现光流分析按照不同需求根据DeepSeek的代码处理视频生成数据。 光流法(Optical Flow)是一种基于图像序列的计算机视觉技术…

explore与explode词源故事

英语单词explore来自古法语,源自拉丁语,由前缀ex-(出来)加词根plor-(叫喊)以及末尾的小尾巴-e组成,字面意思就是“喊出来,通过叫喊声赶出来”。它为什么能表示“探索”呢&#xff1f…

LeeCode题库第三十七题

37.解数独 项目场景: 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请…

小红书自动评论

现在越来越多的人做起来小红书,为了保证自己的粉丝和数据好看,需要定期养号。 那么养号除了发视频外,还需要积极在社区互动,比如点赞、评论等等,为了节省时间,我做了一个自动化评论工具。 先看效果 那这个是…

OpenCV图像认知(一)

OpenCV: 是由Intel公司俄罗斯团队发起并参与和维护的一个计算机视觉处理开源软件库,支持与计算机视觉和机器学习相关的众多算法 OpenCV-Python: OpenCV-Python是一个Python绑定库,旨在解决计算机视觉问题。 Python是一种由Gui…

Qt6.8编译项目找不到文件——6.8.2\msvc2022_64\include\QtWidgets\QMainWindow does not exist.

问题:Error: dependent ‘…\Qt6.8.2\6.8.2\msvc2022_64\include\QtWidgets\QMainWindow’ does not exist. jom: D:\Temp\untitled1\build\Makefile [release] Error 2 20:20:43: 进程"D:\ProgramFiles\Develop\Qt6.8.2\Tools\QtCreator\bin\jom\jom.exe"…

发展中的脑机接口:SSVEP特征提取技术

一、简介 脑机接口(BCI)是先进的系统,能够通过分析大脑信号与外部设备之间建立通信,帮助有障碍的人与环境互动。BCI通过分析大脑信号,提供了一种非侵入式、高效的方式,让人们与外部设备进行交流。BCI技术越…

绕过密码卸载360终端安全管理系统

一不小心在电脑上安装了360终端安全管理系统,就会发现没有密码,就无法退出无法卸载360,很容易成为一个心病,360终端安全管理系统,没有密码,进程无法退出,软件无法卸载,前不久听同事说…

Java数据结构第十五期:走进二叉树的奇妙世界(四)

专栏:Java数据结构秘籍 个人主页:手握风云 目录 一、二叉树OJ练习题(续) 1.1. 二叉树的层序遍历 1.2. 二叉树的最近公共祖先 1.3. 从前序与中序遍历序列构造二叉树 1.4. 从中序与后序遍历序列构造二叉树 1.5. 根据二叉树创建…

Typora的Github主题美化

[!note] Typora的Github主题进行一些自己喜欢的修改,主要包括:字体、代码块、表格样式 美化前: 美化后: 一、字体更换 之前便看上了「中文网字计划」的「朱雀仿宋」字体,于是一直想更换字体,奈何自己拖延症…