联盛德 HLK-W806 (三): 免按键自动下载和复位

发布者:chwwdch最新更新时间:2022-06-21 来源: eefocus关键字:联盛德  自动下载  复位 手机看文章 扫描二维码
随时随地手机看文章

免按键自动复位下载

如果只是了解如何使用, 看这部分就可以了. 在项目中将SDK更新到最新版本, 在SDK中找到这个文件 include/arch/xt804/csi_config.h, 将下面这行的值从0改成1


#define USE_UART0_AUTO_DL          0 // Auto download, 0:OFF, 1:ON


然后编译, 按正常的操作流程烧录到开发板. 之后的烧录就可以免按键自动下载了, 在下载前会自动复位, 下载后也会自动复位.


注意:


这个功能仅仅适用于开发和测试阶段, 不能用在生产环境.

这个功能(以及默认的printf打印)会占用UART0, 如果你的项目需要使用UART0与其它设备通信, 必须关闭这个功能

免按键下载的功能分析

烧录下载的指令分析

在tools/W806/rules.mk中


flash:all

    @$(WM_TOOL) -c $(DL_PORT) -rs at -ds $(DL_BAUD) -dl $(FIRMWAREDIR)/$(TARGET)/$(TARGET).fls


可以看到make flash会先执行编译, 然后调用 wm_tool 根据预设的下载端口, 下载波特率, 将fls文件下载到设备. 在正常的下载过程中, 需要先复位开发板进入下载模式, 这时候才开始实际的下载, 下载结束后开发板会依然处于下载模式, 此时需要复位开发板进入普通模式, 运行用户程序. 现在这两步都是手工按Reset键完成的.


烧录下载复位的代码

在上面的命令中, 有一个参数是-rs at, 这个参数的说明是


-rs reset_action, set device reset method, default is manual control

         none - manual control device reset

         at   - use the at command to control the device reset

         rts  - use the serial port rts pin to control the device reset


at对应的选项是使用AT命令去重启设备, 重启动作对应的有两处, 分别就是需要手工按Reset按钮的两个时间点.


下载前复位

对于下载前复位, wm_tool中的处理是


if (WM_TOOL_DL_ACTION_AT == wm_tool_dl_action)

{

    if (WM_TOOL_DEFAULT_BAUD_RATE != wm_tool_normal_serial_rate)

        wm_tool_uart_set_speed(wm_tool_normal_serial_rate);


#if 0 /* use erase option */

    if (WM_TOOL_DL_TYPE_FLS == wm_tool_dl_type)

    {

        ret = wm_tool_uart_write("AT+&FLSW=8002000,0rn", strlen("AT+&FLSW=8002000,0rn"));

        if (ret <= 0)

        {

            wm_tool_printf("destroy secboot failed.rn");

            wm_tool_uart_close();

            return -3;

        }

        wm_tool_delay_ms(300);

    }

#endif


    ret = wm_tool_uart_write("AT+Zrn", strlen("AT+Zrn"));

    if (ret <= 0)

    {

        wm_tool_printf("reset error.rn");

        wm_tool_uart_close();

        return -4;

    }


    if (WM_TOOL_DEFAULT_BAUD_RATE != wm_tool_normal_serial_rate)

        wm_tool_uart_set_speed(WM_TOOL_DEFAULT_BAUD_RATE);

}


...


wm_tool_printf("wait serial sync...");

wm_tool_send_esc2uart(500);/* used for delay */


可以看到wm_tool的实际操作是通过串口发出AT+Zrn指令, 然后等待500ms再检测是否复位


下载后复位

对于下载后的复位, 在代码中只处理了rts选项, 这里使用at选项是无动作的


...


if (WM_TOOL_DL_TYPE_FLS == wm_tool_dl_type)

{

    if (WM_TOOL_DL_ACTION_RTS == wm_tool_dl_action)/* auto reset */

    {

        wm_tool_uart_set_dtr(0);

        wm_tool_uart_set_rts(1);

        wm_tool_delay_ms(50);

        wm_tool_uart_set_dtr(1);

        wm_tool_uart_set_rts(0);

        wm_tool_delay_ms(50);

        wm_tool_uart_set_dtr(0);

    }

    else

    {

        wm_tool_printf("please manually reset the device.rn");

    }

}

...


W806的烧录自动复位实现

根据上面的分析, W806的自动复位需要实现两处, 一处是下载前, 一处是下载完成后


