gwnpeter 发表于 2014-10-1 16:33:28

c#的 JLINK API,自己用的

using System.Runtime.InteropServices;
using System.Threading;
using System;

internal class JTAG
{
        public void JLINKARM_Sleep(int ms)
        {
                Thread.Sleep(ms);
        }

        /// <summary>
        /// 打开JLINK设备
        /// </summary>
        /// <remarks></remarks>
       
        public void JLINKARM_Open()
        {
        }

        /// <summary>
        /// 关闭JLINK设备
        /// </summary>
        /// <remarks></remarks>
       
        public void JLINKARM_Close()
        {
        }

        /// <summary>
        /// 系统复位
        /// </summary>
        /// <remarks></remarks>
       
        public void JLINKARM_Reset()
        {
        }

       
        public void JLINKARM_GoAllowSim()
        {
        }

        /// <summary>
        /// 执行程序
        /// </summary>
        /// <remarks></remarks>
       
        public void JLINKARM_Go()
        {
        }

        /// <summary>
        /// 中断程序执行
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
       
        public bool JLINKARM_Halt()
        {
        }

        /// <summary>
        /// 单步执行
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
       
        public bool JLINKARM_Step()
        {
        }

        /// <summary>
        /// 清除错误信息
        /// </summary>
        /// <remarks></remarks>
       
        public void JLINKARM_ClrError()
        {
        }

        /// <summary>
        /// 设置JLINK接口速度
        /// </summary>
        /// <param name="speed"></param>
        /// <remarks>0为自动调整</remarks>
       
        public void JLINKARM_SetSpeed(int speed)
        {
        }

        /// <summary>
        /// 设置JTAG为最高速度
        /// </summary>
        /// <remarks></remarks>
       
        public void JLINKARM_SetMaxSpeed()
        {
        }

       
        public UInt16 JLINKARM_GetSpeed()
        {
        }

       
        public UInt32 JLINKARM_GetVoltage()
        {
        }

        /// <summary>
        /// 当前MCU是否处于停止状态
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
       
        public bool JLINKARM_IsHalted()
        {
        }

       
        public bool JLINKARM_IsConnected()
        {
        }

        /// <summary>
        /// JLINK是否已经可以操作了
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
       
        public bool JLINKARM_IsOpen()
        {
        }

        /// <summary>
        /// 取消程序断点
        /// </summary>
        /// <param name="index">断点序号</param>
        /// <remarks>配合JLINKARM_SetBP()使用</remarks>
       
        public void JLINKARM_ClrBP(UInt32 index)
        {
        }

        /// <summary>
        /// 设置程序断点
        /// </summary>
        /// <param name="index">断点序号</param>
        /// <param name="addr">目标地址</param>
        /// <remarks>建议使用JLINKARM_SetBPEx()替代</remarks>
       
        public void JLINKARM_SetBP(UInt32 index, UInt32 addr)
        {
        }

        /// <summary>
        /// 设置程序断点
        /// </summary>
        /// <param name="addr">目标地址</param>
        /// <param name="mode">断点类型</param>
        /// <returns>Handle,提供给JLINKARM_ClrBPEx()使用</returns>
        /// <remarks></remarks>
       
        public int JLINKARM_SetBPEx(UInt32 addr, BP_MODE mode)
        {
        }

        /// <summary>
        /// 取消程序断点
        /// </summary>
        /// <param name="handle"></param>
        /// <remarks>配合JLINKARM_SetBPEx()使用</remarks>
       
        public void JLINKARM_ClrBPEx(int handle)
        {
        }

       
        private int JLINKARM_SetWP(UInt32 addr, UInt32 addrmark, UInt32 dat, UInt32 datmark, byte ctrl, byte ctrlmark)
        {
        }

        /// <summary>
        /// 取消数据断点
        /// </summary>
        /// <param name="handle"></param>
        /// <remarks>配合JLINKARM_SetWP()使用</remarks>
       
        public void JLINKARM_ClrWP(int handle)
        {
        }

        /// <summary>
        /// 设置寄存器
        /// </summary>
        /// <param name="index"></param>
        /// <param name="dat"></param>
        /// <remarks></remarks>
       
        public void JLINKARM_WriteReg(ARM_REG index, UInt32 dat)
        {
        }

        /// <summary>
        /// 读取寄存器
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        /// <remarks></remarks>
       
        public UInt32 JLINKARM_ReadReg(ARM_REG index)
        {
        }

        /// <summary>
        /// 写入一段数据
        /// </summary>
        /// <param name="addr"></param>
        /// <param name="size"></param>
        /// <param name="buf"></param>
        /// <remarks></remarks>
       
        public void JLINKARM_WriteMem(UInt32 addr, UInt32 size, byte[] buf)
        {
        }

        /// <summary>
        /// 读取一段数据
        /// </summary>
        /// <param name="addr"></param>
        /// <param name="size"></param>
        /// <param name="buf"></param>
        /// <remarks></remarks>
       
        public void JLINKARM_ReadMem(UInt32 addr, UInt32 size,         byte[] buf)
        {
        }

        /// <summary>
        /// 从调试通道获取一串数据
        /// </summary>
        /// <param name="buf"></param>
        /// <param name="size">需要获取的数据长度</param>
        /// <remarks></remarks>
       
