1. 本次采用利尔达的CC3200模块,CC3200主时钟80M,内部没有flash,必须外接SPI Flash。本次测试采用利尔达科技的CC3200的底板和模块(左边)。烧写连接VCC, GND, RXD, TXD, SOP2, RST这6根线即可完成下载。串口下载的时候SOP2需要上拉,正常运行的时候SOP2留空。

2. 使用IAR工具打开工程,看下main代码,其中VStartSimpleLinkSpawnTask这个函数搞不明白是什么?SimpleLink是TI注册的一个商标,CC3200是CC3200SimpleLink™Wi-Fi

 void main()
{
long lRetVal = -;
// 板子初始化配置
BoardInit();
// 引脚复用配置
PinMuxConfig();
//初始化穿口
InitTerm();
// 启动SimpleLink Host
lRetVal = VStartSimpleLinkSpawnTask(SPAWN_TASK_PRIORITY);
if(lRetVal < )
{
ERR_PRINT(lRetVal);
LOOP_FOREVER();
}
// 启动 WlanAPMode 任务
lRetVal = osi_TaskCreate( WlanAPMode, \
(const signed char*)"wireless LAN in AP mode", \
OSI_STACK_SIZE, NULL, , NULL );
if(lRetVal < )
{
ERR_PRINT(lRetVal);
LOOP_FOREVER();
}
// 开始任务调度
osi_start();
}

3. 深入第一个函数去看看做了什么,创建了一个队列和一个任务,目前不知道这个任务是什么用途,其次2048的任务空间是从哪里分配的,作为栈的空间,任务切换的时候保存任务的当前环境变量。

 OsiReturnVal_e VStartSimpleLinkSpawnTask(unsigned portBASE_TYPE uxPriority)
{
xSimpleLinkSpawnQueue = xQueueCreate( slQUEUE_SIZE, sizeof( tSimpleLinkSpawnMsg ) );
if( == xSimpleLinkSpawnQueue)
{
return OSI_OPERATION_FAILED;
}
if(pdPASS == xTaskCreate( vSimpleLinkSpawnTask, ( portCHAR * ) "SLSPAWN",\
(/sizeof( portSTACK_TYPE )), NULL, uxPriority, &xSimpleLinkSpawnTaskHndl ))
{
return OSI_OK;
}
return OSI_OPERATION_FAILED;
}

4. 延伸一个问题,任务里面的临时变量和数据还有任务里面的malloc,是从任务创建时候分配的栈里面再分配的吗?书上说是堆栈空间,malloc是从堆里分配的,2048/sizeof( portSTACK_TYPE )单位是字,4个字节,所以实际要乘以4的。

5. STM32有2个栈指针,MSP,PSP,一个是系统堆栈指针MSP,一个是任务堆栈指针PSP,任务堆栈用来做什么?保存局部变量,函数嵌套,任务切换的时候保存内核寄存器(保存在栈的高地址)和任务当前的状态(局部变量保存在低地址)。堆栈大小应该怎么去计算。任务里面的局部变量是保存在任务的栈里面的。

6. 继续看这个代码,一直循环接收队列,tSimpleLinkSpawnMsg Msg;这个应该是给wifi网络处理器返回应用处理器的消息队列。这个结构体有2个参数,一个函数和一个数据,都是通过队列传送的。

 void vSimpleLinkSpawnTask(void *pvParameters)
{
tSimpleLinkSpawnMsg Msg;
portBASE_TYPE ret=pdFAIL;
for(;;)
{
ret = xQueueReceive( xSimpleLinkSpawnQueue, &Msg, portMAX_DELAY );
if(ret == pdPASS)
{
Msg.pEntry(Msg.pValue);
}
}
}

7. 看下AP模式的设置代码

void WlanAPMode( void *pvParameters )
{
int iTestResult = ;
unsigned char ucDHCP;
long lRetVal = -;
InitializeAppVariables();
//恢复成默认模式
lRetVal = ConfigureSimpleLinkToDefaultState();
if(lRetVal < )
{
if (DEVICE_NOT_IN_STATION_MODE == lRetVal)
UART_PRINT("Failed to configure the device in its default state \n\r");
LOOP_FOREVER();
} UART_PRINT("Device is configured in default state \n\r");
//启动网络
lRetVal = sl_Start(NULL,NULL,NULL); if (lRetVal < )
{
UART_PRINT("Failed to start the device \n\r");
LOOP_FOREVER();
} UART_PRINT("Device started as STATION \n\r");
//配置成AP模式
if(lRetVal != ROLE_AP)
{
if(ConfigureMode(lRetVal) != ROLE_AP)
{
sl_Stop(SL_STOP_TIMEOUT);
LOOP_FOREVER();
}
}
//AP模式下,是否获取到自己的IP地址
while(!IS_IP_ACQUIRED(g_ulStatus))
{
//looping till ip is acquired
} unsigned char len = sizeof(SlNetCfgIpV4Args_t);
SlNetCfgIpV4Args_t ipV4 = {}; // 获取网络配置
lRetVal = sl_NetCfgGet(SL_IPV4_AP_P2P_GO_GET_INFO,&ucDHCP,&len,
(unsigned char *)&ipV4);
if (lRetVal < )
{
UART_PRINT("Failed to get network configuration \n\r");
LOOP_FOREVER();
} //等待STA设备连接,并给STA分配IP地址
while(!IS_IP_LEASED(g_ulStatus))
{
}
//和STA设备建立TCP连接
lRetVal = BsdTcpClient(PORT_NUM);
if(lRetVal < )
{
UART_PRINT("TCP Client failed\n\r");
LOOP_FOREVER();
}
while();
}

