找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2189|回复: 7
收起左侧

STC8A8K64S4A12单片机寄存器T24M_ADDR和T22M1184_ADDR如何读取?

[复制链接]
ID:912806 发表于 2021-11-8 22:11 | 显示全部楼层 |阅读模式
根据手册上写的地址去读, 读出来都是FF

2021-11-08_220732.png


根据STC-ISP的提示, 勾选了"在程序区结束处添加重要测试参数", 再下载, 再读这些地址的值, 还是FF
2021-11-08_220927.png


手册里给的地址不对?

有没有谁成功读过这两个值的? 我想在程序里直接切换到对应的频率, 而不是通过ISP烧录去更新
回复

使用道具 举报

ID:624769 发表于 2021-11-9 00:09 | 显示全部楼层
读过,正好前面再做实验,用的又刚好是 8A8K 就顺便再读了一次。

如图:
ReadCode.png
回复

使用道具 举报

ID:863432 发表于 2021-11-9 10:55 | 显示全部楼层
在STCISP软件中,可尝试选择Flash空白区域的填充值为00
回复

使用道具 举报

ID:912806 发表于 2021-11-9 11:19 | 显示全部楼层
多谢回复. 我又试了一遍, 好像还是不行, 奇怪是我的代码不对, 还是下载的配置不对? 还是这个芯片版本的差异?
下载配置能否往下拉一点截个屏看看完整的? 还有芯片版本是多少? 我这个是7.3.12U, 这个是比较近期的版本