        public void JLINKARM_ReadDCCFast( UInt32[] buf, UInt32 size)
        {
        }

        /// <summary>
        /// 从调试通道获取一串数据
        /// </summary>
        /// <param name="buf"></param>
        /// <param name="size">希望获取的数据长度</param>
        /// <param name="timeout"></param>
        /// <returns>实际获取的数据长度</returns>
        /// <remarks></remarks>
       
        public UInt32 JLINKARM_ReadDCC( UInt32[] buf, UInt32 size, int timeout)
        {
        }

        /// <summary>
        /// 向调试通道写入一串数据
        /// </summary>
        /// <param name="buf"></param>
        /// <param name="size">需要写入的数据长度</param>
        /// <remarks></remarks>
       
        public void JLINKARM_WriteDCCFast(UInt32[] buf, UInt32 size)
        {
        }

        /// <summary>
        /// 向调试通道写入一串数据
        /// </summary>
        /// <param name="buf"></param>
        /// <param name="size">希望写入的数据长度</param>
        /// <param name="timeout"></param>
        /// <returns>实际写入的数据长度</returns>
        /// <remarks></remarks>
       
        public UInt32 JLINKARM_WriteDCC(UInt32[] buf, UInt32 size, int timeout)
        {
        }

        /// <summary>
        /// 获取JLINK的DLL版本号
        /// </summary>
        /// <returns></returns>
        /// <remarks>使用10进制数表示</remarks>
       
        public UInt32 JLINKARM_GetDLLVersion()
        {
        }

        /// <summary>
        /// 获取JLINK的固件版本号
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
       
        public UInt32 JLINKARM_GetHardwareVersion()
        {
        }

       
        private void JLINKARM_GetFeatureString(        byte[] oBuffer)
        {
        }

       
        private void JLINKARM_GetOEMString(        byte[] oBuffer)
        {
        }

       
        public Text.StringBuilder JLINKARM_GetCompileDateTime()
        {
        }

       
        public UInt32 JLINKARM_GetSN()
        {
        }

        /// <summary>
        /// 获取当前MCU的ID号
        /// </summary>
        /// <returns></returns>
        /// <remarks></remarks>
       
        public UInt32 JLINKARM_GetId()
        {
        }

       
        private void JLINKARM_ReadMemU32(UInt32 addr, UInt32 leng, ref UInt32 buf, ref byte status)
        {
        }

        /// <summary>
        /// 写入32位的数据
        /// </summary>
        /// <param name="addr"></param>
        /// <param name="dat"></param>
        /// <remarks></remarks>
       
        public void JLINKARM_WriteU32(UInt32 addr, UInt32 dat)
        {
        }

       
        private void JLINKARM_ReadMemU16(UInt32 addr, UInt32 leng, ref UInt16 buf, ref byte status)
        {
        }

        /// <summary>
        /// 写入16位的数据
        /// </summary>
        /// <param name="addr"></param>
        /// <param name="dat"></param>
        /// <remarks></remarks>
       
        public void JLINKARM_WriteU16(UInt32 addr, UInt16 dat)
        {
        }

       
        private void JLINKARM_ReadMemU8(UInt32 addr, UInt32 leng, ref byte buf, ref byte status)
        {
        }

        /// <summary>
        /// 写入8位的数据
        /// </summary>
        /// <param name="addr"></param>
        /// <param name="dat"></param>
        /// <remarks></remarks>
       
        public void JLINKARM_WriteU8(UInt32 addr, byte dat)
        {
        }

        /// <summary>
        /// 读取32位的数据
        /// </summary>
        /// <param name="addr"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        public UInt32 JLINKARM_ReadU32(UInt32 addr)
        {
                UInt32 dat;
                byte stu;
                JLINKARM_ReadMemU32(addr, 1, dat, stu);
                return dat;
        }

        /// <summary>
        /// 读取16位的数据
        /// </summary>
        /// <param name="addr"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        public UInt16 JLINKARM_ReadU16(UInt32 addr)
        {
                UInt16 dat;
                byte stu;
                JLINKARM_ReadMemU16(addr, 1, dat, stu);
                return dat;
        }

        /// <summary>
        /// 读取8位的数据
        /// </summary>
        /// <param name="addr"></param>
        /// <returns></returns>
        /// <remarks></remarks>
        public byte JLINKARM_ReadU8(UInt32 addr)
        {
                byte dat;
                byte stu;
                JLINKARM_ReadMemU8(addr, 1, dat, stu);
                return dat;
        }

        /// <summary>
        /// 设置数据断点
        /// </summary>
        /// <param name="addr">目标地址</param>
        /// <param name="addrmark">地址屏蔽位</param>
        /// <param name="dat">目标数据</param>
        /// <param name="datmark">数据屏蔽位</param>
        /// <param name="mode">触发模式</param>
        /// <returns>Handle,提供给JLINKARM_ClrWP()函数使用</returns>
        /// <remarks>当前数值除了屏蔽位以外的数据位,与目标数据除了屏蔽位以外的数据位,一致即可产生触发</remarks>
        public int JLINKARM_SetWP(UInt32 addr, UInt32 addrmark, UInt32 dat, UInt32 datmark, WP_MODE mode)
        {
                switch (mode) {
                        case WP_MODE.READ_WRITE:
                                return JLINKARM_SetWP(addr, addrmark, dat, datmark, 0x8, 0xf7);
                        case WP_MODE.READ:
                                return JLINKARM_SetWP(addr, addrmark, dat, datmark, 0x8, 0xf6);
                        case WP_MODE.WRITE:
                                return JLINKARM_SetWP(addr, addrmark, dat, datmark, 0x9, 0xf6);
                }
        }

