搜索
bottom↓
回复: 23

分享一个jlink的C#上位机软件

  [复制链接]

出0入0汤圆

发表于 2019-10-9 18:00:34 | 显示全部楼层 |阅读模式
本帖最后由 霸气侧漏 于 2019-10-9 18:03 编辑

无意发现一个jlink的上位机调用组件,用C#编写的,方便做一下烧录。
大家可以一起玩玩

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-10-9 18:04:38 | 显示全部楼层
谢谢分享,好像是调的Jlink的PAI

出215入118汤圆

发表于 2019-10-9 18:14:02 来自手机 | 显示全部楼层
好像调用命令行做的,不是用的dll。

出0入0汤圆

 楼主| 发表于 2019-10-9 18:18:26 | 显示全部楼层
snowy 发表于 2019-10-9 18:14
好像调用命令行做的,不是用的dll。

你看看就知道了

出0入0汤圆

 楼主| 发表于 2019-10-9 18:18:46 | 显示全部楼层
hackboymzw 发表于 2019-10-9 18:04
谢谢分享,好像是调的Jlink的PAI

研究下代码,就知道实现方式

出0入25汤圆

发表于 2019-10-9 18:35:45 | 显示全部楼层

应该是通过向JLink.exe进程发送命令字符串来实现功能的

其实可以不使用JLink.exe,,直接调用JLinkARM.dll实现功能,,这样更灵活,,毕竟JLink.exe也是通过调用JLinkARM.dll来实现功能的

有坛友分享过相关代码:c#的 JLINK API,自己用的







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2019-10-9 19:53:17 | 显示全部楼层
XIVN1987 发表于 2019-10-9 18:35
应该是通过向JLink.exe进程发送命令字符串来实现功能的

其实可以不使用JLink.exe,,直接调用JLinkARM.dl ...

他这没有工程,不好弄

你有C#的工程没有

出0入8汤圆

发表于 2019-10-9 20:15:41 来自手机 | 显示全部楼层
这种方式刷一个100k的bin文件要多久,我掉dll要刷好半天

出0入0汤圆

 楼主| 发表于 2019-10-9 20:20:47 来自手机 | 显示全部楼层
justdomyself 发表于 2019-10-9 20:15
这种方式刷一个100k的bin文件要多久,我掉dll要刷好半天

时间没测试过,你用什么上位机做的,放点资料上来

出215入118汤圆

发表于 2019-10-9 21:02:09 | 显示全部楼层
我是写了一个小BIN文件,放到RAM中运行,把大BIN写入FLASH,尤其对付SPI FLASH很有用。

出0入25汤圆

发表于 2019-10-9 21:07:50 | 显示全部楼层
霸气侧漏 发表于 2019-10-9 19:53
他这没有工程,不好弄

你有C#的工程没有


没有,,我只搞过python控制JLinkARM.dll,,代码:https://github.com/XIVN1987/JMCUProg

出0入0汤圆

发表于 2019-10-9 21:37:08 | 显示全部楼层
还不如写个批处理文件 双击跑一下就完事~~~

出0入0汤圆

发表于 2019-10-9 21:37:24 | 显示全部楼层
感谢楼主分享~~~

出0入0汤圆

 楼主| 发表于 2019-10-9 21:45:53 | 显示全部楼层
XIVN1987 发表于 2019-10-9 21:07
没有,,我只搞过python控制JLinkARM.dll,,代码:https://github.com/XIVN1987/JMCUProg ...

python

我不会,,,尴尬

出0入8汤圆

发表于 2019-10-9 23:16:22 来自手机 | 显示全部楼层
justdomyself 发表于 2019-10-9 20:15
这种方式刷一个100k的bin文件要多久,我掉dll要刷好半天

c ++  资料明天有空传

出0入0汤圆

发表于 2019-10-10 00:44:03 | 显示全部楼层
不如直接掉dll

出0入0汤圆

 楼主| 发表于 2019-10-10 08:13:05 来自手机 | 显示全部楼层
