请教关于STM32的JTAG编程问题

luckyboy26 2010-04-13 10:05:57
最近要做一个手持下载器,用AT89S52通过JTAG方式给STM32下载程序。由于原来没做过相关的东西,所以网上找了一下相关的资料,照着现有的历程测试了下,发现的以下几个问题

1,STM32对应的BSD文件中,写着
attribute INSTRUCTION_OPCODE of STM32F103C8: entity is
"BYPASS (11111)," &
"EXTEST (00000)," &
"SAMPLE (00010)," &
"PRELOAD (00010)," &
"IDCODE (00001)";
那么我用IDCODE指令去读取CPUID,代码如下
//P1_3 P1_5 P1_6引脚对应TDI TCK TMS
//P3_0对应TDO

#define JTAG_DELAY() _nop_()
#define JTAG_GET_TDO() ((P3_0==1) ? 1:0)

void nvdJTAG_Set(unsigned char Control)
{
P1 = Control;
}

void JTAG_ReadId(void)
{
int i;
char id[32];

JTAG_RunTestldleState();

nvdJTAG_Set(TDI_H | TMS_H | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_H | TCK_H);JTAG_DELAY(); // Select-DR Scan Status

nvdJTAG_Set(TDI_H | TMS_H | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_H | TCK_H);JTAG_DELAY(); // Select-IR Scan Status

nvdJTAG_Set(TDI_H | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_L | TCK_H);JTAG_DELAY(); // Capture-IR Status

nvdJTAG_Set(TDI_H | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_L | TCK_H);JTAG_DELAY(); // Shift-IR Status

//STM32F103XX IDCODE Instruction "00001"
nvdJTAG_Set(TDI_H | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_L | TCK_H);JTAG_DELAY(); // '1'

nvdJTAG_Set(TDI_L | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_L | TMS_L | TCK_H);JTAG_DELAY(); // '0'

nvdJTAG_Set(TDI_L | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_L | TMS_L | TCK_H);JTAG_DELAY(); // '0'

nvdJTAG_Set(TDI_L | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_L | TMS_L | TCK_H);JTAG_DELAY(); // '0'

nvdJTAG_Set(TDI_L | TMS_H | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_L | TMS_H | TCK_H);JTAG_DELAY(); // '0', //Exit1-IR

nvdJTAG_Set(TDI_H | TMS_H | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_H | TCK_H);JTAG_DELAY(); // Update_IR

nvdJTAG_Set(TDI_H | TMS_H | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_H | TCK_H);JTAG_DELAY(); // Select-DR-Scan

nvdJTAG_Set(TDI_H | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_L | TCK_H);JTAG_DELAY(); //Capture-DR

nvdJTAG_Set(TDI_H | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_L | TCK_H);JTAG_DELAY(); //Shift-DR

// Read IDcode..
for( i=0 ; i<=30 ; i++) {
nvdJTAG_Set(TDI_H | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_L | TCK_H);JTAG_DELAY(); //Shift-DR
id[i] = (char)JTAG_GET_TDO();
}

nvdJTAG_Set(TDI_H | TMS_H | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_H | TCK_H);JTAG_DELAY(); //Exit1_DR
id[i] = (char)JTAG_GET_TDO();

nvdJTAG_Set(TDI_H | TMS_H | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_H | TCK_H);JTAG_DELAY(); // Update_DR

nvdJTAG_Set(TDI_H | TMS_L | TCK_L);JTAG_DELAY(); //
nvdJTAG_Set(TDI_H | TMS_L | TCK_H);JTAG_DELAY(); // Run-Test/Idle
nvdJTAG_Set(TDI_H | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_L | TCK_H);JTAG_DELAY(); // Run-Test/Idle
nvdJTAG_Set(TDI_H | TMS_L | TCK_L);JTAG_DELAY();
nvdJTAG_Set(TDI_H | TMS_L | TCK_H);JTAG_DELAY(); // Run-Test/Idle
}

可是取到的32位ID值,每一位总是常为1,不是正确值。现在STM32的板子可以通过ULink正常写程序。
请问这是怎么回事,是不是JTAG_DELAY()函数的延时不对?还是硬件上需要有特殊的电路?
...全文
1316 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
老人参 2010-04-21
  • 打赏
  • 举报
回复
lz做下载器还是做加密器呀,读id,是为了加密吧

S52的flash 空间好像不大, 能下载什么给stm32单片机呀,

st的spi下载程序是开源的,你可以做串口下载器,或者加密器,

我做了一个串口的,硬件很简单,主要是软件实现的,你也可以自己做一个,

我做的是加密器,hoho,

luckyboy26 2010-04-21
  • 打赏
  • 举报
回复 1
请教 stm32有没有专门的擦写Flash的Jtag指令?ST是否公开?

luckyboy26 2010-04-16
  • 打赏
  • 举报
回复
问题1已解决,现在纠结于问题二

用IDCODE取得芯片识别码之后,对stm32内部Flash进行擦写怎么进行
BSD文件里没写管脚或者边界扫描链和寄存器的关系

有人说是 先向指令寄存器写地址,然后操作数据寄存器,数据寄存器的值就传到相应地址上
我理解的是 向指令寄存器写的只能是JTAG的10条指令

请高人指教
luckyboy26 2010-04-13
  • 打赏
  • 举报
回复
接上面的问题
如果当前通过JTAG取得了STM32的控制权,要通过设置STM32的引脚给他内置的Flash写数据,怎么操作。
现在已知控制Flash的寄存器的地址和名称,BSD文件中只有与IO口相关管脚的定义,外围电路的定义没有明确的说明,我不知道哪个管脚与内部Flash相关的寄存器对应,有什么办法可以知道对应关系么。
谢谢各位大侠。
kyzf 2010-04-13
  • 打赏
  • 举报
回复
没具体弄过这方面的东西,MARK

帮顶下、
fzhc123 2010-04-13
  • 打赏
  • 举报
回复
您好
我现在也正在做stm32的手持下载器,一头雾水,能帮忙指点下吗,要访问stm32的flash寄存器,其jtag命令是什么?我的qq147171234 一起讨论下,我是用AVR单片机。
luckyboy26 2010-04-13
  • 打赏
  • 举报
回复
请求高手指教

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