        public string JLINKARM_StringFeature()
        {
                byte[] aa = new byte;
                JLINKARM_GetFeatureString(aa);
                Text.ASCIIEncoding kk = new Text.ASCIIEncoding();
                string ss = kk.GetString(aa);
                return ss;
        }

        public string JLINKARM_StringOEM()
        {
                byte[] aa = new byte;
                JLINKARM_GetOEMString(aa);
                Text.ASCIIEncoding kk = new Text.ASCIIEncoding();
                string ss = kk.GetString(aa);
                return ss;
        }

        public void JLINKARM_Setup(string cmdstr)
        {
                //RmAnnotate rm = new RmAnnotate();
                //rm.MarkDosMode = false;
                //rm.MarkStartSpaceToTab = 0;
                //cmdstr = rm.Convert(cmdstr);
                cmdstr = cmdstr.Replace(' ', "");
                cmdstr = cmdstr.Replace(vbLf, "");
                cmdstr = cmdstr.Replace(vbTab, "");
                string[] cmd = cmdstr.Split(';');
                for (int i = 0; i <= cmd.Length - 1; i++) {
                        _setupDoCmd(cmd(i));
                }
        }
        private void _setupDoCmd(string cmdstr)
        {
                string cmd = cmdstr.ToLower();
                cmd = cmd.Replace("(", ",");
                cmd = cmd.Replace(")", "");
                cmd = cmd.TrimEnd(',');
                string[] arg = cmd.Split(',');

                UInt32 val1;
                UInt32 val2;
                if (arg.Length == 3) {
                        cmd = arg(0);
                        val1 = _setupGetVal(arg(1));
                        val2 = _setupGetVal(arg(2));
                } else if (arg.Length == 2) {
                        cmd = arg(0);
                        val1 = _setupGetVal(arg(1));
                        val2 = 0;
                } else if (arg.Length == 1) {
                        cmd = arg(0);
                        val1 = 0;
                        val2 = 0;
                } else {
                        cmd = "";
                        val1 = 0;
                        val2 = 0;
                }

                if (cmd != "") {
                        Debug.WriteLine("Do CMD: " + cmdstr);
                        switch (cmd) {
                                case "SetJTAGSpeed".ToLower:
                                        JTAG.JLINKARM_SetSpeed(val1);
                                case "Delay".ToLower:
                                        JTAG.JLINKARM_Sleep(val1);
                                case "DisableMMU".ToLower:
                                        Debug.WriteLine("...........................CMD not Supported");
                                case "Go".ToLower:
                                        JTAG.JLINKARM_Go();
                                case "Halt".ToLower:
                                        JTAG.JLINKARM_Halt();
                                case "Reset".ToLower:
                                        JTAG.JLINKARM_Reset();
                                        if (val1) {
                                                JTAG.JLINKARM_Sleep(val1);
                                        }
                                case "ResetBP0".ToLower:
                                        Debug.WriteLine("...........................CMD not Supported");
                                case "ResetADI".ToLower:
                                        Debug.WriteLine("...........................CMD not Supported");
                                case "Read8".ToLower:
                                        JTAG.JLINKARM_ReadU8(val1);
                                case "Read16".ToLower:
                                        JTAG.JLINKARM_ReadU16(val1);
                                case "Read32".ToLower:
                                        JTAG.JLINKARM_ReadU32(val1);
                                case "Verify8".ToLower:
                                        do {
                                                byte aa = JTAG.JLINKARM_ReadU8(val1);
                                                if (aa == (byte)val2 & 0xff) {
                                                        break; // TODO: might not be correct. Was : Exit Do
                                                }
                                                JTAG.JLINKARM_Sleep(1);
                                        } while (true);

                                case "Verify16".ToLower:
                                        do {
                                                ushort aa = JTAG.JLINKARM_ReadU16(val1);
                                                if (aa == (ushort)val2 & 0xffff) {
                                                        break; // TODO: might not be correct. Was : Exit Do
                                                }
                                                JTAG.JLINKARM_Sleep(1);
                                        } while (true);

                                case "Verify32".ToLower:
                                        do {
                                                uint aa = JTAG.JLINKARM_ReadU32(val1);
                                                if (aa == val2) {
                                                        break; // TODO: might not be correct. Was : Exit Do
                                                }
                                                JTAG.JLINKARM_Sleep(1);
                                        } while (true);

                                case "Write8".ToLower:
                                        JTAG.JLINKARM_WriteU8(val1, val2);
                                case "Write16".ToLower:
                                        JTAG.JLINKARM_WriteU16(val1, val2);
                                case "Write32".ToLower:
                                        JTAG.JLINKARM_WriteU32(val1, val2);
                                case "WriteVerify8".ToLower:
                                        do {
                                                JTAG.JLINKARM_WriteU8(val1, val2);
                                                byte aa = JTAG.JLINKARM_ReadU8(val1);
                                                if (aa == (byte)val2 & 0xff) {
                                                        break; // TODO: might not be correct. Was : Exit Do
                                                }
                                                JTAG.JLINKARM_Sleep(1);
                                        } while (true);

                                case "WriteVerify16".ToLower:
                                        do {
                                                JTAG.JLINKARM_WriteU16(val1, val2);
                                                ushort aa = JTAG.JLINKARM_ReadU16(val1);
                                                if (aa == (ushort)val2 & 0xffff) {
                                                        break; // TODO: might not be correct. Was : Exit Do
                                                }
                                                JTAG.JLINKARM_Sleep(1);
                                        } while (true);

                                case "WriteVerify32".ToLower:
                                        do {
                                                JTAG.JLINKARM_WriteU32(val1, val2);
                                                uint aa = JTAG.JLINKARM_ReadU32(val1);
                                                if (aa == val2) {
                                                        break; // TODO: might not be correct. Was : Exit Do
                                                }
                                                JTAG.JLINKARM_Sleep(1);
                                        } while (true);

                                case "WriteRegister".ToLower:
                                        JTAG.JLINKARM_WriteReg(val1, val2);
                                case "WriteJTAG_IR".ToLower:
                                        Debug.WriteLine("...........................CMD not Supported");
                                case "WriteJTAG_DR".ToLower:
                                        Debug.WriteLine("...........................CMD not Supported");
                                default:
                                        Debug.WriteLine("...........................Unkonwned CMD");
                        }
                }
        }
        private UInt32 _setupGetVal(string str)
        {
                UInt32 dd;
                if (str.StartsWith("0x") && str.Length >= 3) {
                        dd = Convert.ToUInt32(str.Substring(2), 16);
                } else {
                        dd = Convert.ToUInt32(str);
                }
                return dd;
        }

