你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

用其他芯片通过SWD协议给STM32F103RET6下载程序遇到的问题

[复制链接]
fancy0411 提问时间:2020-4-13 13:33 /
现在在做一个下载器,就是用STM32F405芯片模拟SWD协议给STM32F103RET6芯片下载程序,通过规格书发现F103系列芯片的闪存编程使能是半字的形式,但是SWD协议是4字节的,通过什么方式能给flash按照半字的形式下载程序。有谁研究过这个的,能不能给个DEMO程序看看。
这是我的一部分程序:
uint8_t swd_write_block(uint32_t address, uint8_t *data, uint32_t size)
{
     uint8_t tmp_in[4], req;
     uint32_t size_in_words,size_send;
     uint32_t i, ack,tmp;

     if (size==0)
         return 0;

     size_in_words = size/4;         
     if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE16))
         {
         return 0;
     }  
    // TAR write     
     req = SWD_REG_AP | SWD_REG_W | (1 << 2);
     int2array(tmp_in, address, 4);
     if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01)
                 {
         return 0;
             }
     // DRW write
     req = SWD_REG_AP | SWD_REG_W | (3 << 2);
     for (i = 0; i < size_in_words; i++)
     {
     if (swd_transfer_retry(req,  (uint32_t *)data) != 0x01)
            {
             return 0;
         }
        data+=4;
   }  
     // dummy read
     req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF);
     ack = swd_transfer_retry(req, NULL);
     return (ack == 0x01);         
}
收藏 评论1 发布时间:2020-4-13 13:33

举报

1个回答
跟风和天空对话 回答时间:2020-4-14 11:37:55
不了解SWD原理,只是猜测
uint8_t swd_write_block(uint32_t address, uint8_t *data, uint32_t size)
{
        uint8_t tmp_in[4], req;
        uint32_t size_in_words,size_send;
        uint32_t i, ack,tmp;

        if (size==0)
                return 0;

        size_in_words = size/2;//计算半字数                        //size_in_words = size/4;         //计算字数
        if (!swd_write_ap(AP_CSW, CSW_VALUE | CSW_SIZE16))//??
        {
                return 0;
        }  
    // TAR write     
    req = SWD_REG_AP | SWD_REG_W | (1 << 2);

        int2array(tmp_in, address, 2);                                //int2array(tmp_in, address, 4);
    if (swd_transfer_retry(req, (uint32_t *)tmp_in) != 0x01)
    {
        return 0;
    }

    // DRW write
    req = SWD_REG_AP | SWD_REG_W | (3 << 2);
    for (i = 0; i < size_in_words; i++)
    {
                if (swd_transfer_retry(req,  (uint32_t *)data) != 0x01)
                {
                        return 0;
                }
                data+=2;//data+=4;
    }  
     // dummy read
    req = SWD_REG_DP | SWD_REG_R | SWD_REG_ADR(DP_RDBUFF);
    ack = swd_transfer_retry(req, NULL);
    return (ack == 0x01);         
}

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版