OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9535|回复: 14

有没有STM32F407通过HTTP升级程序的例程,

[复制链接]

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-8-1
在线时间
26 小时
发表于 2016-9-28 15:05:38 | 显示全部楼层 |阅读模式
10金钱
基于LWIP1.4.1,网上有stm32F1 F2的,用的lwip不一个版本,改动比较大。

最佳答案

查看完整内容[请看2#楼]

感谢各位,终于实现远程升级了,简单总结一下: 我这个和官网的例程不一样,不需要按按键进入bootloader,全部远程操作, 方法是建立三个分区bootloader(0x8000000,0扇区)、APP1(0x8020000,5扇区)、APP2(0x8060000,7扇区); 上电运行bootloader,判断flash空间一个标志位,如果需要升级就擦除APP1,复制APP2到APP1区,然后再擦除APP2区flash,不然下次升级无法写入APP2, 然后跳转到APP1运行就行了; 以下是POST接收 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-8-1
在线时间
26 小时
 楼主| 发表于 2016-9-28 15:05:39 | 显示全部楼层
本帖最后由 lianxin007 于 2016-10-14 18:34 编辑

感谢各位,终于实现远程升级了,简单总结一下:
我这个和官网的例程不一样,不需要按按键进入bootloader,全部远程操作,
方法是建立三个分区bootloader(0x8000000,0扇区)、APP1(0x8020000,5扇区)、APP2(0x8060000,7扇区);
上电运行bootloader,判断flash空间一个标志位,如果需要升级就擦除APP1,复制APP2到APP1区,然后再擦除APP2区flash,不然下次升级无法写入APP2,
然后跳转到APP1运行就行了;
以下是POST接收程序:
err_t httpd_post_receive_data(void *connection, struct pbuf *p)
{
    struct http_state *hs = (struct http_state *)connection;
    struct pbuf *q = p;
    int count;
    u32_t http_post_payload_full_flag = 0;
        u16 i;
        /* search for end-of-header (first double-CRLF) */
    static char *dublecrlf;

    while(q != NULL)  // 缓存接收的数据至http_post_payload
    {
                if(post_rx_sta == 0)//如果是第一次接收,需要去除包头再保存数据
                {
                        else Ecoreflag = 1;
                        dublecrlf = strnstr(q->payload, CRLF CRLF, q->len);// CRLF = “\r\n”包头都是以两个0xD0,0xDA结束的,
                        if(dublecrlf != NULL)
                        {                        
                                http_post_payload_len = 1460 - (dublecrlf - (char*)q->payload) -4; //去除包头后的长度,都是以1460byte分包的,这里不考虑小数据包。
                                MEMCPY(http_post_payload, dublecrlf+4,http_post_payload_len);
                                post_rx_sta++;               
                        }
        
                }
                else if(post_rx_sta > 0)
                {
                        //之后都是以1460byte分包接收的,我是当接收的数据大于8k后写入一次flash
                        
                        MEMCPY(http_post_payload + http_post_payload_len, q->payload, q->len);               
                        http_post_payload_len += q->len;

                        if(http_post_payload_len > 8192)
                        {
                                STMFLASH_Write(ADDR_FLASH_USER_APP2 + addrset * 8192 ,(u32*)http_post_payload,2048);
                                http_post_payload_len = http_post_payload_len - 8192;
                                MEMCPY(http_post_payload, http_post_payload + 8192, http_post_payload_len);
                                addrset++;
                        }
                        post_rx_sta++;
                }                                
        q = q->next;
    }
    pbuf_free(p); // 释放pbuf
        .
        .
        .
}
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-9-28 15:47:22 | 显示全部楼层
官网上不是有吗?http  tftp IAP的
回复

使用道具 举报

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-8-1
在线时间
26 小时
 楼主| 发表于 2016-9-28 16:25:27 | 显示全部楼层
闪电之舞 发表于 2016-9-28 15:47
官网上不是有吗?http  tftp IAP的

官网上的我看了,用的lwip不一个版本,改动比较大
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-9-28 16:41:40 | 显示全部楼层
你把LWIP1.4.1移植好了,HTTP部分基本不用该吧。最多httpd部分代码微调。
你可以参考f103的httpserver例子。我就在上面实现升级。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-8-1
在线时间
26 小时
 楼主| 发表于 2016-9-28 17:43:13 | 显示全部楼层
ysq7120 发表于 2016-9-28 16:41
你把LWIP1.4.1移植好了,HTTP部分基本不用该吧。最多httpd部分代码微调。
你可以参考f103的httpserver例子 ...

就是改httpserver.c(lwip1.3.2)、httpd.c(lwip1.4.1)这两个文件,差别挺大的,我刚接触LWIP,改起来比较吃力,我这边webserver已经实现,参数传递都是通过GET方法,这回要用到POST方法,您是基于LWIP1.4.1实现程序升级的吗?能发我一份参考例程吗?我的邮箱是375359100@qq.com,万分感谢!!!
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-9-28 17:50:56 | 显示全部楼层
初始化你看战舰V3的demo就行了,没几行代码。


/**
* A new incoming connection has been accepted.
*/
//ò»¸öDÂμĽøà′μÄᬽ󱻽¨á¢
static err_t http_accept(void *arg, struct tcp_pcb *pcb, err_t err)
{
  struct http_state *hs;
  struct tcp_pcb_listen *lpcb = (struct tcp_pcb_listen*)arg;
  LWIP_UNUSED_ARG(err);
  LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept %p / %p\r\n", (void*)pcb, arg));

  
  //printf("%d, %d\r\n", pcb->remote_port,pcb->remote_ip.addr);
       
  /* Decrease the listen backlog counter */
  tcp_accepted(lpcb);  //¼õD¡¼àìyàۼƼÆêyÆ÷
  /* Set priority */
  tcp_setprio(pcb, HTTPD_TCP_PRIO);//éèÖÃóÅÏè¼¶

  /* Allocate memory for the structure that holds the state of the
     connection - initialized by that function. */
  hs = http_state_alloc(); //éêÇëÄú′æ
  if (hs == NULL) {  //Äú′æéêÇëê§°ü
    LWIP_DEBUGF(HTTPD_DEBUG, ("http_accept: Out of memory, RST\r\n"));
    return ERR_MEM;
  }

  /* Tell TCP that this is the structure we wish to be passed for our callbacks.*/
  tcp_arg(pcb, hs); //í¨ÖaTCP hsÕa¸ö½á11ìåÔú»Øμ÷ÖDêÇÎòÃÇÏ£íû±»′«μYμÄ

  /* Set up the various callback functions */
  tcp_recv(pcb, http_recv);                                                  //×¢2átcp_recvμÄ»Øμ÷oˉêy
  tcp_err(pcb, http_err);                                                    //×¢2átcp_errμÄ»Øμ÷oˉêy
  tcp_poll(pcb, http_poll, HTTPD_POLL_INTERVAL);         //×¢2átcp_pollμÄ»Øμ÷oˉêy
  tcp_sent(pcb, http_sent);                                                  //×¢2átcp_sentμÄ»Øμ÷oˉêy

  return ERR_OK;
}

/**
* Initialize the httpd with the specified local address.
*/
//ê1óÃÖ¸¶¨μı¾μØμØÖ·3õê¼»ˉhttpdμØÖ·
static void httpd_init_addr(struct ip_addr *local_addr)
{
  struct tcp_pcb *pcb;
  err_t err;

  pcb = tcp_new();  //′′½¨pcb¿ØÖÆ¿é
  LWIP_ASSERT("httpd_init: tcp_new failed", pcb != NULL);
  tcp_setprio(pcb, HTTPD_TCP_PRIO);  //éèÖÃpcbóÅÏè¼¶
  /* set SOF_REUSEADDR here to explicitly bind httpd to multiple interfaces */
  err = tcp_bind(pcb, local_addr, HTTPD_SERVER_PORT); //°ó¶¨±¾μØμØÖ·óë¶Ë¿úoÅ
  LWIP_ASSERT("httpd_init: tcp_bind failed", err == ERR_OK);
  pcb = tcp_listen(pcb);  //éèÖÃpcb½øèë¼àìy
  LWIP_ASSERT("httpd_init: tcp_listen failed", pcb != NULL);
  /* initialize callback arg and accept callback */
  tcp_arg(pcb, pcb);   
  tcp_accept(pcb, http_accept);  //éèÖÃtcp_acceptμÄ»Øμ÷oˉêy
}
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-9-28 17:56:14 | 显示全部楼层
demo移植的也是1.4.1的。至于其他都应该不用改。post里面也有的,不过例子都不支持并发请求,数据大也要改写,如果你有这方面的要求,webserver部分代码还是自己重写吧。对高并发需要比较多的内存空间,不然不行。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-8-1
在线时间
26 小时
 楼主| 发表于 2016-9-28 18:03:38 | 显示全部楼层
ysq7120 发表于 2016-9-28 17:50
初始化你看战舰V3的demo就行了,没几行代码。

谢谢!
现在http通信是可以的,就是post方法这块,我把LWIP_HTTPD_SUPPORT_POST定义成1,
提示下面这三个函数未定义:httpd_post_begin()、httpd_post_finished()、httpd_post_receive_data();好像需要自己实现。
回复

使用道具 举报

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-8-1
在线时间
26 小时
 楼主| 发表于 2016-9-28 18:06:09 | 显示全部楼层
也不知道这个LWIP_HTTPD_POST_MANUAL_WND需要定义成1 不需要?不知道啥意思
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-9-29 08:30:10 | 显示全部楼层
没用他的代码,可能需要你填充代码,毕竟post有可能数据很长那么这个时候就会出现分包,你需要判断包的顺序然后拼接。
如果你post的数据比较小,那么就可以简单处理。
如果搞不懂,我建议你直接从判断get的地方添加post的判断,然后重新自己处理。到底是get还是post无非就是查找字符串而已。至于后面的数据怎么处理,建议看看http协议。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-8-1
在线时间
26 小时
 楼主| 发表于 2016-9-29 10:54:36 | 显示全部楼层
http://blog.sina.com.cn/s/blog_b315f69b0102w534.html
这篇文章讲解的不错,大家看看。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-9-29 20:22:59 | 显示全部楼层
lianxin007 发表于 2016-9-29 10:54
http://blog.sina.com.cn/s/blog_b315f69b0102w534.html
这篇文章讲解的不错,大家看看。

搞定了?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2014-8-1
在线时间
26 小时
 楼主| 发表于 2016-9-30 15:35:58 | 显示全部楼层

还没有,这篇文章没有提到CGIHandler函数,还有这个LWIP_HTTPD_POST_MANUAL_WND是需要分包处理时开启的吧,还是不太清楚。
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-8-22
在线时间
19 小时
发表于 2020-5-11 10:54:15 | 显示全部楼层
大佬,能给发一份源码研究一下吗?2623955134@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 04:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表