        /// <summary>
        /// ARM内部寄存器
        /// </summary>
        /// <remarks></remarks>
        public enum ARM_REG : UInt32
        {
                R0,
                R1,
                R2,
                R3,
                R4,
                R5,
                R6,
                R7,
                CPSR,
                R15,
                R8_USR,
                R9_USR,
                R10_USR,
                R11_USR,
                R12_USR,
                R13_USR,
                R14_USR,
                SPSR_FIQ,
                R8_FIQ,
                R9_FIQ,
                R10_FIQ,
                R11_FIQ,
                R12_FIQ,
                R13_FIQ,
                R14_FIQ,
                SPSR_SVC,
                R13_SVC,
                R14_SVC,
                SPSR_ABT,
                R13_ABT,
                R14_ABT,
                SPSR_IRQ,
                R13_IRQ,
                R14_IRQ,
                SPSR_UND,
                R13_UND,
                R14_UND,
                SPSR_SYS,
                R13_SYS,
                R14_SYS,
                PC = 9
        }

        /// <summary>
        /// 程序断点模式
        /// </summary>
        /// <remarks></remarks>
        public enum BP_MODE : UInt32
        {
                ARM = 1,
                THUMB = 2,
                HARD_ARM = 0xffffff01u,
                HARD_THUMB = 0xffffff02u,
                SOFT_ARM = 0xf1u,
                SOFT_THUMB = 0xf2u
        }

        /// <summary>
        /// 数据断点模式
        /// </summary>
        /// <remarks></remarks>
        public enum WP_MODE : UInt32
        {
                READ_WRITE,
                READ,
                WRITE
        }
}

gwnpeter 发表于 2014-10-1 16:36:05

想要什么功能,可以自己开发了,给论坛上需要的人
我之前就是通过dcc通信,做了一个arm9 2440的bootloader下载器

shangdawei 发表于 2014-10-1 16:41:46

这个很详细了, 支持一下!

shangdawei 发表于 2014-10-1 16:47:36

JLINKARM_GetVoltage 这个函数找不到啊, 是否可用 JLINKARM_GetHWStatus 替代 ?

GunGun 发表于 2014-10-1 17:09:00

不错不错......

majialou 发表于 2014-10-1 17:11:28

顶一下,谢谢

carney 发表于 2014-10-1 22:03:15

感谢分享,收藏备用

gwnpeter 发表于 2014-10-2 00:01:17

shangdawei 发表于 2014-10-1 16:47
JLINKARM_GetVoltage 这个函数找不到啊, 是否可用 JLINKARM_GetHWStatus 替代 ?

估计是版本问题,我的api是 jlinkarm ver 4.7x的

xCamel 发表于 2014-10-2 00:33:17

这个是去哪里找的,有资料吗?

airwolf09921 发表于 2014-10-2 00:44:30

谢谢分享 留下了

gwnpeter 发表于 2014-10-2 07:13:25

自己反dll出来的

3050311118 发表于 2014-10-2 07:25:29

gwnpeter 发表于 2014-10-2 07:13
自己反dll出来的

楼主你是说通过dll反编译可以获取函数名?

fugeone_copy 发表于 2014-10-2 07:25:35

能详细说说么?

gwnpeter 发表于 2014-10-2 08:15:40

3050311118 发表于 2014-10-2 07:25
楼主你是说通过dll反编译可以获取函数名?

dll获取函数名称很简单,网上软件就行,
但是获得传递的参数就很麻烦了,要看汇编,跟踪堆载
最最麻烦的是,还要猜测传递的参数的功能......

3050311118 发表于 2014-10-2 08:22:19

