当前位置: 首页 > news >正文

GD32裸机程序-SFUD接口文件记录

SFUD gitee地址

SFUD

spi初始化

/********************************************************************************* @file           : bsp_spi.c* @author         : shchl* @brief          : None* @version        : 1.0* @attention      : None* @date           : 25-4-16******************************************************************************
*/
#include "bsp.h"
#include "bsp_spi.h"void bsp_spi_init(void)
{spi1_init();
}void spi1_init(void)
{rcu_periph_clock_enable(RCU_SPI1);// gpiogpio_mode_set(GPIOB,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_12);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);/* SPI1 GPIO config */gpio_af_set(GPIOB, GPIO_AF_5,GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);gpio_mode_set(GPIOB, GPIO_MODE_AF, GPIO_PUPD_NONE,GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);gpio_output_options_set(GPIOB, GPIO_OTYPE_PP, GPIO_OSPEED_MAX,GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15);/* chip select invalid */gpio_bit_set(GPIOB,GPIO_PIN_12);spi_parameter_struct spi_init_struct;/* SPI1 parameter config */spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;spi_init_struct.device_mode = SPI_MASTER;spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT;spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;spi_init_struct.nss = SPI_NSS_SOFT;spi_init_struct.prescale = SPI_PSC_2;spi_init_struct.endian = SPI_ENDIAN_MSB;spi_crc_off(SPI1);spi_init(SPI1, &spi_init_struct);/* Enable SPI_MASTER */spi_enable(SPI1);
}

sfud_port.c文件修改

#include <sfud.h>
#include <stdarg.h>
#include <stdio.h>
#include <gd32f4xx.h>typedef struct
{uint32_t spix;uint32_t cs_gpiox;uint16_t cs_gpio_pin;
} spi_user_data, *spi_user_data_t;static char log_buf[256];void sfud_log_debug(const char* file, const long line, const char* format, ...);static void spi_lock(const sfud_spi* spi)
{__disable_irq();
}static void spi_unlock(const sfud_spi* spi)
{__enable_irq();
}/*** SPI write data then read data*/
static sfud_err spi_write_read(const sfud_spi* spi, const uint8_t* write_buf, size_t write_size, uint8_t* read_buf,size_t read_size)
{sfud_err result = SFUD_SUCCESS;uint8_t send_data, read_data;spi_user_data* spix = (spi_user_data*)spi->user_data;if (write_size){SFUD_ASSERT(write_buf);}if (read_size){SFUD_ASSERT(read_buf);}gpio_bit_reset(spix->cs_gpiox, spix->cs_gpio_pin);/* 开始读写数据 */for (size_t i = 0, retry_times; i < write_size + read_size; i++){/* 先写缓冲区中的数据到 SPI 总线,数据写完后,再写 dummy(0xFF) 到 SPI 总线 */if (i < write_size){send_data = *write_buf++;}else{send_data = SFUD_DUMMY_DATA;}/* 发送数据 */retry_times = 1000;while (RESET == spi_i2s_flag_get(spix->spix, SPI_FLAG_TBE)){SFUD_RETRY_PROCESS(NULL, retry_times, result);}if (result != SFUD_SUCCESS){goto exit;}// Send the bytespi_i2s_data_transmit(spix->spix, send_data);/* 接收数据 */retry_times = 1000;//Wait until a data is receivedwhile (RESET == spi_i2s_flag_get(spix->spix, SPI_FLAG_RBNE)){SFUD_RETRY_PROCESS(NULL, retry_times, result);}// Get the received dataif (result != SFUD_SUCCESS){goto exit;}read_data = spi_i2s_data_receive(spix->spix);/* 写缓冲区中的数据发完后,再读取 SPI 总线中的数据到读缓冲区 */if (i >= write_size){*read_buf++ = read_data;}}exit:gpio_bit_set(spix->cs_gpiox, spix->cs_gpio_pin);return result;
}/* about 100 microsecond delay */
static void retry_delay_100us(void)
{uint32_t delay = 120;while (delay--);
}static spi_user_data spi1 = {.spix = SPI1, .cs_gpiox = GPIOB, .cs_gpio_pin = GPIO_PIN_12};sfud_err sfud_spi_port_init(sfud_flash* flash)
{sfud_err result = SFUD_SUCCESS;switch (flash->index){case SFUD_25Q128_DEVICE_INDEX:{/* 同步 Flash 移植所需的接口及数据 */flash->spi.wr = spi_write_read;flash->spi.lock = spi_lock;flash->spi.unlock = spi_unlock;flash->spi.user_data = &spi1;/* about 100 microsecond delay */flash->retry.delay = retry_delay_100us;/* adout 60 seconds timeout */flash->retry.times = 60 * 10000;break;}default:result = SFUD_ERR_NOT_FOUND;break;}return result;
}/*** This function is print debug info.** @param file the file which has call this function* @param line the line number which has call this function* @param format output format* @param ... args*/
void sfud_log_debug(const char* file, const long line, const char* format, ...)
{va_list args;/* args point to the first variable parameter */va_start(args, format);// printf("[SFUD](%s:%ld) ", file, line);/* must use vprintf to print */vsnprintf(log_buf, sizeof(log_buf), format, args);printf("%s\r\n", log_buf);va_end(args);
}/*** This function is print routine info.** @param format output format* @param ... args*/
void sfud_log_info(const char* format, ...)
{va_list args;/* args point to the first variable parameter */va_start(args, format);printf("[SFUD]");/* must use vprintf to print */vsnprintf(log_buf, sizeof(log_buf), format, args);printf("%s\r\n", log_buf);va_end(args);
}

相关文章:

  • 用 C++ 模拟客户端渲染中的分步数据加载
  • CVFSNet:一种用于端到端脑梗塞溶栓治疗后改良脑梗死溶栓分级(mTICI)评分的跨视图融合评分网络|文献速递-深度学习医疗AI最新文献
  • 使用CubeMX新建SysTick延时函数工程——使用中断,不使用HAL_Delay
  • 【QT入门到晋级】QT打动态库包及引入动态库包
  • std visit
  • centos部署的openstack发布windows虚拟机
  • 卷积神经网络 CNN 模型介绍
  • 使用DeepSeek如何提升课题申报书中研究内容的专业性?25个进阶DeepSeek指令
  • QT —— 信号和槽(自定义信号和槽函数)
  • 《Timer: Generative Pre-trained Transformers Are Large Time Series Models》
  • C++Cherno 学习笔记day20 [81]-[85] 可视化基准测试、单例模式、小字符串优化sso、跟踪内存分配、左值与右值
  • 蓝桥杯B组Java省赛强化
  • Cribl (实验) vpc-flow 数据抽样
  • 中科院1区顶刊Expert Systems with Applications ESO:增强型蛇形算法,性能不错
  • LeetCode -- Flora -- edit 2025-04-16
  • Numpy常用库方法总结
  • Langchain + Gemini API调用基本操作
  • MGR实现mysql高可用性
  • JVM:垃圾回收
  • JVM:运行时数据区和线程
  • wordpress主题 网站大全/今日国内新闻头条大事
  • 响应式网站建设信息/广州疫情最新消息
  • 西安网站建设雄账号/自有品牌如何推广
  • 衢州网站建设衢州/郑州做网站哪家好
  • 443是端口网站建设/郑州百度推广代运营
  • 彩票网站搭建多钱/搜狗收录提交入口网址