利尔达CC3200模块第一篇之-wlan_ap例程测试
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每秒不知道原因,有机会要再次测试一下。
利尔达CC3200模块第一篇之-wlan_ap例程测试的更多相关文章
- 利尔达CC3200模块烧写程序笔记
1. 硬件使用利尔达的CC3200模块,仿真下载器使用利尔达的FTDI仿真器,硬件完全兼容官方的仿真器.仿真器支持IAR的调试,单步运行等操作. 2. 硬件连接接线说明: RXD, TXD, GNG, ...
- 利尔达NB-IOT模块烧写固件的步骤
1. NB-IOT是3个内核,用户开发的是A核,就是应用核,用Eclipse软件打开软件SDK之后,会生成一个bin文件(应用核的bin),现在就是要把bin文件合并到包里面(3个内核的bin),一起 ...
- 利尔达NB-IOT模块对接移动onenet平台步骤
1. 首先登陆浙江移动onenet网站,http://openiot.zj.chinamobile.com/,进入右上角的开发者中心,然后才能看到创建产品 2. 填写产品的信息,其他信息按照个人实际填 ...
- 利尔达仿真器加有人CC3200模块USR-C322上电测试
1. 使用利尔达的CC3200底板仿真器对有人CC3200模块USR-C322进行烧写,测试. 2. 连接的接口,需要连接6根线,如下,供电测试,第一波测试,输入+++回复a,然后在输入a,返回+OK ...
- tensorflow第一篇---numpy模块
写在前面: 自学tensorflow半个月,博友们给了我很多帮助,这是我第一篇原创的博文,我想把之前的知识梳理一遍,我会分享我一些在学习过程中遇到的问题,我目前只有这些......... 在介绍ten ...
- 【MM系列】SAP MM模块-基础配置第一篇
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-基础配置第一篇 ...
- 利尔达推出工控解决方式 串口转以太网模块LSD1ES-W5500_S2E0
利尔达最近推出工控解决方式,串口转以太网模块LSD1ES-W5500_S2E0,模块基于WIZnet-W5500. 同一时候,这也是利尔达科技集团成为WIZnet代理商后,自行推出的第一款基于WIZn ...
- 《javascript权威指南》读书笔记——第一篇
<javascript权威指南>读书笔记——第一篇 金刚 javascript js javascript权威指南 由于最近想系统学习下javascript,所以开始在kindle上看这本 ...
- 开博客这么久以来,第一篇技术文章,python与c的接口对接
在博客园开博客已经有了蛮长时间了,但是从来只是看别人的文章,自己却从未写过一篇技术文章,深表惭愧.内心还是希望能够给大家提供一些帮助的,希望这第一篇技术博客,能够给大家一些帮助.闲话少叙,开始正文. ...
随机推荐
- 用python实现矩阵转置
前几天群里有同学提出了一个问题:手头现在有个列表,列表里面两个元素,比如[1, 2],之后不断的添加新的列表,往原来相应位置添加.例如添加[3, 4]使原列表扩充为[[1, 3], [2, 4]],再 ...
- c#类中字段和方法中变量的声明问题
字段和局部变量的作用域冲突 某些情况下可以区分名称相同,作用域相同的两个标识符.原因是C#在变量之间有一个基本的区分,它把在类级别声明的变量看作 字段,而把在方法中声明的变量看作局部变量. class ...
- 使用js接收ajax解析的json再拼成一个自己想要的json
//ajax解析的json{ "status": 1, "content": { "pathsInfo": [ { "id&quo ...
- iview(DatePicker)时间转入后台少一天 解决方案
后台注解 前台: 加个事件 @on-change @on-change="getStartTime" getStartTime(starTime) { this.leaveReco ...
- Jmeter--JDBC请求(sqlserver)
做JDBC请求,首先要了解这个JDBC对象是什么,然后寻找响应的数据库连接URL和数据库驱动. 数据库URL:jdbc:sqlserver://200.99.197.190:1433;database ...
- 课时18.h标签和p标签以及hr标签(掌握)
如何在webstorm中利用快捷键创建一个新的html的文件? 同时按下键盘上的ctrl+alt+insert(windows) 同时按下键盘上的ctrl+alt+n(os) h标签系列(header ...
- c++11线程创建的三种方法
一.用一个初始函数创建一个线程 直接看代码:注意c++在运行一个可执行程序的时候(创建了一个进程),会自动的创建一个主线程,这个主线程和进程同生共死,主线程结束,进程也就结束了. #include & ...
- 竞赛题解 - [CF 1080D]Olya and magical square
Olya and magical square - 竞赛题解 借鉴了一下神犇tly的博客QwQ(还是打一下广告) 终于弄懂了 Codeforces 传送门 『题目』(直接上翻译了) 给一个边长为 \( ...
- 19-3-5Python中列表、元组、以及range
一.列表: 为什么要学列表? 因为字符串存在缺点: 1) 只能存储少量的数据. 2) 数据类型无论索引.切片 获取的都是字符串类型,类型过于单一,转化成它原来的类型还需要进一步转换 ...
- JS 创建对象总结
狭义:new 构造函数. (注:在JS中创建对象只有一种方式,就是new 构造函数.其中字面量的方式是一种语法糖,本质仍然是new 构造函数) 广义:工厂模式(解决复杂度) 构造函数模式(解决复杂度, ...