| 最近在做一款电池供电的无线终端,电路里面使用到了STM32F103和MXIC公司的存储器MX25L128。底层驱动采用STM32CubeMX自动生成,并且测试OK,现在将配置过程以及调试过程中的经验写出来给大家分享一下。 MX25L128通过SPI3总线连接导STM32F103微控制器,CS片选选择采用GPIO软件模拟的方式。连接方式如下: 
  
 STM32CubeMX生成HAL驱动的过程 首先是新建一个工程,在MCU Selector中选择STM32F103VETx。然后在Pinout选项卡中对使用到的引脚进行配置,测试代码中只修改了SYS、RCC、SPI3和USART1的相关引脚。 
 配置SPI3外设。SPI3总线的工作模式支持全双工、半双工主/从机模式,这里我们选择全双工主机Full-Duplex Master模式,不开启硬件NSS信号。STM32CubeMX自动将PB3配置位SPI3_SCK,PB4配置为SPI3_MISO,PB5配置为SPI3_MOSI。然后我们将PD7配置为GPIO输出模式,作为SPI3总线的片选引脚。 
  然后我们在SPI3配置中,选择帧格式为Motorola,数据长度为8位,传输首位位MSB先。设置SPI总线时钟的分频系数为4分频,这样波特率为9.0 Mbit/s。接下来我们设置时钟信号的相位和极性。MX25L128支持模式1和模式3操作,我们选择的是模式3,也就是CPOL选择为High,CPHA选择2 Edge。其他选项保持默认状态。 
  接下来,我们在GPIO引脚配置中,设置PD7的用户标签为SPI3_CS,同时设置输出电平为High,这样SPI存储器默认不被选中。 
 最后我们选择RCC中的HSE使用外部8M晶振,SYS中的Debug选择Serial wire调试模式。USART1选择异步通讯模式,采用默认的配置,该外设用于实现printf打印输出功能。在时钟配置中,设定主时钟HCLK为72MHz。完整的引脚配置如下: 
  点击菜单Project->Generate code...,软件弹出工程配置对话框,我们设置工程名为SPI_Flash Test,选择保存的文件夹。工具链采用MDK-ARM V5。点击OK,生成工程的代码。 
 工程文件配置 打开生成的工程,我们可以看到spi初始化函数位于stm32f1xx_hal_msp.c文件中,相关的SPI操作函数则位于stm32f1xx_hal_spi文件中。我们已经写好了MX25L128的底层驱动,您可以直接下载并且使用:
 BSP.rar
(3.52 KB, 下载次数: 95)
。 
 将附件复制到工程目录Driver文件夹中。在工程目录中添加一个组,重命名为Drivers/BSP/ZQ1102,将mx25l128.c添加到该组中。 
  在工程的目标选项中,将../Drivers/BSP/ZQ1102添加到工程Include Path路径中。 
 接下来是修改main.c文件。在/* USER CODE BEGIN Includes */和/* USER CODE END Includes */ 之间添加所需的头文件。 复制代码/* USER CODE BEGIN Includes */
#include "mx25l128.h"
/* USER CODE END Includes */
在  /* USER CODE BEGIN 2 */和 /* USER CODE END 2 */ 之间添加MX25存储芯片的测试函数。 复制代码  /* USER CODE BEGIN 2 */
BSP_MX25Lx_Test();
  /* USER CODE END 2 */
在/* USER CODE BEGIN 4 */和/* USER CODE END 4 */ 之间添加以下代码,实现printf函数。
 复制代码/* USER CODE BEGIN 4 */
#ifdef __GNUC__
  /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
     set to 'Yes') calls __io_putchar() */
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif /* __GNUC__ */
/**
  * @brief  Retargets the C library printf function to the USART.
  * @param  None
  * @retval None
  */
PUTCHAR_PROTOTYPE
{
  /* Place your implementation of fputc here */
  /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);
 
        ;
        
  return ch;
}
/* USER CODE END 4 */
修改完成后,重新编译,并下载到电路板中运行。在计算机打开串口软件,就能看到测试信息了。 
 整个过程如上所述。我在调试过程中走了一些弯路,总是调试不成功。ARM内核中都内置了ITM功能,可以通过仿真器实现printf功能,而PB3的复用功能就是TRACESWO引脚,因此与SPI3总线冲突,SPI3和ITM不能同时实现,如果在keil软件中的Debug->Setting->Trace中启用了Trace Enable,不管硬件有没有作为ITM连接,都会导致SPI3总线通讯异常。 |