tag 标签: hed10w07sn

相关博文
  • 热度 18
    2015-3-16 18:38
    2174 次阅读|
    0 个评论
    WIFI模块(HED10W07SN)应用设计入门 以下系列帖子记录我学习WIFI模块(HED10W07SN)的过程和心得,以及为学生设计的入门指引。 主索引 方案设计 子系统实现组件设计 芯片资料学习 1、串口转WIFI 2、SPI音频转WIFI 3、SPI视频转WIFI 1、 基本I/O应用 2、定时任务和定时器 3、A/D 4、 串口通信 5、WIFI通信 6、SPI音频模块 0、参考硬件 1、 开发环境 2、接口函数   附件     参考链接    
  • 热度 18
    2015-3-16 18:37
    2628 次阅读|
    0 个评论
    串口通信应用设计 HED10W07SN模块有两个串口。厂家提供的参考实现中,串口0用于管理:AT指令、EM_WIFI程序下载、Boot Loader程序下载(超级终端);串口1可以用于AT指令解释也可以用于用户数据传输。 在我的封装实现中,为了避免冲突以及简化实现,也是因为初学避免引入bug,沿用厂家的配置方式:串口0用于管理,串口1仅用于用户数据传输。 帖子“开发环境”的附件中的工程“MyLearningProject_02”是串口封装和使用的例子。 封装好的串口接口函数在“MOD\include\modUart.h”中定义,实现代码在“MOD\source\modUartSimpleImpl.c”。 main.c是一个简单的应用例子,功能是在收到串口消息后,将消息回传并toggle LED。 注:串口消息的header格式为0x7e 0x7e length。 比如用串口精灵测试时,发送字符串“123”的方式为:用十六进制发送7e7e03313233 API使用方式: 在CreateUserTask()中初始化UART:     modUartInit(1,115200);     modUartSetRxCallback(myUartRxCallbackFunction); 第1句设置波特率,第2句设置回调函数。(回调函数的名称可以自己定义) 发送消息的例子: modUartSendPkt(1, 11, pWellcomeMsg); 第1个参数固定为1。(该API只支持UART1,不支持UART0) 第2个参数是分组长度,第3个参数是分组指针。 接收消息: 当底层代码收到完整的一个分组后,会调用用户定义的回调函数。 用户在回调函数编写自己的代码对收到的分组进行处理。例子: void myUartRxCallbackFunction(uint8 vUartNumber, uint8 vSize, uint8* vPacket){   //toggle led 0     modSetLedState(0,2);     //send it back     modUartSendPkt(1, vSize, vPacket); } 与接口实现方式相关的接口使用说明 1、串口接收回调函数是由单独的任务调用,不是在中断服务处理程序中调用,所以没有处理时限要求; 2、消息发送函数modUartSendPkt的实现采用同步发送方式,当分组数据全部向UART硬件发送完毕才返回;支持多线程;   modUart API的实现简介 注:下文中HAL层代表厂家提供的底层代码(不论是否硬件相关),MOD层代表我写的模块化代码。 一、底层函数的实现方式   芯片中断调用串口ISR函数tls_uart_isr: * 接收侧:tls_uart_isr从接收寄存器读入数据,放入接收FIFO,然后调用回调函数rx_callback(rx_callback由tls_uart_rx_register设置)。 * 发送侧: tls_uart_isr调用tls_uart_tx_chars从发送FIFO取数据,写入发送寄存器,FIFO半空时调用tx_callback;   二、接收API实现方式 modUartRxCallback()是供tls_uart_isr调用的回调函数。 modUartRxCallback()将数据放进缓冲区,然后发送一个消息MSG_UART_RECEIVE_DATA到消息队列mUart1TaskQueuePtr,然后返回(ISR流程结束)。 启动一个专门的任务modUartDataProcTask处理UART收到的数据。 modUartDataProcTask一直在等待消息队列mUart1TaskQueuePtr的消息,收到消息后调用modUart1RxFramingRoutine()进行帧界定。 modUart1RxFramingRoutine()从接收FIFO中逐字节读入数据,判断帧头、长度,读入足够数目的数据后,调用用户定义的接收回调函数。 所以,用户定义的接收回调函数是在modUartDataProcTask的线程中处理的。 三、发送API实现方式 modUartSendPkt()先调用tls_uart_write发送header字节,然后调用tls_uart_tx_sync()发送分组body。 底层提供的tls_uart_tx_sync()本身实现同步发送机制。   四、tls_uart_tx_sync()的实现 厂家文档中推荐应用调用的串口消息发送函数是:异步发送函数tls_uart_tx()和同步发送函数tls_uart_tx_sync()。 1、tls_uart_tx() tls_uart_tx()将发送的分组数据全部写入到HAL层的发送缓冲区中,未写入的部分保留在串口的数据结构中,由tls_uart_tx_cb继续写入(tls_uart_tx_cb由tls_uart_isr调用)。 * 将发送数据指针和发送长度保存在uart_port -buff_ptr和uart_port - buf_len中。 * 然后调用tls_uart_write()将数据写入HAL层的发送缓冲区。 * 设置发送中断回调函数为tls_uart_tx_cb(tls_uart_tx_register(TLS_UART_1, tls_uart_tx_cb);) * 然后调用tls_uart_tx_chars_start()将缓冲区的若干数据实际发送到UART硬件。 tls_uart_tx_cb负责将uart_port -buff_ptr中未写入HAL层发送缓冲区的数据写入缓冲区。 可见:tls_uart_tx不是线程安全的。 2、tls_uart_tx_sync() tls_uart_tx_sync()调用异步发送函数tls_uart_tx()发送消息; 然后创建并等待信号port-tx_sem:    err = tls_os_sem_create(port-tx_sem, 0);    tls_uart_tx(buf, len);    tls_os_sem_acquire(port-tx_sem, 0); tls_uart_tx_chars()在发送缓冲区空时,释放信号(tls_uart_tx_chars()由中服程序tls_uart_isr调用)     if (uart_circ_empty(xmit)) {     if(port-tx_sem)         tls_os_sem_release(port-tx_sem);         return;     } tls_uart_tx_sync()收到信号后,返回。     tls_os_sem_delete(port-tx_sem);     port-tx_sem = NULL; tls_uart_tx_chars()负责将发送缓冲区的数据写入UART硬件。 可见:tls_uart_tx_sync是线程安全的,但是效率低。 主索引 回教程首页 使用控件 控件设计       附件     参考链接    
  • 热度 21
    2015-3-16 16:42
    1884 次阅读|
    0 个评论
    基本I/O设计 芯片中没有与其它外设功能复用的GPIO引脚只有3个:GPIO11、GPIO12、GPIO13。 底层提供了相关的接口函数(wm_gpio.h)。常用的应用场合下使用的函数如下: 1、作为输入: 配置I/O引脚为输入:tls_gpio_cfg(gpio_pin, TLS_GPIO_DIR_INPUT, TLS_GPIO_ATTR_FLOATING); 读引脚电平:u16 ret; ret = tls_gpio_read(gpio_pin); 2、作为输出: 配置I/O引脚为输出:tls_gpio_cfg(gpio_pin, TLS_GPIO_DIR_OUTPUT, TLS_GPIO_ATTR_FLOATING); 控制引脚电平:tls_gpio_write(gpio_pin,0); 3、中断输入: 初始化:   tls_gpio_cfg(gpio_pin, TLS_GPIO_DIR_INPUT, TLS_GPIO_ATTR_PULLLOW);   tls_gpio_isr_register(demo_gpio_isr_callback,NULL);   tls_gpio_int_enable(gpio_pin, TLS_GPIO_INT_TRIG_RISING_EDGE); 注意:所有的中断输入引脚共用一个回调函数。 中断回调函数例子: void demo_gpio_isr_callback(void *context){   u16 ret;   ret = tls_get_gpio_int_flag(DEMO_ISR_IO);   printf("\nint flag =%d\n",ret);   if(ret) {     tls_clr_gpio_int_flag(DEMO_ISR_IO);     ret = tls_gpio_read(DEMO_ISR_IO);     printf("\nafter int io =%d\n",ret);   } } “开发环境”帖子附件中的例子工程中,MyLearningProject_01是一个简单的led闪烁的例子。main.c是应用代码,MOD\modHwExtSimpleImpl.c是实现代码(使用GPIO13,11)。 主索引 回教程首页   附件     参考链接    
  • 热度 23
    2015-3-16 16:40
    2737 次阅读|
    0 个评论
    开发环境 选择联盛德微电子的HED10W07SN模块入手进行学习是带点偶然的。 拿WIFI模块和CC2530结合做网关是很早就想做的事,但WIFI模块一直比较贵,去年发现价格突然降下来了,于是开始着手。心底有个态度是希望支持国产,看到HED10W07SN的推介新闻就在其网站上发了条询问的消息。发消息之前另外一个国产芯片也发了邮件,不过没有回应。期间在淘宝买了某个模块搭了环境,不知是否硬件有问题例程没跑起来。然后收到了联盛德微电子的工作人员的回复,还安排了热心的联系人给我技术支持,所以就用起来了。 发现它的文档和源代码都比较全面和规范,上手花费能控制在60元内,所以觉得是可以推荐给学生自己买来学的。 想做HED10W07SN模块的开发的话需要跟联盛德微电子的员工联系、注册、签保密协议,然后就能获得开发资料和工具了。 开发工具主要有3个:Keil作为编译环境、EM-WIFI是烧写工具(联盛德微电子自己的)、超级终端(windows自带的)作为特殊情况下的代码下载工具。 程序的架构是跑在ucOS上的,厂家已经提供了底层函数的大部分源代码和详细的例程源代码。 芯片通过串口烧写程序,不能调试。 我对缺省的开发环境做了些调整: 1. 将底层函数封装为库; 2. 调整应用的project目录结构,修改链接后批处理文件命令; 下面的附件是调整后的开发环境。 目录结构如下: 应用的工程目录在MyApps子目录下,工程文件为\Keil\WM_SDK.uvproj。增加新应用时,在MyApps子目录下复制任一例子工程目录,改名即可。 库文件:Lib\KEIL子目录下。wifi.lib是厂家提供的库文件(没有源代码),WM_SDK.lib是我以厂家提供的源代码文件生成的库文件。(注:厂家仅提供了面向ucOS的wifi.lib库文件,所以WM_SDK.lib也是面向ucOS的,不支持RTOS) App、Include、Src为厂家提供的底层源代码的头文件;Src\Boot是没法放在库文件中的厂家提供的源文件; MOD是我封装的函数的头文件和源代码; 应用main.c框架: //以下是最小框架代码 #include "modSys.h" int main( void ) {     modSysInit();     modSysRun(); } void CreateUserTask(void) {     //用户代码在这里进行初始化 } //以上是最小框架代码 modSysInit()进行底层初始化,然后调用CreateUserTask()执行应用的初始化代码; modSysRun()启动ucOS任务调度过程;   主索引 回教程首页           附件   WM_SDK.zip   参考链接