|
最近在做一款电池供电的无线终端,电路里面使用到了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总线通讯异常。 |