justdomyself 发表于 2019-10-9 23:16
c ++  资料明天有空传

嗯嗯,传一下,最好是工程文件

出0入0汤圆

发表于 2019-10-10 09:08:14 | 显示全部楼层
XIVN1987 发表于 2019-10-9 21:07
没有,,我只搞过python控制JLinkARM.dll,,代码:https://github.com/XIVN1987/JMCUProg ...

感谢分享,还是python给力,全平台通用.

出0入8汤圆

发表于 2019-10-10 19:59:47 | 显示全部楼层
霸气侧漏 发表于 2019-10-9 20:20
时间没测试过,你用什么上位机做的,放点资料上来

jflash.cpp

#include "stdafx.h"
#include "windows.h"
#include "jlink.h"
#include "jflashAPI.h"

//use printf
#pragma comment(linker, "/subsystem:\"CONSOLE\" /entry:\"WinMainCRTStartup\"")



unsigned int jf_unlock(void)
{
    jlink.JLINKARM_WriteU32(FLASH_KR, FLASH_KR_KEY1);
    jlink.JLINKARM_WriteU32(FLASH_KR, FLASH_KR_KEY2);

    return 0;
}

unsigned int jf_lock(void)
{
    unsigned int read = jlink.JLINKARM_ReadU32(FLASH_CR) | FLASH_CR_LOCK;
    jlink.JLINKARM_WriteU32(FLASH_CR, read);

    return 0;
}

unsigned int jf_wait_ready(void)
{
    unsigned int read;

    while ( (read = jlink.JLINKARM_ReadU32(FLASH_SR) & FLASH_SR_BUSY) )
    {
        Sleep(1);
    }

    return 0;
}

unsigned int jf_chip_erase(void)
{
    jf_unlock();

    jlink.JLINKARM_WriteU32(FLASH_CR, jlink.JLINKARM_ReadU32(FLASH_CR) | FLASH_CR_CERASE);
    jlink.JLINKARM_WriteU32(FLASH_CR, jlink.JLINKARM_ReadU32(FLASH_CR) | FLASH_CR_ESTART);
    jf_wait_ready();
    jlink.JLINKARM_WriteU32(FLASH_CR, jlink.JLINKARM_ReadU32(FLASH_CR) &~FLASH_CR_CERASE);

    jf_lock();

    return 0;
}


unsigned int jf_page_erase(unsigned int startAddr, unsigned int sec)
{
    jf_unlock();

    jlink.JLINKARM_WriteU32(FLASH_CR, jlink.JLINKARM_ReadU32(FLASH_CR) | FLASH_CR_PERASE);

    for (unsigned int i = 0; i < sec; i++)
    {
        jlink.JLINKARM_WriteU32(FLASH_AR, startAddr + PAGE_SIZE * i);
        jlink.JLINKARM_WriteU32(FLASH_CR, jlink.JLINKARM_ReadU32(FLASH_CR) | FLASH_CR_ESTART);
        jf_wait_ready();
      

    }
    jlink.JLINKARM_WriteU32(FLASH_CR, jlink.JLINKARM_ReadU32(FLASH_CR) &~FLASH_CR_PERASE);
    jf_lock();

    return 0;
}


unsigned int jf_page_write(unsigned int addr, unsigned char *data)
{

    jf_unlock();

    jlink.JLINKARM_WriteU32(FLASH_CR, jlink.JLINKARM_ReadU32(FLASH_CR) | FLASH_CR_PWRITE);


    for (unsigned int i = 0; i < PAGE_SIZE/2; i++)
    {
        jlink.JLINKARM_WriteU16(addr + i * 2, data[i * 2] | (data[i * 2 + 1] << 8));
    }

    jf_wait_ready();
    jlink.JLINKARM_WriteU32(FLASH_CR, jlink.JLINKARM_ReadU32(FLASH_CR) &~FLASH_CR_PWRITE);
     
    jf_lock();


    return 0;
}