查看下AP模式的设置函数

 static int ConfigureMode(int iMode)
{
char pcSsidName[] = "cc3200_tcptest";
long lRetVal = -; //设置为AP模式
lRetVal = sl_WlanSetMode(ROLE_AP);
ASSERT_ON_ERROR(lRetVal);
//设置AP模式的SSID
lRetVal = sl_WlanSet(SL_WLAN_CFG_AP_ID, WLAN_AP_OPT_SSID, strlen(pcSsidName),
(unsigned char*)pcSsidName);
ASSERT_ON_ERROR(lRetVal); UART_PRINT("Device is configured in AP mode\n\r"); /* Restart Network processor */
lRetVal = sl_Stop(SL_STOP_TIMEOUT); // reset status bits
CLR_STATUS_BIT_ALL(g_ulStatus);
return sl_Start(NULL,NULL,NULL);
}

8. 这个工程包含了3个库文件,其中simplelink.a比较特殊,在SDK中找个这个相关工程并打开。问题是sl_start究竟是启动的什么?和wifi网络处理器怎么通信的?

 $PROJ_DIR$/../../../simplelink/ewarm/OS/Exe/simplelink.a
$PROJ_DIR$/../../../driverlib/ewarm/Release/Exe/driverlib.a
$PROJ_DIR$/../../../oslib/ewarm/free_rtos/Exe/free_rtos.a

9. 继续下一步

 _i16 sl_WlanSetMode(const _u8    mode)
{
_SlwlanSetModeMsg_u Msg;
Msg.Cmd.mode = mode;
VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanSetModeCmdCtrl , &Msg, NULL));
return (_i16)Msg.Rsp.status;
}

10. 研究下,应用处理器是怎么给wifi网络处理器发数据的,不过以下可能有错误的

 //以sl_WlanSet为例子,以下层层调用,最后通过SPI接口发出
第1步:sl_WlanSet
第2步:VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlWlanSetModeCmdCtrl , &Msg, NULL));
第3步:_SlDrvMsgWrite
第4步:NWP_IF_WRITE_CHECK
第5步:spi_Write
第6步:spi_Write_CPU

11. 用uniflash烧写测试一下,不过下次要花时间研究下CC3200的内存分配了,涉及到串口升级,OTA升级等

12. 需要在电脑上建立一个tcp server测试一下,以前测试CC3200的TCP传输速度只有100KB每秒不知道原因,有机会要再次测试一下。

最新文章

  1. 如何删除webstrom中生成的.idea wrokspace
  2. wps恢复经典模式
  3. 试听笔记:javascript入门精通
  4. 比较常用的几个maven第三方镜像
  5. php 连续留存与留存人数计算
  6. 使用mvvm框架avalon开发公司内部运营管理系统的一些心得
  7. ArcGIS 读写lyr层文件
  8. .NET连接MySQL数据库的方法实现
  9. It appears as though you do not have permission to view information for any of the services you requested
  10. Rules
  11. 【mac osx安装opencv,python总结】
  12. Android事件分发理解
  13. oracle数据库表实现主键自增功能
  14. 关于vue生命周期
  15. MQ消息队列配置
  16. [转]matplotlib - plt.rcParams、matshow/cmap/坐标轴设置
  17. 壁虎书2 End-to-End Machine Learning Project
  18. 在项目中使用react
  19. 20155209 林虹宇 Exp 8 Web基础
  20. DOM对象模型

热门文章

  1. bzoj2331 [SCOI2011]地板
  2. Python小技巧:使用*解包和itertools.product()求笛卡尔积
  3. Centos 7 安装Anaconda3
  4. Web网站高并发量的解决方案
  5. 我的第一个C++程序
  6. jpa的修改更新操作
  7. PAT——1003. 我要通过!
  8. 将Tomcat设置为windows自动启动的服务
  9. Redis笔记 -- 在 Centos7.4单机中部署Redis集群(二)
  10. Crash for small compressed texture on some Android device