gwnpeter 发表于 2014-10-2 08:15
dll获取函数名称很简单,网上软件就行,
但是获得传递的参数就很麻烦了,要看汇编,跟踪堆载
最最麻烦的 ...

嗯以前想知道怎样获取函数名无从下手,谢谢楼主了    接下来再慢慢摸索吧

zsenbao 发表于 2014-10-2 08:24:14

牛人,感谢分享

f1yh1347 发表于 2014-10-2 08:31:27

公司曾经买了一份 ,做烧写器很好。

lovecxm 发表于 2014-10-2 13:06:01

努力学习C#中。。。。

abutter 发表于 2014-10-2 14:41:57

有文档记录吗?

worldsing 发表于 2014-10-2 18:05:35

我jlink写应用代码?

dengnian602 发表于 2014-10-2 18:22:57

这东西好,MARK一下

zwjiang8212 发表于 2014-10-2 19:35:20

mark{:sad:}

zhousun 发表于 2014-10-2 20:20:02

牛人,这也行啊,我还以为有用户手册呢

xly2014 发表于 2014-11-6 15:25:07

c#的 JLINK API

wk930523 发表于 2014-11-6 17:16:05

会C#总用JLINK,还不知道这是干什么的,先收藏着

peiyan 发表于 2014-11-6 17:56:11

谢谢分享,改天自己写个烧录软件

xjtyOnly51 发表于 2014-11-7 08:19:01

mark, thanks

youthdou 发表于 2014-11-7 09:15:18

标记一下,思路很重要。。。

kinsno 发表于 2014-11-11 10:13:09

gwnpeter 发表于 2014-10-2 08:15
dll获取函数名称很简单,网上软件就行,
但是获得传递的参数就很麻烦了,要看汇编,跟踪堆载
最最麻烦的 ...

这东西干嘛用的啊?我是外行!
自己写一个上位机,那些函数原型从哪来呢? 写了上位机要干撒啊?不是太明白;

nongxiaoming 发表于 2014-11-11 10:23:42

kinsno 发表于 2014-11-11 10:13
这东西干嘛用的啊?我是外行!
自己写一个上位机,那些函数原型从哪来呢? 写了上位机要干撒啊?不是太 ...

这东西是加入到你的上位机工程,然后你就可以对jlink进行操作了,比如读取你的板子,或复位你的板子,写内存,读内存等等都可以,你就可以自己为所欲为了。这个要归功于JlinkArm.dll这个库,别忘了在应用程序中带一个这个。我也封装了一个Qt用的,很好用的。

kinsno 发表于 2014-11-11 10:45:25

nongxiaoming 发表于 2014-11-11 10:23
这东西是加入到你的上位机工程,然后你就可以对jlink进行操作了,比如读取你的板子,或复位你的板子,写 ...

小农,那不还得是插入JLINK,没啥用处似的;平常用JLINK就是用来下载程序,偶尔仿真,还能干啥? 放在上位机里面,能有啥用?

nongxiaoming 发表于 2014-11-11 10:58:58

kinsno 发表于 2014-11-11 10:45
小农,那不还得是插入JLINK,没啥用处似的;平常用JLINK就是用来下载程序,偶尔仿真,还能干啥? 放在 ...

很多时候你没用到,但有时候还是要用到的,比如一些量产工具,你要读取芯片的uuid,然后生成对应的bootloader和固件,然后烧写。再比如一些数据监控软件,你想在不影响芯片内部的应用,但又能观测到一些信息,那就用这个了,特别是那些低功耗的,cpu休眠下,如果每次吐信息都往串口吐,那会影响观测。

yp19820523 发表于 2014-11-11 12:24:53

gwnpeter 发表于 2014-10-2 08:15
dll获取函数名称很简单,网上软件就行,
但是获得传递的参数就很麻烦了,要看汇编,跟踪堆载
最最麻烦的 ...

只会看函数名,其他的有这方面的教程么?

平时都是慢慢猜然后写个demo慢慢试,效率好低。

craigtao 发表于 2014-12-5 14:41:53

楼主能分享工程demo吗?

mcuprogram 发表于 2015-2-2 10:30:46

f1yh1347 发表于 2014-10-2 08:31
公司曾经买了一份 ,做烧写器很好。

公司怎么买,有详细流程吗      

jarodzz 发表于 2015-2-2 10:43:40

本帖最后由 jarodzz 于 2015-2-2 10:51 编辑

mcuprogram 发表于 2015-2-2 10:30
公司怎么买,有详细流程吗

我猜應該是向segger買的吧!
https://www.segger.com/jlink-sdk.html

jarodzz 发表于 2015-2-2 10:52:42

csdn上好像有
http://download.csdn.net/detail/dragonzhangcl/4460177
我沒有帳號,看有沒有熱心網友幫忙搬到這來

f1yh1347 发表于 2015-2-2 11:29:04

mcuprogram 发表于 2015-2-2 10:30
公司怎么买,有详细流程吗

找广州风标电子技术有限公司即可,约RMB 8000。

huangqi412 发表于 2015-2-2 12:13:20

这个跟JLINK版本有关系么

jiangkehong 发表于 2015-2-2 18:52:52

最近正想搞个用jlink下载资源文件到SPI的上位机,感谢楼主分享!

abutter 发表于 2015-2-2 18:56:47

