本篇详细的记录了如何使用STM32CubeMX配置STM32F103C8T6的硬件SPI外设与DW1000通信,为移植DW1000官方驱动打下基础。

1. 准备工作

硬件准备

  • 开发板

首先需要准备一个开发板,这里我准备的是STM32L4的开发板(BearPi):
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_STM32实战系列教程

  • DW1000模块

这里我连接到DW1000官方评估板上,直接与DW1000芯片通信:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_UWB_02

  • 连接方法

首先查看DW1000官方评估板预留的外接控制器SPI接口(J6接口)的引脚说明:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_DW1000_03
外部供电接口(J7)的引脚说明:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_STM32实战系列教程_04

首先将DW1000官方评估板上的S1、S2拨码开关全部拨为OFF,这样配置之后才可以外接控制器。

② 按照下图选择端子,配置为外部供电方式:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_UWB_05

③ 在本文的测试需要中,将这些接口中的SPI相关接口(CSn、SCK、MISO、MOSI)连接到小熊派的SPI接口即可,但是为了以后移植驱动方便,将WAKEUP、IRQ接口也连接到小熊派的普通GPIO即可。

④ 将板子上J7处的供电引脚连接到小熊派的5V供电处。

整体连接完成后如图:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_DW1000_06

软件准备

  • 需要安装好Keil - MDK及芯片对应的包,以便编译和下载生成的代码;
  • 准备一个串口调试助手,这里我使用的是Serial Port Utility
2.生成MDK工程

选择芯片型号

打开STM32CubeMX,打开MCU选择器:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_STM32实战系列教程_07

搜索并选中芯片STM32L431RCT6:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_STM32_08

配置时钟源

  • 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
  • 如果使用默认内部时钟(HSI),这一步可以略过;

这里我都使用外部时钟:

DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_HAL_09

配置DW1000控制GPIO

按照之前所述,DW1000模块需要额外配置的GPIO有两个:

以太网模块引脚名 GPIO 作用
WAKEUP PA8 DW1000唤醒引脚
IRQ PC9 中断引脚

唤醒引脚配置为输出模式即可:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_STM32实战系列教程_10

中断引脚需要接收来自DW1000的中断,所以需要配置EXTI外部中断引脚:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_DW1000_11

配置SPI1接口

本实验中,我将DW1000模块接到了SPI1接口,引脚对应表如下:

需要注意,SPI片选引脚不通过硬件SPI外设来控制,而是配置为普通GPIO,手动控制

以太网模块引脚 MCU引脚
MISO PA6(SPI1_MISO)
MOSI PA12(SPI1_MOSI)
SCS PA4(SPI1_NSS)
SCLK PA1(SPI1_SCK)

配置SPI接口的时候有三个需要注意的点:

① 分频系数;
② CPOL:CLK空闲时候的电平为高电平或者低电平;
③ CPHA:在第1个时钟边缘采样,还是在第2个时钟边缘采样;

接下来开始配置SPI1外设,首先配置SPI1外设的模式和引脚:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_STM32_12
因为选择了不使用硬件SPI外设控制片选引脚,所以需要手动配置片选引脚PA4:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_HAL_13
DW1000手册中给出的SPI总线时钟为稳定后20Mhz,否则3Mhz,本文中配置为3Mhz以下;

对于SPI工作模式,DW1000四种模式都支持,默认为模式0,选择CPOL空闲时为LOW的模式,CPHA手册中给出为第一个时钟沿;

综上所述,时序参数配置如下:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_DW1000_14

配置串口

开发板板载了一个CH340z换串口,连接到USART1。

接下来开始配置USART1
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_DW1000_15

配置时钟树

STM32L4的最高主频到80M,所以配置PLL,最后使HCLK = 80Mhz即可:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_DW1000_16

生成工程设置

DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_UWB_17

代码生成设置

最后设置生成独立的初始化文件:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_HAL_18

生成代码

点击GENERATE CODE即可生成MDK-V5工程:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_STM32_19

3. 重定向printf函数到USART1

参考:【STM32Cube_09】重定向printf函数到串口输出的多种方法

4. DW1000测试函数

要测试DW1000是否正常工作,只需要测试是否可以通过SPI总线读取器件ID即可。

在main.c中添加头文件:

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
/* USER CODE END Includes */

添加测试函数:

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint32_t dw1000_read_device_id(void)
{
	HAL_StatusTypeDef status;
	uint8_t header = 0x00;
	uint32_t device_id;

	
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
	
	status = HAL_SPI_Transmit(&hspi1,&header, 1, 1000);
	if (status != HAL_OK) {
		printf("send header fail, err is %d\r\n", status);
		return 0;
	}
	
	status = HAL_SPI_Receive(&hspi1, (uint8_t *)&device_id, 4, 500);
	if (status != HAL_OK) {
		printf("read device id fail, err is %d\r\n", status);
		return 0;
	}
	
	return device_id;
}

/* USER CODE END 0 */

接着在main函数中定义测试变量:

/* USER CODE BEGIN 1 */
uint32_t device_id;
/* USER CODE END 1 */

在main函数中调用测试函数:

/* USER CODE BEGIN 2 */
printf("DW1000 UWB ic port on BearPi board By Mculover666\r\n");

device_id = dw1000_read_device_id();
if (device_id != 0) {
	printf("device id is 0x%8x\r\n", device_id);
} else {
	printf("device id read fail\r\n");
}
 /* USER CODE END 2 */

编译,下载到开发板中,运行,在串口助手查看读取结果,若能正常读取到器件ID(0xDECA0130)则证明可以正常与DW1000通信:
DW1000开发笔记(二)使用STM32硬件SPI+STM32cubeMX+HAL库测试DW1000通信_STM32_20
至此,DW1000测试完成,下节将移植DW1000官方驱动。