GD32F103系列使用ST的HAL库

GD32F103系列使用ST的HAL库

说明

由于STM32芯片的涨价,找来了存货GD32进行替代,发现板子无法进行正常复位烧录程序,复位后复位引脚偶尔处于0.9V左右,就,很玄学

作者:Jack_GL
时间:2021年9月8日
版本:V1.0
上次修改时间:无

硬件层面

硬件层面需改动BOOT0接10K下拉,GD32工作的条件苛刻于STM32,对于信号线尽量短与包地做屏蔽

软件层面

由于启动时间的不一样,在代码生成后将晶振延时时间改长,笔者当前使用的HAL库版本为1.8.4,(有可能由于版本不一样位置会不一样),修改stm32f1xx_hal_conf.h中的宏定义 HSE_STARTUP_TIMEOUT 后的数值,原本为100u,笔者直接该到了999u,如下图所示:
修改位置
完成!目前笔者验证的HAL进行串口通信、硬件SPI通信,暂时没有发现异常情况。

使用STM32F103RCT6驱动W5500,你需要使用W5500的数据手册,了解其寄存器映射和通信协议。然后,使用HAL库的SPI接口,通过SPI总线与W5500进行通信。 下面是一个简单的示例代码,使用HAL库的SPI接口驱动W5500: ```c #include "stm32f1xx_hal.h" #define W5500_SPI hspi1 #define W5500_CS_GPIO_Port GPIOA #define W5500_CS_Pin GPIO_PIN_4 void W5500_WriteReg(uint16_t addr, uint8_t val) { uint8_t txData[3] = {0xF0, (uint8_t)(addr >> 8), (uint8_t)addr}; HAL_GPIO_WritePin(W5500_CS_GPIO_Port, W5500_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&W5500_SPI, txData, 3, HAL_MAX_DELAY); HAL_SPI_Transmit(&W5500_SPI, &val, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(W5500_CS_GPIO_Port, W5500_CS_Pin, GPIO_PIN_SET); } uint8_t W5500_ReadReg(uint16_t addr) { uint8_t txData[3] = {0x0F, (uint8_t)(addr >> 8), (uint8_t)addr}; uint8_t rxData; HAL_GPIO_WritePin(W5500_CS_GPIO_Port, W5500_CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&W5500_SPI, txData, 3, HAL_MAX_DELAY); HAL_SPI_Receive(&W5500_SPI, &rxData, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(W5500_CS_GPIO_Port, W5500_CS_Pin, GPIO_PIN_SET); return rxData; } int main(void) { HAL_Init(); // 初始化SPI __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_SPI1_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); SPI_HandleTypeDef hspi1; hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 10; HAL_SPI_Init(&hspi1); // 初始化W5500 __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = W5500_CS_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(W5500_CS_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_WritePin(W5500_CS_GPIO_Port, W5500_CS_Pin, GPIO_PIN_SET); W5500_WriteReg(0x0004, 0x01); // 初始化W5500 while (1) { // 读取W5500的状态寄存器 uint8_t status = W5500_ReadReg(0x0008); // TODO: 处理状态寄存器的值 } } ``` 在这个示例代码中,我们定义了`W5500_SPI`为使用的SPI总线,`W5500_CS_GPIO_Port`和`W5500_CS_Pin`为W5500的CS引脚所连接的GPIO端口和引脚号。然后我们定义了`W5500_WriteReg`和`W5500_ReadReg`两个函数,分别用于向W5500的寄存器中写入数据和读取数据。在`main`函数中,我们初始化了SPI总线和W5500,并在一个循环中读取W5500的状态寄存器。 你可以根据自己的需要修改这个示例代码,实现自己的功能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值