jarodzz 发表于 2015-2-2 10:52
csdn上好像有
http://download.csdn.net/detail/dragonzhangcl/4460177
我沒有帳號,看有沒有熱心網友幫忙 ...

这个是根据 RDI 协议来写的,不是直接 jlinkarm.dll 调用。

abutter 发表于 2015-2-2 18:58:37

kinsno 发表于 2014-11-11 10:13
这东西干嘛用的啊?我是外行!
自己写一个上位机,那些函数原型从哪来呢? 写了上位机要干撒啊?不是太 ...

例如你要做个特殊的功能,例如加密了固件然后烧结,你总不能一个一个的生成镜像,然后让别人烧结吧。

569350810 发表于 2015-2-11 22:47:34

谢谢分享,以后会用到

jiangkehong 发表于 2015-2-18 20:50:32

JLinkARM.dll 如何加到项目中?或者放到哪个指定的目录?哪位大神指点一下,C#刚刚入门{:mad:},把楼主的代码放到一个.cs中,出现很多错误无法去除,找度娘也问不出究竟

lrzxc 发表于 2015-2-18 22:09:24

jarodzz 发表于 2015-2-2 10:52
csdn上好像有
http://download.csdn.net/detail/dragonzhangcl/4460177
我沒有帳號,看有沒有熱心網友幫忙 ...

今天正好看到,帮忙转过来,请笑纳

TANK99 发表于 2015-2-19 00:30:45

好东西,记录。

amwox 发表于 2015-2-20 20:01:45

这个很详细了, {:smile:},顶

ddz123abcdef 发表于 2015-2-20 21:36:22

功能很强大,回复里解释得很详细

tdh03z 发表于 2015-2-22 21:15:39

哈,居然可以这样用,有时间试下效果咋样

jarodzz 发表于 2015-2-25 00:31:14

lrzxc 发表于 2015-2-18 22:09
今天正好看到,帮忙转过来,请笑纳

感謝...好人一枚


jarodzz 发表于 2015-2-25 00:34:57

abutter 发表于 2015-2-2 18:56
这个是根据 RDI 协议来写的,不是直接 jlinkarm.dll 调用。

這裡面有一個arm.h,裡面的API list 如下
/*********************************************************************
*
*       API functions
*/
void         JLINKARM_Close(void);
void         JLINKARM_ClrBP(unsigned BPIndex);
void         JLINKARM_ClrError(void);
void         JLINKARM_EnableLog2File(void);
const char * JLINKARM_GetCompileDateTime(void);
U16          JLINKARM_GetEmbeddedFWVersion(void);
void         JLINKARM_GetHWStatus(JTAG_HW_STATUS * pStat);
U32          JLINKARM_GetId(void);
void         JLINKARM_GetIdData(JTAG_ID_DATA * pIdData);
U16          JLINKARM_GetSelDevice(void);
int          JLINKARM_GetVoltage(void);
U16          JLINKARM_GetSpeed(void);
void         JLINKARM_Go(void);
void         JLINKARM_GoIntDis(void);
char         JLINKARM_Halt(void);
char         JLINKARM_HaltNoSave(void);
char         JLINKARM_IsConnected(void);
char         JLINKARM_IsHalted(void);
const char * JLINKARM_Open(void);
int          JLINKARM_ReadDCC(U32 * pData, U32 NumItems, int TimeOut);
void         JLINKARM_ReadDCCFast(U32 * pData, U32 NumItems);
U32          JLINKARM_ReadICEReg(int RegIndex);
int          JLINKARM_ReadMem (U32 addr, U32 count, void * p);
void         JLINKARM_ReadMemU8 (U32 Addr, U32 NumItems, U8 * pData, U8* pStatus);
void         JLINKARM_ReadMemU16(U32 Addr, U32 NumItems, U16* pData, U8* pStatus);
void         JLINKARM_ReadMemU32(U32 Addr, U32 NumItems, U32* pData, U8* pStatus);
U32          JLINKARM_ReadReg (ARM_REG RegIndex);
void         JLINKARM_Reset(void);
void         JLINKARM_ResetPullsTRST (U8 OnOff);
void         JLINKARM_ResetPullsRESET(U8 OnOff);
void         JLINKARM_SelDevice(U16 DeviceIndex);
void         JLINKARM_SetBP(unsigned BPIndex, U32 Addr);
int          JLINKARM_SetEndian(int v);
int          JLINKARM_SetInitRegsOnReset(int v);
void         JLINKARM_SetMaxSpeed(void);
void         JLINKARM_SetResetDelay(int ms);
int          JLINKARM_SetResetPara(int Value);
void         JLINKARM_SetSpeed(int Speed);
char         JLINKARM_Step(void);
int          JLINKARM_Test(void);
U16          JLINKARM_UpdateFirmware(void);
U32          JLINKARM_UpdateFirmwareIfNewer(void);
int          JLINKARM_WaitDCCRead(int TimeOut);
int          JLINKARM_WriteDCC(const U32 * pData, U32 NumItems, int TimeOut);
void         JLINKARM_WriteDCCFast(const U32 * pData, U32 NumItems);
void         JLINKARM_WriteICEReg(int RegIndex, U32 Value, int AllowDelay);
char         JLINKARM_WriteReg(ARM_REG RegIndex, U32 Data);
void         JLINKARM_WriteMem(U32 addr, U32 count, const void * p);
void         JLINKARM_WriteMemDelayed(U32 Addr, U32 Count, const void * p);
void         JLINKARM_WriteU8 (U32 addr, U8 Data);
void         JLINKARM_WriteU16(U32 addr, U16 Data);
void         JLINKARM_WriteU32(U32 addr, U32 Data);