测试代码
  1. #include "stc8.h"

  2. typedef     unsigned char   u8;
  3. typedef     unsigned int    u16;

  4. static const char hexTable[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

  5. void timer_init()
  6. {
  7.     // [  BAH,0,0x00]: 外设端口切换寄存器2
  8.     P_SW2      = 0x80;
  9.     // [  D6H,0,0x00]: 定时器2高字节
  10.     T2H        = 0xFF;
  11.     // [  D7H,0,0x00]: 定时器2低字节
  12.     T2L        = 0xD0;
  13.     // [  BAH,0,0x00]: 外设端口切换寄存器2
  14.     P_SW2      = 0x00;
  15.     // [  87H,0,0x30]: 电源控制寄存器
  16.     PCON       = 0xB0;
  17.     // [  8EH,0,0x01]: 辅助寄存器
  18.     AUXR       = 0x15;
  19. }

  20. void uart_init()
  21. {
  22.     // [  98H,0,0x00]: 串口1控制寄存器
  23.     SCON       = 0x50;
  24.     // [  87H,0,0x30]: 电源控制寄存器
  25.     PCON       = 0xB0;
  26.     // [  8EH,0,0x01]: 辅助寄存器
  27.     AUXR       = 0x15;
  28. }


  29. void PrintString(u8 *str)
  30. {
  31.   while (*str != '\0')
  32.   {
  33.     SBUF = *str;
  34.     while(!TI);
  35.     TI = 0;     /* clear */
  36.     str++;
  37.   }
  38. }

  39. void PrintChar(u8 dat)
  40. {
  41.   SBUF = dat;
  42.   while(!TI);
  43.   TI = 0;
  44. }

  45. void PrintHex(u8 hex)
  46. {
  47.     PrintChar(hexTable[hex >> 4]);
  48.     PrintChar(hexTable[hex & 0xF]);
  49. }

  50. void Delay1000ms()                //@22.1184MHz
  51. {
  52.         unsigned char i, j, k;

  53.         i = 113;
  54.         j = 53;
  55.         k = 228;
  56.         do
  57.         {
  58.                 do
  59.                 {
  60.                         while (--k);
  61.                 } while (--j);
  62.         } while (--i);
  63. }

  64. void main(void)
  65. {
  66.   unsigned char i, t1, t2, t3, t4;
  67.   unsigned int pos;
  68.   t1 = (char code *)0xFDF3;
  69.   t2 = (char code *)0xFDF4;
  70.   t3 = (char code *)0xFDF5;
  71.   t4 = (char code *)0xFDF7;

  72.   P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
  73.   P1M1 = 0x00;   P1M0 = 0x00;   //设置为准双向口
  74.   P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
  75.   P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口
  76.   P4M1 = 0x00;   P4M0 = 0x00;   //设置为准双向口
  77.   P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
  78.   P6M1 = 0x00;   P6M0 = 0x00;   //设置为准双向口
  79.   P7M1 = 0x00;   P7M0 = 0x00;   //设置为准双向口

  80.   timer_init();
  81.   uart_init();

  82.   while(1)
  83.   {
  84.     PrintHex(IRTRIM);
  85.     PrintChar(0x20);
  86.     PrintHex(t1);
  87.     PrintChar(0x20);
  88.     PrintHex(t2);
  89.     PrintChar(0x20);
  90.     PrintHex(t3);
  91.     PrintChar(0x20);
  92.     PrintHex(t4);
  93.     PrintChar(0x20);

  94.     pos = 0xFDF3;
  95.     for(i = 0; i < 13; i++)
  96.     {
  97.       PrintHex((char code *)pos);
  98.       pos++;
  99.     }
  100.     PrintChar(0x20);
  101.     PrintString("\r\n");
  102.     Delay1000ms();
  103.   }
  104. }
复制代码

烧录的日志

  1. Current H/W Option:
  2.   . ISP-IRC frequency: 24.110MHz
  3.   . IRC frequency: 22.124MHz
  4.   . Wakeup Timer frequency: 34.250KHz
  5.   . Oscillator gain is HIGH
  6.   . Do not detect the level of P3.2 and P3.3 next download
  7.   . Power-on reset, use the extra power-on delay
  8.   . RESET pin behaves as IO pin
  9.   . Reset while detect a Low-Voltage
  10.   . Thresh voltage level of the built-in LVD : 2.20 V
  11.   . Hardware do not enable Watch-Dog-Timer
  12.   . Watch-Dog-Timer pre-scalar : 256
  13.   . Watch-Dog-Timer stop count in idle mode
  14.   . Program can modify the Watch-Dog-Timer scalar
  15.   . Erase user EEPROM area at next download
  16.   . Do not control 485 at next download
  17.   . Do not check user password next download
  18.   . TXD is independent IO
  19.   . TXD pin as quasi-bidirectional mode after reset
  20.   . P2.0 output HIGH level after reset
  21.   . Reference voltage: 1341 mV (Range: 1270~1410mV)
  22.   . Testing time: 2021-4-23

  23.   MCU type: STC8A8K64S4A12
  24.   F/W version: 7.3.12U

  25. Adjusting frequency ...                        [0.688"]
  26. Adjusted frequency: 22.124MHz (0.027%)

  27. Re-handshaking ... Successful                        [0.125"]
  28. Current Baudrate: 115200
  29. Erasing MCU flash ...  OK !                [1.266"]
  30. MCU ID : F628C57D0BC117
  31. Programming user code ... OK !                [0.156"]
  32. Programming OPTIONS ... OK !                [0.032"]

  33. H/W Option upgrade to:
  34.   . ISP-IRC frequency: 24.110MHz
  35.   . IRC frequency: 22.124MHz
  36.   . Wakeup Timer frequency: 34.250KHz
  37.   . Oscillator gain is HIGH
  38.   . Do not detect the level of P3.2 and P3.3 next download
  39.   . Power-on reset, use the extra power-on delay
  40.   . RESET pin behaves as IO pin
  41.   . Reset while detect a Low-Voltage
  42.   . Thresh voltage level of the built-in LVD : 2.20 V
  43.   . Hardware do not enable Watch-Dog-Timer
  44.   . Watch-Dog-Timer pre-scalar : 256
  45.   . Watch-Dog-Timer stop count in idle mode
  46.   . Program can modify the Watch-Dog-Timer scalar
  47.   . Erase user EEPROM area at next download
  48.   . Do not control 485 at next download
  49.   . Do not check user password next download
  50.   . TXD is independent IO
  51.   . TXD pin as quasi-bidirectional mode after reset
  52.   . P2.0 output HIGH level after reset
  53.   . Reference voltage: 1341 mV (Range: 1270~1410mV)
  54.   . Testing time: 2021-4-23
  55. MCU ID : F628C57D0BC117

  56.   MCU type: STC8A8K64S4A12
  57.   F/W version: 7.3.12U

  58.   . Set frequency: 22.118MHz
  59.   . Adjusted frequency: 22.124MHz
  60.   . Trim error: 0.027%


  61.   Complete !(2021-11-09 11:10:00)
复制代码

输出: 这里5B是从IRTRIM里读取的正确的值, 后面输出的都有问题

  1. 5B F3 F4 F5 F7 F3F4F5F6F7F8F9FAFBFCFDFEFF
  2. 5B F3 F4 F5 F7 F3F4F5F6F7F8F9FAFBFCFDFEFF
  3. 5B F3 F4 F5 F7 F3F4F5F6F7F8F9FAFBFCFDFEFF
  4. 5B F3 F4 F5 F7 F3F4F5F6F7F8F9FAFBFCFDFEFF
  5. 5B F3 F4 F5 F7 F3F4F5F6F7F8F9FAFBFCFDFEFF
  6. 5B F3 F4 F5 F7 F3F4F5F6F7F8F9FAFBFCFDFEFF
复制代码



回复

使用道具 举报

ID:912806 发表于 2021-11-9 11:45 | 显示全部楼层
我用这个测试代码读出来了, 得查查是哪里的差异. 在ISP软件里下载的时候, 测了下必须要勾选那个"在程序区结束处添加重要测试参数", 不然只有CPUID有值, 前面部分都是FF
  1. #include "stc8.h"
  2. #include "intrins.h"

  3. #define        FOSC        11059200UL
  4. #define        BRT        (65536 - FOSC / 115200 / 4)


  5. bit        busy;
  6. char        *ID;

  7. void UartIsr() interrupt 4
  8. {
  9.         if (TI)
  10.         {
  11.                 TI = 0;
  12.                 busy = 0;
  13.         }
  14.         if (RI)
  15.         {
  16.                 RI = 0;
  17.         }
  18. }

  19. void UartInit()
  20. {
  21.         SCON = 0x50;
  22.         TMOD = 0x00;
  23.         TL1 = BRT;
  24.         TH1 = BRT >> 8;
  25.         TR1 = 1;
  26.         AUXR = 0x40;
  27.         busy = 0;
  28. }

  29. void UartSend(char dat)
  30. {
  31.         while (busy);
  32.         busy = 1;
  33.         SBUF = dat;
  34. }

  35. void Delay1000ms()                //@22.1184MHz
  36. {
  37.         unsigned char i, j, k;

  38.         i = 55;
  39.         j = 53;
  40.         k = 228;
  41.         do
  42.         {
  43.                 do
  44.                 {
  45.                         while (--k);
  46.                 } while (--j);
  47.         } while (--i);
  48. }

  49. void main()
  50. {
  51.   char i;

  52.   ID = (char code *)0xfdf3;        // STC8A8K64S4A10

  53.   UartInit();
  54.   ES = 1;
  55.   EA = 1;
  56.   while(1)
  57.   {
  58.     for (i = 0; i < 13; i++)
  59.     {
  60.       UartSend(ID[i]);
  61.     }
  62.     UartSend(0x00);
  63.     UartSend(0x00);
  64.     Delay1000ms();
  65.   }
  66. }
  67.   
复制代码
"在程序区结束处添加重要测试参数" 不勾选和勾选的区别
2021-11-09_114444.png

回复

使用道具 举报

ID:624769 发表于 2021-11-9 13:45 | 显示全部楼层
michaelchain 发表于 2021-11-9 11:45
我用这个测试代码读出来了, 得查查是哪里的差异. 在ISP软件里下载的时候, 测了下必须要勾选那个"在程序区结 ...

#include <STC\STC8.H>

#define        MainForce        22118400UL
#define        Baud                (65536 - MainForce/460800/4)

bit        busy;
char        Temp;

char   ReadCode(int addr)
{
        return        *(char code *)(addr);
}

void UartInit()
{
        SCON = 0x50;
        TMOD         = 0x00;
        TL1        = Baud;
        TH1        = Baud >> 8;
        TR1        = 1;
        AUXR        = 0x40;
        busy        = 0;
}

void        UartSend(char dat)
{
        while(busy);
        busy        = 1;
        SBUF        = dat;
}

void main()
{
        Temp        = ReadCode(0xFDf3);
        UartInit();
        ES = 1;
        EA = 1;
        UartSend(Temp);
        while(1);
}

void        UartIsr()        interrupt 4
{
        if(TI)
        {
                TI = 0;
                busy = 0;
        }
        if(RI)
        {
                RI = 0;
       
        }

}
回复

使用道具 举报

ID:624769 发表于 2021-11-9 14:59 | 显示全部楼层
michaelchain 发表于 2021-11-9 11:45
我用这个测试代码读出来了, 得查查是哪里的差异. 在ISP软件里下载的时候, 测了下必须要勾选那个"在程序区结 ...

给你一个 可以读 全部Flash 的, 你自己读看看吧。

Read_OnChip_Flash.png
接收用 文本方式, 发送用 16进制 发送地址高8位会返回整个 256 字节(半个扇区)的内容。
晶振和波特率,我用的22.1184 和 460800, 你可以自行修改定义。


Read_OnChip_Flash.rar (24.63 KB, 下载次数: 2)


回复

使用道具 举报

ID:912806 发表于 2021-11-9 15:38 | 显示全部楼层
多谢, 我找到是什么问题了. 这个地址应该从code区读取, 而不是从xdata, 之前代码写得不对
另外, stc8a8k64s4 在ISP下载时会修改CLKDIV, 这个要在代码里指定为0, 不然只调IRTRIM无效
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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