///???????????
unsigned int jf_chip_write(unsigned int startAddr, unsigned char * data, unsigned int len)
{
    unsigned int n_page = len / PAGE_SIZE;
    if ( len %PAGE_SIZE != 0)
    {
        jf_page_erase(startAddr, n_page + 1);
    }
    else
    {
        jf_page_erase(startAddr, n_page);
    }
   

    unsigned int i = 0;

    for (i = 0; i < n_page; i++)
    {
        jf_page_write(startAddr + i* PAGE_SIZE, data + i*PAGE_SIZE);

        printf("write sec i %d\r\n", i);
    }

    if ( len % PAGE_SIZE )
    {
        unsigned char buf[PAGE_SIZE] = {0};

        for (unsigned int j = 0; j < PAGE_SIZE; j++)
        {
            buf[j] = 0xff;
        }

        memcpy(buf, data + i*PAGE_SIZE, len%PAGE_SIZE);

        jf_page_write(startAddr + i* PAGE_SIZE, buf);
        
    }

    return 0;
}

jlink.cpp
#include "stdafx.h"
#include "windows.h"
//#include <iostream>
#include "jlink.h"

#pragma  comment(lib, "JLinkARM.dll")

dsJlink jlink;

unsigned char JLINKARM_ReadU8(unsigned int addr)
{
    unsigned char ret;
    unsigned char st;

    jlink.JLINKARM_ReadMemU8(addr, 1, &ret, &st);
    return ret;
}

unsigned short JLINKARM_ReadU16(unsigned int addr)
{
    unsigned short ret;
    unsigned char st;

    jlink.JLINKARM_ReadMemU16(addr, 1, &ret, &st);

    return ret;
}

unsigned int JLINKARM_ReadU32(unsigned int addr)
{
    unsigned int ret;
    unsigned char st;

    jlink.JLINKARM_ReadMemU32(addr, 1, &ret, &st);

    return ret;
}

