天南地北客
发表于: 2018-5-8 11:51:40 | 显示全部楼层

最近在做一款电池供电的无线终端,电路里面使用到了STM32F103和MXIC公司的存储器MX25L128。底层驱动采用STM32CubeMX自动生成,并且测试OK,现在将配置过程以及调试过程中的经验写出来给大家分享一下。

MX25L128通过SPI3总线连接导STM32F103微控制器,CS片选选择采用GPIO软件模拟的方式。连接方式如下:

MX25L128 connection.png


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配置.png

然后我们在SPI3配置中,选择帧格式为Motorola,数据长度为8位,传输首位位MSB先。设置SPI总线时钟的分频系数为4分频,这样波特率为9.0 Mbit/s。接下来我们设置时钟信号的相位和极性。MX25L128支持模式1和模式3操作,我们选择的是模式3,也就是CPOL选择为High,CPHA选择2 Edge。其他选项保持默认状态。

spi3 config.png

接下来,我们在GPIO引脚配置中,设置PD7的用户标签为SPI3_CS,同时设置输出电平为High,这样SPI存储器默认不被选中。


最后我们选择RCC中的HSE使用外部8M晶振,SYS中的Debug选择Serial wire调试模式。USART1选择异步通讯模式,采用默认的配置,该外设用于实现printf打印输出功能。在时钟配置中,设定主时钟HCLK为72MHz。完整的引脚配置如下:

pin out.png

点击菜单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, 下载次数: 84)


将附件复制到工程目录Driver文件夹中。在工程目录中添加一个组,重命名为Drivers/BSP/ZQ1102,将mx25l128.c添加到该组中。

keil group.png

在工程的目标选项中,将../Drivers/BSP/ZQ1102添加到工程Include Path路径中。


接下来是修改main.c文件。在/* USER CODE BEGIN Includes */和/* USER CODE END Includes */ 之间添加所需的头文件。

  1. /* USER CODE BEGIN Includes */
  2. #include "mx25l128.h"
  3. /* USER CODE END Includes */
复制代码

在  /* USER CODE BEGIN 2 */和 /* USER CODE END 2 */ 之间添加MX25存储芯片的测试函数。

  1.   /* USER CODE BEGIN 2 */
  2. BSP_MX25Lx_Test();
  3.   /* USER CODE END 2 */
复制代码

在/* USER CODE BEGIN 4 */和/* USER CODE END 4 */ 之间添加以下代码,实现printf函数。

  1. /* USER CODE BEGIN 4 */
  2. #ifdef __GNUC__
  3.   /* With GCC/RAISONANCE, small printf (option LD Linker->Libraries->Small printf
  4.      set to 'Yes') calls __io_putchar() */
  5.   #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  6. #else
  7.   #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  8. #endif /* __GNUC__ */
  9. /**
  10.   * @brief  Retargets the C library printf function to the USART.
  11.   * @param  None
  12.   * @retval None
  13.   */
  14. PUTCHAR_PROTOTYPE
  15. {
  16.   /* Place your implementation of fputc here */
  17.   /* e.g. write a character to the EVAL_COM1 and Loop until the end of transmission */
  18.   HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF);

  19.         ;
  20.         
  21.   return ch;
  22. }
  23. /* USER CODE END 4 */
复制代码

修改完成后,重新编译,并下载到电路板中运行。在计算机打开串口软件,就能看到测试信息了。


整个过程如上所述。我在调试过程中走了一些弯路,总是调试不成功。ARM内核中都内置了ITM功能,可以通过仿真器实现printf功能,而PB3的复用功能就是TRACESWO引脚,因此与SPI3总线冲突,SPI3和ITM不能同时实现,如果在keil软件中的Debug->Setting->Trace中启用了Trace Enable,不管硬件有没有作为ITM连接,都会导致SPI3总线通讯异常。

跳转到指定楼层
hly7070
发表于: 2023-11-23 15:55:21 | 显示全部楼层

感谢楼主分享
回复

使用道具 举报

penny
发表于: 2023-12-15 14:50:21 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 28 | 回复: 50



手机版|

GMT+8, 2024-4-24 14:53 , Processed in 0.041098 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表