void          JLINKARM_EnableLogCom(void (*DebugFunc)(const char *));

跟LZ的好像是一樣的,
所以應該是直接用JlinkARM。

abutter 发表于 2015-2-26 08:51:46

jarodzz 发表于 2015-2-25 00:34
這裡面有一個arm.h,裡面的API list 如下
/********************************************************** ...

反汇编看看。

sywong 发表于 2015-2-26 09:21:17

gwnpeter 发表于 2014-10-2 08:15
dll获取函数名称很简单,网上软件就行,
但是获得传递的参数就很麻烦了,要看汇编,跟踪堆载
最最麻烦的 ...

有用的技術,感謝分享。

sywong 发表于 2015-2-26 09:24:24

lrzxc 发表于 2015-2-18 22:09
今天正好看到,帮忙转过来,请笑纳

感謝分享檔案。

yufeistudio 发表于 2015-3-1 15:11:01

绝对支持,哪来的?

fire18 发表于 2015-3-17 21:01:36

请教下在寄存器定义列表中怎么没有MSP和PSP呢,它们的编号是多少,谢谢

fire18 发表于 2015-3-17 21:04:37

刚查到了
MSP: 0X11
PSP: 0X12

Tifosi_ 发表于 2015-3-20 09:10:35

好东西多谢

Excellence 发表于 2015-3-20 09:38:04

感謝分享。{:victory:}{:victory:}{:victory:}

270388026 发表于 2016-1-7 09:03:23

牛。谢谢{:victory:}{:victory:}{:victory:}

270388026 发表于 2016-1-7 09:11:38

价值连城。应该是用IDA搞定的

mega1702 发表于 2016-1-7 09:29:44

谢谢楼主分享!!!

wangyu_2011 发表于 2016-1-7 22:01:13

这个必须要支持的。

dreambox 发表于 2016-2-23 13:32:08

好东西多谢

lanfeng0107 发表于 2016-2-24 11:11:41

厉害,正需要1

Baldwin 发表于 2016-6-12 17:39:49

nongxiaoming 发表于 2014-11-11 10:23
这东西是加入到你的上位机工程,然后你就可以对jlink进行操作了,比如读取你的板子,或复位你的板子,写 ...

您好,能否分享一下Qt调用jlink的

dulala 发表于 2016-6-15 14:20:51

这个不错,我们是用CMD调用JLINK.EXE直接来做的。公司产品中用STM32,最近被订2W,用labvieW做了IAP+APP一次烧录,并写入对应的烧录时间及编号信息,然后再转到应用程序,测试各个功能,感觉是很好的。

负西弱 发表于 2016-6-15 16:34:19

楼主,请教一下,这个怎么用的,我在VS新建了一个工程,然后新建一个文件,把你的代码拷进去,一大堆报错

智涅 发表于 2016-6-17 12:31:18

赞一个,以后学习用

浮生莫若闲 发表于 2016-6-17 14:31:51

这个不错,做个记号,以后应该用得上

wt3333 发表于 2016-6-17 15:34:20

lrzxc 发表于 2015-2-18 22:09
今天正好看到,帮忙转过来,请笑纳

谢谢 转发

lazyfans 发表于 2016-6-18 00:18:22

以前是用
dumpbin    /EXPORTS   JLinkARM.dll
得到
      4461A7 00042EC0 JLINK_WriteU8
      4471A8 00042E60 JLINK_WriteVerifyMem
      2761A9 00043680 _JLINK_Communicate@16
      2891AA 00042B70 _JLINK_EMU_GetProductId@0
      3121AB 00043500 _JLINK_FLASH_EraseChip@0
      3551AC 00043150 _JLINK_JTAG_ConfigDevices@8
      3561AD 00043170 _JLINK_JTAG_GetData@12
      3581AE 00043050 _JLINK_JTAG_GetU16@4
      3591AF 00043060 _JLINK_JTAG_GetU32@4
      3601B0 00043040 _JLINK_JTAG_GetU8@4
      3621B1 00043070 _JLINK_JTAG_StoreGetData@12
      3641B2 000430B0 _JLINK_JTAG_StoreInst@8
      3651B3 000430F0 _JLINK_JTAG_StoreRaw@12
      3681B4 00043130 _JLINK_JTAG_WriteData@12
      3731B5 000436A0 _JLINK_POWERTRACE_Control@12
      3741B6 00043780 _JLINK_POWERTRACE_Read@8
      3961B7 00043170 _JLINK_SWD_GetData@12
      3971B8 00043050 _JLINK_SWD_GetU16@4
      3981B9 00043060 _JLINK_SWD_GetU32@4
      3991BA 00043040 _JLINK_SWD_GetU8@4
      4001BB 00043190 _JLINK_SWD_StoreGetRaw@16
      4011BC 000431B0 _JLINK_SWD_StoreRaw@12
      4021BD 00043110 _JLINK_SWD_SyncBits@0
      4031BE 00043120 _JLINK_SWD_SyncBytes@0

zf8848 发表于 2016-9-10 13:44:37

这个可以开发量产工具了

霸气侧漏 发表于 2016-9-10 18:28:57

zf8848 发表于 2016-9-10 13:44
这个可以开发量产工具了

就是离线下载器?

zf8848 发表于 2016-9-10 22:15:26

应该可以了

chxzh123 发表于 2016-9-11 07:15:14

好东西,收藏

gaojing326 发表于 2016-9-12 08:06:16

C#做应用层开发吗还是怎么样做,楼主

lhaoyue 发表于 2016-9-12 13:43:51

c#的 JLINK APImark 牛人

gujiamao_love 发表于 2017-1-5 10:55:22

lazyfans 发表于 2016-6-18 00:18
以前是用
dumpbin    /EXPORTS   JLinkARM.dll
得到


那参数呢??

ffbiao 发表于 2017-2-15 13:43:33

请问如何通过jlink下载程序?哪个命函数?

wofei3344 发表于 2017-3-20 20:50:48

资料不错,不过我怎么不能添加引用....

wofei3344 发表于 2017-4-8 14:19:03

System.EntryPointNotFoundException:“无法在 DLL“JLinkARM.dll”中找到名为“JLINKARM_GetVoltage”的入口点。”

wofei3344 发表于 2017-4-8 16:58:11

楼主的帖子很好,先鬼知道这个有办法擦除Flash、解锁Flash吗,似乎API没有提供....

xaper 发表于 2017-4-8 17:35:28

正需要,谢谢LZ

eastbest 发表于 2017-4-24 23:12:28

多谢楼主分享

yanyanyan168 发表于 2017-6-29 17:17:57

dulala 发表于 2016-6-15 14:20
这个不错,我们是用CMD调用JLINK.EXE直接来做的。公司产品中用STM32,最近被订2W,用labvieW做了IAP+APP一 ...

可以给个 labvieW 例程子吗

yanyanyan168 发表于 2017-6-29 17:18:30

dulala 发表于 2016-6-15 14:20
这个不错,我们是用CMD调用JLINK.EXE直接来做的。公司产品中用STM32,最近被订2W,用labvieW做了IAP+APP一 ...

可以给个 labvieW 例程子吗

justdomyself 发表于 2017-11-23 22:34:05

c加加怎么玩

xjtyOnly51 发表于 2017-11-24 08:00:47

45楼 的LED 例子 就是VC++的{:smile:}

justdomyself 发表于 2017-12-26 20:43:04

好东西啊,,,,,,

powerlabor001 发表于 2017-12-26 23:36:46

jlink api,mark一下。

justdomyself 发表于 2018-1-8 16:58:34

lrzxc 发表于 2015-2-18 22:09
今天正好看到,帮忙转过来,请笑纳

看我的流水灯:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    /* Check the parameters */
    //assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
    //assert_param(IS_GPIO_PIN(GPIO_Pin));

   // GPIOx->BSRR = GPIO_Pin;
    unsigned int addr = (unsigned int)&( GPIOx->BSRR );
    jlink.JLINKARM_WriteU32( addr, GPIO_Pin);
}


