发 帖  
原厂入驻New
[经验]

【睿赛德 RW007 WiFi 模块试用连载】 WiFi模块驱动&踩坑过程

2021-7-8 00:15:46  591 WiFi stm32 RT-Thread
分享
0
我的试用分几个方面,首先是按照常规的思路去完成模块的驱动,驱动是否成功以能否进行ping为准测试

本次的使用模块的情况以及开发环境
模块:
STM32F407ZGT6
选择这个板子的原因:
开始选择的板子因为在跑RTT标准版的时候说内存不够,就只好放弃那个板子,选择了这个F4内存更大的板子,并且F4的板子的资源也多,可以在后期扩展功能的时候更方便。
F407ZGT6的相关介绍:
Core:
frequency up to 168MHz ,memory protection unit,210 DMIPS/1.25 DMIPS/MHz and DSP instruction.
Memory:
- Up to 1 Mbyte of Flash memory.
- Up to 192+4 Kbytes of SRAM including 64 Kbytes of CCM data RAM.
- 512 bytes of OTP memory.
- Flexible static memory controller supporting Compact Flash,SRAM, psram NOR and NAND memories.
  
开发环境:
Windows 10
MDK-5.32
Putty 最新版本
RT-Thread的最新版本
CubeMx软件(在项目配置前自行配置好软件的开发过程)
烧录器:
使用的是DAP-Link
下载速度比较快,用的也是SWD模式

驱动过程
本次使用的是官方的RT-Thread Studio软件进行开发,目的是到可以成功ping通一个网站,并能够使用指令查询连接状态和分配的IP地址。在项目的配置过程中也遇到了一些项目设置的问题,接下来随着项目的配置我慢慢说。
这里我就以STM32F407ZGT6的配置为例,进行RW007模块的简单驱动。

1、打开Studio软件,点击左上角的文件->新建->RT-Thread 项目


在这里,我的项目设置名称为STM32F407ZGT6_RW007,选板子型后设置调试器为DAP-Link 。
2、等待项目构建完成后,首先编译、下载到板子中测试是否可以正常工作

如果没有发现编译那个锤子logo可以按照下图所示的方法打开


点击菜单栏上的窗口->外观->显示工具栏,打开后就会在菜单栏下面多出一行,其中就会有锤子(编译按钮)和下载(烧录按钮)

编译完成后,执行烧录。

编译结果,在控制台打印:


烧录成功:

给板子连接上串口,查看输出情况:

我这里使用的是DAP-Link的虚拟窗口,使用putty的serila功能进行查看。依据自己的波特率和串口进行设置,可以看到板子正常打印日志和版本信息,按下Tab键或者键入help后可以正常打印相关的帮助指令。

3、添加RW007的软件包

点击项目名称下的RT-Thread Settings 软件会加载一会并在右边加载一个设置窗口。


点击立即添加按钮,会弹出一个窗口,可以搜索软件包。

在搜索框中输入RW007,点击搜索,最后会出来一个这个,点击添加即可。

关闭窗口,随手点击保存,等待软件重新加载并构建软件包。


构建完成后此时还不能直接驱动,需要继续配置文件。

4、增删改项目文件
本次项目使用的是RW007联网模块,查看数据手册后知道,可以使用SPI协议驱动这个模块,那么咱们就开始配置吧。

a、去掉drivers文件夹下的board.h文件第120行(你的文件不一定是这一行)的#define BSP_USING_SPI1的注释 (使能SPI相关功能)

同时,你可以阅读上面的说明。

去掉drivers文件夹下的stm32f4xx_hal_conf.h中第76行的注释#define HAL_SPI_MODULE_ENABLED(使能编译SPI相关代码)

b、打开CubeMx软件,根据你的板子的型号创建一个MDK工程,创建工程的目的是需要进行文件的添加和替换。

打开CubeMx软件,选择型号,进行时钟和外设的配置,配置的外设为SPI1。


然后继续接下来的流程,生成MDK项目,并打开定位到spi.c文件中,并复制void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)整个函数:





    1. void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
    2. {
    3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    4.   if(spiHandle->Instance==SPI1)
    5.   {
    6.   /* USER CODE BEGIN SPI1_MspInit 0 */
    7.   /* USER CODE END SPI1_MspInit 0 */
    8.     /* SPI1 clock enable */
    9.     __HAL_RCC_SPI1_CLK_ENABLE();
    10.     __HAL_RCC_GPIOA_CLK_ENABLE();
    11.     /**SPI1 GPIO Configuration
    12.     PA5     ------> SPI1_SCK
    13.     PA6     ------> SPI1_MISO
    14.     PA7     ------> SPI1_MOSI
    15.     */
    16.     GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    17.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    18.     GPIO_InitStruct.Pull = GPIO_NOPULL;
    19.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    20.     GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    21.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    22.   /* USER CODE BEGIN SPI1_MspInit 1 */
    23.   /* USER CODE END SPI1_MspInit 1 */
    24.   }
    25. }


    复制代码



将整个函数的内容添加到RTT的项目的board.c中。

更换时钟初始化函数,使用经过CubeMx初始化的时钟函数。