下载前的复位实现

下载前开发板还运行在普通模式, 此时串口由用户程序控制, 如果需要响应串口命令, 需要在用户程序中添加串口0的RX中断和命令判断. 这一步可以参考SDK中UART0作为printf打印输出的实现


增加UART0初始化


在 platform/arch/xt804/bsp/board_init.c 中增加初始化代码, 当配置为开启时, 开启UART0接收中断


...

static void uart0Init (int bandrate)

{

    unsigned int bd;


#if USE_UART0_AUTO_DL

    WRITE_REG(UART0->INTM, ~UART_RX_INT_FLAG);

    NVIC_ClearPendingIRQ(UART0_IRQn);

    NVIC_EnableIRQ(UART0_IRQn);

#else

    NVIC_DisableIRQ(UART0_IRQn);

    NVIC_ClearPendingIRQ(UART0_IRQn);

#endif

...

}


增加UART0接收中断响应和命令检测


在 platform/component 下新增一个组件, 在组件中实现中断响应和命令检测


/******************************************************************************

** 

 * file        auto_dl.c

 * author      Xu Ruijun | 1687701765@qq.com

 * date        

 * brief       Reset device with UART0 AT+Z command

 * note        Set USE_UART0_AUTO_DL = 1 to enable this feature

 * version     

 * ingroup     

 * remarks     

 *

******************************************************************************/


#include "wm_hal.h"


#if USE_UART0_AUTO_DL


#define __AUTO_DL_UART_CLEAR_FLAG(__HANDLE__, __FLAG__) ((__HANDLE__)->INTS |= __FLAG__)

#define __AUTO_DL_TIMEOUT 5

#define __AUTO_DL_BUF_SIZE 32


const static uint8_t auto_dl_cmd[] = {'A', 'T', '+', 'Z', 'r', 'n'};

uint8_t auto_dl_buf[__AUTO_DL_BUF_SIZE] = {0}, auto_dl_buf_pt = 0, auto_dl_cmd_pt = 0;

uint32_t auto_dl_act_ts = 0;


void AUTO_DL_Reset(void)

{

    CLEAR_REG(RCC->RST);                     // reset all peripherals

    uint32_t rv = *(uint32_t*)(0x00000000U); // get reset vector

    ((void (*)())(rv))();                    // go to ROM

}


__attribute__((weak)) void USER_UART0_RX(uint8_t ch)

{

    UNUSED(ch);

}


void AUTO_DL_UART_IRQHandler(USART_TypeDef* huart)

{

    uint8_t ch, count;

    uint32_t ts, isrflags = READ_REG(huart->INTS), isrmasks = READ_REG(huart->INTM);

    // Clear interrupts

    __AUTO_DL_UART_CLEAR_FLAG(huart, isrflags);


    if (((isrflags & UART_RX_INT_FLAG) != RESET) && ((isrmasks & UART_RX_INT_FLAG) == RESET))

    {

        /**

         *   1) Data always comes in as single bytes, so the count is always 1(or 0);

         *   2) Each byte will comes in twice, the second time with count=0 will be ignored;

         */

        count = ((READ_REG(huart->FIFOS) & UART_FIFOS_RFC) >> UART_FIFOS_RFC_Pos);

        while (count-- > 0)

        {

            // Write ch to ring buffer

            ch = (uint8_t)(huart->RDW);

            auto_dl_buf[auto_dl_buf_pt++] = ch;

            if (auto_dl_buf_pt == __AUTO_DL_BUF_SIZE) auto_dl_buf_pt = 0;


            // Command detection

            ts = HAL_GetTick();

            if ((ts - auto_dl_act_ts) > __AUTO_DL_TIMEOUT)

            {

                // Restart the comparison if timeout

                auto_dl_cmd_pt = 0;

                if (auto_dl_cmd[auto_dl_cmd_pt] == ch)

                {

                    auto_dl_cmd_pt++;

                }

            }

            else

            {

                // Avoid starting new comparison in the middle of RX

                if ((auto_dl_cmd[auto_dl_cmd_pt] == ch) && (auto_dl_cmd_pt > 0))

                {

                    auto_dl_cmd_pt++;

                    if (auto_dl_cmd_pt == sizeof(auto_dl_cmd))

                    {

                        AUTO_DL_Reset();

                    }

                }

                else

                {

                    // Restart the comparison

                    auto_dl_cmd_pt = 0;

                }

            }

            // Record last active timestamp

            auto_dl_act_ts = ts;

            USER_UART0_RX(ch);

        }

    }


    if (((isrflags & UART_INTS_TL) != RESET) && ((isrmasks & UART_INTM_RL) == RESET))

    {

        //UART_Transmit_IT(huart);

    }


    if (((isrflags & UART_INTS_TEMPT) != RESET) && ((isrmasks & UART_INTM_TEMPT) == RESET))

    {

        //UART_EndTransmit_IT(huart);

    }

}