void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
{
    /* Check the parameters */
    //assert_param(IS_GPIO_ALL_PERIPH(GPIOx));
    //assert_param(IS_GPIO_PIN(GPIO_Pin));

    ///GPIOx->BRR = GPIO_Pin;

    unsigned int addr = (unsigned int)&(GPIOx->BRR);
    jlink.JLINKARM_WriteU32(addr, GPIO_Pin);
}



ID = jlink.JLINKARM_GetId();

    printf("ID is %x\n", ID);

    while (1)
    {
      GPIO_SetBits(GPIOE, GPIO_Pin_10);
      Sleep(100);
      GPIO_ResetBits(GPIOE, GPIO_Pin_10);
      Sleep(100);
    }

{:lol:}

xiaotaodzgzs 发表于 2018-1-8 18:16:31

谁有C# jlink api 简单的例子,想用来加密和hex烧写{:handshake:}{:handshake:}{:handshake:}

llysc 发表于 2018-1-11 10:46:26

楼主厉害,已收藏~~~~~~~~~~~

xiaotaodzgzs 发表于 2018-3-19 20:33:08

{:lol:}有在C#上驱动起来的吗

source.ant 发表于 2018-4-14 11:45:43

nongxiaoming 发表于 2014-11-11 10:23
这东西是加入到你的上位机工程,然后你就可以对jlink进行操作了,比如读取你的板子,或复位你的板子,写 ...

我用C#调用成功,现在也想做个qt版本的,可是调用dll文件不成功,可否指导下QT下是怎么调用jlink.dll的

xiaotaodzgzs 发表于 2018-4-15 23:54:49

基本读写好像可以了不过打开后跳出一个窗口需要手动选着型号,程序设置芯片的接口是哪个,有大神做出来了吗{:smile:}

蓝蓝的恋 发表于 2018-4-16 08:55:37

Jlink还是很强大的

1785345205 发表于 2018-4-16 09:20:17

谢谢分享 正在学c# 这个可以研究学习

Stargazer-1986 发表于 2018-4-16 09:34:21

Mark!!!c#的 JLINK API
页: [1] 2
查看完整版本: c#的 JLINK API,自己用的