打开main.c找到void SystemClock_Config(void)函数,复制里面的所有内容:




  1. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  2.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  3.   /** Configure the main internal regulator output voltage
  4.   */
  5.   __HAL_RCC_PWR_CLK_ENABLE();
  6.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  7.   /** Initializes the RCC Oscillators according to the specified parameters
  8.   * in the RCC_OscInitTypeDef structure.
  9.   */
  10.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  11.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  12.   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  13.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  14.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  15.   RCC_OscInitStruct.PLL.PLLM = 8;
  16.   RCC_OscInitStruct.PLL.PLLN = 168;
  17.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIv2;
  18.   RCC_OscInitStruct.PLL.PLLQ = 4;
  19.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  20.   {
  21.     Error_Handler();
  22.   }
  23.   /** Initializes the CPU, AHB and APB buses clocks
  24.   */
  25.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  26.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  27.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  28.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  29.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  30.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
  31.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  32.   {
  33.     Error_Handler();
  34.   }

复制代码

替换在RTT项目的drv_clk.c中的void system_clock_config(int target_freq_mhz)内容。

c、完成上述操作后还是回到Studio 现在需要打开软件包的相关设置


依旧是双击RT-Thread Settings,点击出现的更多配置:


打开RW007的使用和WiFi框架的使用:


此时,返回到软件包主界面,进入到RW007的详细设置界面:


进入配置界面后,按照图中的说明进行配置。


下面说一下这写引脚对应的数字是什么含义:

数字对应的含义就是引脚的序号,在RT-Thread的代码中针对不同的引脚进行了编号,这个规则在drivers的drv_gpio.c中

可以看到本次设置的几个引脚对应的编号。
d、完成上述的一切操作后直接保存,等待软件的重构,然后点击编译按钮,查看现象。
然后你就会发现报错了,哈哈哈哈哈。

这是因为在勾选RW007的SPI使能后会自动加上一个RW009的驱动代码,因此找到那个驱动代码的地方并删除就好了。

那个代码就在报错的位置,依次展开代码并删除红框中的代码即可。

再次编译你就会发现神奇般地成功了。


e、接下来就是板子和模块的连线操作

连接成功后编译代码并烧录到板子中。
对了,记得注释掉主函数中的LOG打印函数。

f、接下来就是查看现象和测试指令

可以看到rw007 sn和version打印出来了
输入wifi

可以查看到一些提示指令

其中:

wifi scan 是扫描周围存在的wifi


wifi join 是加入到热点,加入到我自己的热点0000

可以看到已经成功加入到wifi其中也打印了IP地址
wifi disc是断开当前的连接

wifi status 是查看wifi的状态


接下来执行ping的操作


到此,完成了ping的操作,完成了RW007的初步驱动。

踩坑过程
1、有关模块的供电问题
我开始的时候用的是正点原子的探索者的板子,使用上面的5V的电源进行供电,接的是模块的5V和板子的5V,这个还都挺正常的,但是后来我换了一个板子就发现接上5V的引脚就没反应,后来我使用万用表测量了才知道,是我的这个后来的板子的5V的电源电压偏低了,在4.7V左右,这才导致模块的供电不够,这个模块的供电电压得至少在5V才行。
然后我看到这个模块上还有一个3.3V,然后我这个板子上也有3.3V我就转接到3.3V上了,这个就没有任何问题。

直到我看了模块的原理图,发现5V的引脚根本就没有接东西,所以说稚嫩用3.3V供电的。具体原理图如下图所示:


图 供电部分的原理图
如果你在使用这个模块的过程中也遇到了一些玄学的问题,比方说打印数据有问题,或者模块不能启动等等,那就看看供电电源是否有问题。
2、有关板子的选择
在最开始,收到板子的时候发现这个板子的引脚兼容Arduino的口,刚巧我手里有一块STM32G070RBT6的nucleo的板子,配这个模块也刚刚好,它俩刚好可以对上,我就想着用这个模块试试。可是在后期的配置项目的过程中,使用RTThead进行驱动的配置就出现问题了,从报错上看应该是这个板子的内存不够用,标准版的代码跑不起来,所以就放弃了。刚好手里还有一个STM32F407ZGT6的最小系统,就选择使用这个板子了。
3、使用putty后板子的串口就什么数据也打印不出来
使用正点原子的探索者就不能用putty,但是我用我的最小系统板子就可以,这个具体啥原因也没找到。

补充
这个版本是在以前的修改的基础上,不再新建CubeMx的项目,而是直接使用RT-Thread Studio的CubeMx上进行设置和修改。

双击Studio的CubeMx,等待控制台数据跑完就打开了。


图 CubeMx在打开中

接下来就是设置一些需要的外设,和时钟等的初始化的设置。

使用这个配置的话就不需要额外地创建项目,不需要再对Stduio的文件进行增删改,只需要点击配置生成代码即可,就完成了需要的外设的初始化。


图 CubeMx的需要设置的项目(简示)

设置CubeMx也只是打开需要的外设,进行初始化罢了。


图 CubeMx的有关的时钟设置


图 CubeMx的有关项目生成设置(1)


图 CubeMx的有关项目生成设置(2)

需要注意的地方必须注意,具体都在图片的红字中说明了,剩下的就直接在Studio中接着配置了,就接着设置了。

每次代码生成后都需要主动关闭软件,这样才能让Studio构建。

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /9 下一条

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