unsigned int InitJLink(void)
{
    #define BUF_MAX_SIZE                  600
    unsigned char buf[BUF_MAX_SIZE];

    //加载动态库
    HMODULE hMod = LoadLibrary("JLinkARM.dll");

    ///根据函数名获取函数指针
    jlink.JLINKARM_TIF_Select = (pFunc_TIF_Select)GetProcAddress(hMod, TEXT("JLINKARM_TIF_Select"));
    jlink.JLINKARM_ExecCommand = (pFunc_ExecCommand)GetProcAddress(hMod, TEXT("JLINKARM_ExecCommand"));
    jlink.JLINKARM_GetId = (pFunc_GetId)GetProcAddress(hMod, TEXT("JLINKARM_GetId"));
    jlink.JLINKARM_IsConnected = (pFunc_IsConnected)GetProcAddress(hMod, TEXT("JLINKARM_IsConnected"));
    jlink.JLINKARM_Reset = (pFunc_Reset)GetProcAddress(hMod, TEXT("JLINKARM_Reset"));

    jlink.JLINKARM_ReadMem = (pFunc_ReadMem)GetProcAddress(hMod, TEXT("JLINKARM_ReadMem"));
    jlink.JLINKARM_WriteMem = (pFunc_WriteMem)GetProcAddress(hMod, TEXT("JLINKARM_WriteMem"));
   
    jlink.JLINKARM_SetSpeed = (pFunc_SetSpeed)GetProcAddress(hMod, TEXT("JLINKARM_SetSpeed"));
    jlink.JLINKARM_GetSpeed = (pFunc_GetSpeed)GetProcAddress(hMod, TEXT("JLINKARM_GetSpeed"));

    jlink.JLINKARM_ReadMemU32 = (pFunc_ReadMemU32)GetProcAddress(hMod, TEXT("JLINKARM_ReadMemU32"));
    jlink.JLINKARM_ReadMemU16 = (pFunc_ReadMemU16)GetProcAddress(hMod, TEXT("JLINKARM_ReadMemU16"));
    jlink.JLINKARM_ReadMemU8 = (pFunc_ReadMemU8)GetProcAddress(hMod, TEXT("JLINKARM_ReadMemU8"));



    jlink.JLINKARM_WriteU32 = (pFunc_WriteU32)GetProcAddress(hMod, TEXT("JLINKARM_WriteU32"));
    jlink.JLINKARM_ReadU32 = (pFunc_ReadU32)GetProcAddress(hMod, TEXT("JLINKARM_ReadU32"));

    jlink.JLINKARM_WriteU16 = (pFunc_WriteU16)GetProcAddress(hMod, TEXT("JLINKARM_WriteU16"));
    jlink.JLINKARM_ReadU16 = (pFunc_ReadU16)GetProcAddress(hMod, TEXT("JLINKARM_ReadU16"));

    jlink.JLINKARM_WriteU8 = (pFunc_WriteU8)GetProcAddress(hMod, TEXT("JLINKARM_WriteU8"));
    jlink.JLINKARM_ReadU8 = (pFunc_ReadU8)GetProcAddress(hMod, TEXT("JLINKARM_ReadU8"));

    jlink.JLINKARM_WriteReg = (pFunc_WriteReg)GetProcAddress(hMod, TEXT("JLINK_WriteReg"));
    jlink.JLINKARM_ReadReg = (pFunc_ReadReg)GetProcAddress(hMod, TEXT("JLINK_ReadReg"));

    //以下三个函数上面没有一次封装,这里进行二次封装一下
    jlink.JLINKARM_ReadU32 = JLINKARM_ReadU32;
    jlink.JLINKARM_ReadU16 = JLINKARM_ReadU16;
    jlink.JLINKARM_ReadU8 = JLINKARM_ReadU8;


    //选择设备
    if (jlink.JLINKARM_TIF_Select != NULL)
    {
        jlink.JLINKARM_TIF_Select(1);
    }
    //设置芯片型号
    if (jlink.JLINKARM_ExecCommand != NULL)
    {
        unsigned int ret = 0;
        //选择芯片类型
        ret = jlink.JLINKARM_ExecCommand("Device = Cortex-M3", buf, 64);
    }
    //判断jlink是否连接上
    if (jlink.JLINKARM_IsConnected != NULL)
    {
        unsigned int ret = 0;
        ret = jlink.JLINKARM_IsConnected();
        printf("isConnected is %d\r\n", ret);
    }
    //设置jlink速度
    if (jlink.JLINKARM_SetSpeed != NULL)
    {
        jlink.JLINKARM_SetSpeed(12000);
        printf("set jlink speed ok\r\n");
    }
    //获取jlink速度
    if (jlink.JLINKARM_GetSpeed != NULL)
    {
        unsigned int speed = jlink.JLINKARM_GetSpeed();
        printf("get speed is %d khz\r\n", speed);
    }

    if (jlink.JLINKARM_WriteMem != NULL)
    {
        printf("jlink write mem func not null!\r\n");
    }


    return 0;
}


调用这个就可以刷程序, jf_chip_write

这种方式应该没有你直接用exe来的快  

JLINKARM_WriteMem  可以直接对内存进行操作

这个dll的使用在另外一个贴子中提到过,其实也是参照python那个程序修改的


出0入0汤圆

 楼主| 发表于 2019-10-10 20:38:32 来自手机 | 显示全部楼层
justdomyself 发表于 2019-10-10 19:59
jflash.cpp

#include "stdafx.h"

没有工程文件???

出0入0汤圆

发表于 2021-9-25 23:30:30 | 显示全部楼层
谢谢分享!              

出0入0汤圆

发表于 2021-10-1 09:16:02 | 显示全部楼层
需要引用 j-link sdk ??

出0入8汤圆

发表于 2021-10-27 00:17:01 来自手机 | 显示全部楼层
本帖最后由 justdomyself 于 2021-10-27 00:18 编辑

谢谢分享………能提供下工程么?

出0入0汤圆

发表于 2023-8-3 11:14:34 | 显示全部楼层
你好,我这边尝试jlink.exe是不能够通过管道访问的,但是你的却可以,这是什么原因呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 21:37

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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