我的试用分几个方面,首先是按照常规的思路去完成模块的驱动,驱动是否成功以能否进行ping为准测试。
本次的使用模块的情况以及开发环境 模块:
选择这个板子的原因: 开始选择的板子因为在跑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)整个函数:
- void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
- {
- GPIO_InitTypeDef GPIO_InitStruct = {0};
- if(spiHandle->Instance==SPI1)
- {
- /* USER CODE BEGIN SPI1_MspInit 0 */
- /* USER CODE END SPI1_MspInit 0 */
- /* SPI1 clock enable */
- __HAL_RCC_SPI1_CLK_ENABLE();
- __HAL_RCC_GPIOA_CLK_ENABLE();
- /**SPI1 GPIO Configuration
- PA5 ------> SPI1_SCK
- PA6 ------> SPI1_MISO
- PA7 ------> SPI1_MOSI
- */
- GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_NOPULL;
- GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
- GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
- HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
- /* USER CODE BEGIN SPI1_MspInit 1 */
- /* USER CODE END SPI1_MspInit 1 */
- }
- }
复制代码
将整个函数的内容添加到RTT的项目的board.c中。
更换时钟初始化函数,使用经过CubeMx初始化的时钟函数。
打开main.c找到void SystemClock_Config(void)函数,复制里面的所有内容:
- RCC_OscInitTypeDef RCC_OscInitStruct = {0};
- RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
- /** Configure the main internal regulator output voltage
- */
- __HAL_RCC_PWR_CLK_ENABLE();
- __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
- /** Initializes the RCC Oscillators according to the specified parameters
- * in the RCC_OscInitTypeDef structure.
- */
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
- RCC_OscInitStruct.HSIState = RCC_HSI_ON;
- RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
- RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
- RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
- RCC_OscInitStruct.PLL.PLLM = 8;
- RCC_OscInitStruct.PLL.PLLN = 168;
- RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIv2;
- RCC_OscInitStruct.PLL.PLLQ = 4;
- if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
- {
- Error_Handler();
- }
- /** Initializes the CPU, AHB and APB buses clocks
- */
- RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
- RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
- RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
- RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
- RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
- if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
- {
- Error_Handler();
- }
复制代码
替换在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构建。
|