用三种不同的方式读取唯一的ID,怎么只有第一种方式正常
近日,本人使用STC-ISP工具中的范例,用三种不同的方式读取单片机唯一的ID,怎么只有第一种方式正常,其他两种方式,读出来要么都是00,要么就是ff,不知道是什么原因。楼主仔细看手册哦,大大的红字标注了。
用户新系统设计,尽量选择有CHIP-ID这个功能的芯片,用户自己软加密更强悍 通过观看冲大侠的讲座,发现一个很有用的规律——遇到问题首先去找厂家相关芯片的最新版技术手册,手册支持搜索功能,很方便。 每次翻贴都能解疑答惑得到收获,前段时间想读掉电唤醒定时器时钟频率,搞了好久没能成功今天在这里找到了答案再试就成功了,膜拜!
只是不知道什么原因、烧录代码后打开串口助手收不到数据,改成循环发送就好了。
使用官网例程,主函数中添加加了两句代码转贴这里方便大家测试:
//程序为STC官网例程
//本芯片读出内部掉电时钟频率:8C 6E
#include "stc8h.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
#define CPUIDBASE 0xfde0
#define F32K_ADDR (*(unsigned int volatile xdata *)(CPUIDBASE + 0x09))
bit busy;
//------------------------------
void UartIsr() interrupt 4
{
if (TI)
{
TI = 0;
busy = 0;
}
if (RI)
{
RI = 0;
}
}
//------------------------------
void UartInit()
{
SCON = 0x50;
TMOD = 0x00;
TL1 = BRT;
TH1 = BRT >> 8;
TR1 = 1;
AUXR = 0x40;
busy = 0;
}
//-----------------------------
void UartSend(char dat)
{
while (busy);
busy = 1;
SBUF = dat;
}
//-----------------------------
void Delay500ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
i = 29;
j = 14;
k = 54;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//----------------------------------
void main()
{
P_SW2 |= 0x80;//使能访问XFR
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
UartInit();
ES = 1;
EA = 1;
while (1)
{
UartSend(F32K_ADDR >> 8); //读取32K频率的高字节
UartSend(F32K_ADDR); //读取32K频率的低字节
UartSend(0XAA);//加一个数据结尾标志
Delay500ms();//延时便于查看串口接收的数据
}
}
深圳国芯人工智能有限公司-产品_STC8H系列 (stcai.com)
乐此不疲 发表于 2024-1-23 19:00
每次翻贴都能解疑答惑得到收获,前段时间想读掉电唤醒定时器时钟频率,搞了好久没能成功今天在这里找到了答 ...
有可能是已经发完了才打开串口助手,默认的1s打开,USB-UART芯片不断电,目标单片机重新上电试试,直接用CDC就延迟几秒再发,或者一直发
DebugLab 发表于 2024-1-23 22:29
有可能是已经发完了才打开串口助手,默认的1s打开,USB-UART芯片不断电,目标单片机重新上电试试,直接用 ...
多谢指点!明白了,确实是因为例程只发送一次数据就塞在while(1);这里了,这边打开串口时那边早已经发送结束了,不管它了,我也比较习惯让他连续发送数据这样在打开串口时总能看到结果、不发懵。
页:
[1]
2