__attribute__((isr)) void UART0_IRQHandler(void)

{

    AUTO_DL_UART_IRQHandler(UART0);

}


#endif


下载成功后的复位实现

下载成功后, 开发板还运行在下载模式, 因此找到下载模式下对应复位的命令就可以了, 这个命令是


0x21, 0x06, 0x00, 0xc7, 0x7c, 0x3f, 0x00, 0x00, 0x00


对应的, 在 wm_tool.c中增加这个命令常量


const static unsigned char wm_tool_chip_cmd_reset[]    = {0x21, 0x06, 0x00, 0xc7, 0x7c, 0x3f, 0x00, 0x00, 0x00};


和对AT模式的处理逻辑


if (WM_TOOL_DL_TYPE_FLS == wm_tool_dl_type)

{

    if (WM_TOOL_DL_ACTION_RTS == wm_tool_dl_action) // Use UART RTS pin to control the device reset

    {

        ...

    }

    else if(WM_TOOL_DL_ACTION_AT == wm_tool_dl_action) // Use AT command to reset the device

    {

        wm_tool_delay_ms(500);

[1] [2]
关键字:联盛德  自动下载  复位 引用地址:联盛德 HLK-W806 (三): 免按键自动下载和复位

上一篇:联盛德 HLK-W806 (四): 软件SPI和硬件SPI驱动ST7735液晶LCD
下一篇:联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明

推荐阅读最新更新时间:2024-11-08 05:30

联盛W806-KIT开发板试用评测系列之二:ADC 功能使用与测试
今天着手对W806开发板ADC功能做测试,都知道ADC在物联网应用场景中常需要用到的一个重要技术。W806手册说这款芯片支持片内ADC,介绍是这样的: 片内集成 4 路 16 比特 ADC,最高采样率 1KHz。ADC基于Sigma-Delta ADC 的采集模块,完成最多 4 路模拟信号的采集,采样率通过外部输入时钟控制,可采集输入电压,也可采集芯片温度,支持输入校准和温度补偿校准。 其管脚定义如下: 管脚 IO口名称 功能 上下拉能力 19 PA_1 ADC_1 UP/DOWN 20 PA_2 ADC_4 UP/DOWN 21 PA_3 ADC_3 UP/DOWN 22
[单片机]
<font color='red'>联盛</font><font color='red'>德</font>W806-KIT开发板试用评测系列之二:ADC 功能使用与测试
MSP430的复位信号
MSP430的复位信号有2种: 文档: 上电清除信号(PUC)、 上电复位信号(POR)。 个人理解: POR是第一次上电复位,PUC是在带电的情况下发生复位,冷启动和热启动。 还有能够触发POR和PUC的信号:5种来在看门狗,1种来自复位管脚,1种来自写FLASH键值出现错误所产生的信号。 POR信号只在2种情况下发生:(1)微处理上电;(2)RST/NMI管脚上产生低电平时系统复位。 PUC信号产生的条件:(1)POR信号产生;(2)看门狗有效时,看门狗定时器溢出;(3)写看门狗定时器安全键值出现错误;(4)写FLASH存储器安全键值出现错误。 POR和PU
[单片机]
同步异步复位与亚稳态可靠性设计
异步复位相比同步复位:   1. 通常情况下(已知复位信号与时钟的关系),最大的缺点在于异步复位导致设计变成了异步时序电路,如果复位信号出现毛刺,将会导致触发器的误动作,影响设计的稳定性。   2. 同时,如果复位信号与时钟关系不确定,将会导致亚稳态情况的出现。下面先给出一个例子,然后就亚稳态进行重点讨论。      亚稳态的定义(说明):   在 Howard Johnson 的《High Speed Digital Design: A Handbook of Black Magic》一书中,专门就逻辑电路的亚稳态作了专门的分析。由于 timing margine 不够,电路的输入没有能够上到所需要的逻辑电平高
[模拟电子]
同步异步<font color='red'>复位</font>与亚稳态可靠性设计
在EVC环境下开发实现电梯缓冲器复位时间测试系统的应用方案
随着《电梯监督检验规程》的发布,对检验机构的电梯检验质量提出了新的要求。但在《检规》的实施过程中,不断发现现有的检验项目缺乏必要的、科学的检测手段。为此,探索研制一些检测仪器,检测仪器应用十分广泛,主要应用于石化工业、电力工业、航空造船业、造纸业、纺织业、冶金工业等。当任何气体(空气、氧气、氮气……等)通过一泄漏孔隙,均会产生具有可探测高频成份的扰流,以渗漏检测仪来扫描附近区域,经由耳机可听到泄漏的急流声或是指示。检测仪愈靠近泄漏点,则急流声会愈大,指示读值会更高。当然,环境噪音是个问题,但使用橡皮聚音探头可缩小探测仪的接收区域。以阻隔杂讯噪音波的干扰,渗漏检测仪的频率调整功能可降低背景噪音干扰,让没经验的使用者也可容易地操作来检
[单片机]
在EVC环境下开发实现电梯缓冲器<font color='red'>复位</font>时间测试系统的应用方案
ATmega64 上电复位
上电复位(POR) 脉冲由片内检测电路产生。检测电平列于Table 19。POR 在VCC 低于 检测电平时产生。POR 电路可以用来触发启动复位,或者用来检测电源故障。 POR电路保证器件在上电时复位。VCC 达到上电门限电压后触发延迟计数器。在计数器溢 出之前器件一直保持为复位状态。当VCC 下降时,只要低于检测门限,RESET 信号立即 生效。
[单片机]
ATmega64 上电<font color='red'>复位</font>
80C51复位标志位的设置与应用研究
引言   设置复位标志位便于区分不同原因引发的复位,作为一种新技术被越来越多的新型单片机所采纳。例如Philips公司的P87LPC700和 P89LPC900系列、Freescale公司(原Motorola半导体部)的MC68HC05系列和MC68HC08系列、Sunplus公司的 SPMC65系列、Microchip公司的PIC系列等,内部都设计了专门用于记录各种复位标志的状态寄存器。   MC68HC08系列有一个复位状态寄存器,负责记录6种复位标志位:上电复位、引脚复位、看门狗复位、非法指令复位、非法地址复位和欠压复位。SPMC65系列有一个系统控制寄存器,负责记录5种复位标志位:上电复位、外部复位、看门狗复位、非法地
[单片机]
一种单键开关机和复位方案
1 引言   随着电池的容量确实得到了大幅度增加,伴随着也产生了一个新的问题——如果智能手机和平板电脑在应用过程中发生软件系统卡机的情况,如何进行系统的 复位 操作?   与产品的主要功能相比,解除卡机状况的机械复位装置通常比较落后。为防止设备意外复位,大多数手动复位键(如果有的话)都掩藏在机身内。因为复位键很难触及,所以拆卸电池成为非常普遍的解决办法。但是,这种做法不仅用户感受度较差,并且增加了成本,还可能会损坏系统,例如,使重要的数据丢失。   那么,在内置电池设计的智能手机和平板电脑中,如何进行系统的硬件复位呢?本文介绍了一种硬件智能复位的解决方案,不仅可以在智能手机和平板电脑设计中实现双键长按的智能复位,还可以实现在智能
[模拟电子]
一种单键开关机和<font color='red'>复位</font>方案
AVR单片机上电复位不可靠问题的解决
推荐昨晚在调试AVR 单片机时又有一些心得体会,虽然结论是一个很小的问题造成的,但在此还是写出来给大家参考,避免走弯路。 事件描述: 以前用AVR的芯片也做过好几个设计,从来没有怀疑过ATMEL的芯片的稳定性,以前的几个方案都是很稳定的,当然这跟PCB的设计有很大的关系,如果大家需要PCB相关参考资料的话可以到本站的PCB技术专栏里查找,那里有很多前辈的PCB布板心得。 这次用的ATmega48制作的串口电压表就出现一个很奇怪的现象,电路板是用万能板焊接的,程序里用到ADC功能和串口通讯功能,用的AVR下载工具是STK500,每次下载程序后芯片总是不能正常复位工作,还要读取下芯片的特征字或熔丝位让芯片重新复位下才能工作,这时
[单片机]
AVR单片机上电<font color='red'>复位</font>不可靠问题的解决
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved