testing 发表于 2025-12-27 20:20:18

关于开启外部晶振导致触摸按键不可用的情况

现象就是把时钟切换注释,用内部的24Mhz,可以正常工作,但是用外部的就会卡死,
下面为时钟切换


    CLKSEL = 0x00;               // 先切换到内部IRC
    P_SW2 = 0x80;
    XOSCCR = 0xc0;               // 启动外部晶振
    while(!(XOSCCR & 1));      // 等待外部晶振稳定
    CLKDIV = 0x00;               // 时钟分频
    CLKSEL = 0x01;               // 切换到外部晶振
    P_SW2 = 0x00;                // 禁止访问扩展寄存器

然后进行触摸按键的配置


    P_SW2 |= 0x80;          // 允许访问XSF寄存器
   


    // 1. 通道使能
    TSCHEN1 = 0x00;         // 关闭0-7通道
    TSCHEN2 = 0x78;         // 使能TK11~14 (0111 1000) → 4个通道

    // 2. 其他基础配置
    TSRT = 0x00;            // LED扫描关闭
    TSWUTC = 0x00;          // 唤醒功能关闭

    // 3. 核心周期配置
    TSCFG1= (3<<4) + 6;   //
   
    TSCFG2 = 0x02;// 5/8 AVCC
    TSCTRL = 0xA0;          // 触摸控制器基础配置(保持原有)

    // 4. 开启中断
    IE2 |= 0x80;            // 开启触摸中断
void TKSU_Interrupt(void) interrupt 35
{
//    static u16 k=0;
//    k++;
//    if(k==1000)k=0;
//    TK_cnt=k;
//   
   
   
    u8 status ;
    u8 channel;
    P_SW2 |= 0x80;
    status = TSSTA2;
    if(status & 0x40)       // 数据溢出
    {
      TSSTA2 |= 0x40;   // 写1清零
    }
//   
    if(status & 0x80)       // 扫描完成
    {
      channel = status & 0x0f;
      TSSTA2 |= 0x80;   // 写1清零
      
      // 只保存TK11~TK14
      if(channel >= 11 && channel <= 14)
      {
            TK_cnt = TSDAT;
      }
    }
}




神农鼎 发表于 2025-12-28 08:38:56

先看下这个程序:



触摸滑条,8H4K64TLCD, 触摸按键、段码LCD液晶、RTC实时时钟演示程序,有空PCB - 段码LCD/80mA大电流LED数码管自动刷新显示/RTC实时时钟/触摸按键/低功耗 国芯人工智能技术交流网站 - AI32位8051交流社区


0.4uA待机电流,15uA低功耗,郭天祥老师实战项目3超低功耗应用 - 郭天祥老师从51到32位51直播视频课程,实战项目专区,低功耗设计 国芯人工智能技术交流网站 - AI32位8051交流社区

testing 发表于 2025-12-28 14:12:38

神农鼎 发表于 2025-12-28 08:38
先看下这个程序:



我这里并没有用到低功耗,芯片是STC8H1K08T,
之前的代码都是用的外部24MHz,
加上这个触摸功能后就不行了,再用回内部irc又可以运行,
但因为我要做的是个计时的,所以用了外部的外部的晶振

神农鼎 发表于 2025-12-28 15:03:58


https://www.stcaimcu.com/data/download/Datasheet/STC8H.pdf




选择外部晶振:
A, 外部高速晶振
B, 外部低速 32768-RTC晶振
设置参数不同

神农鼎 发表于 2025-12-28 15:07:17

永远允许访问 扩展的 XFR
===中途不要关,防止再设置时,遗漏打开





神农鼎 发表于 2025-12-28 15:09:59








testing 发表于 2025-12-28 15:31:21

神农鼎 发表于 2025-12-28 15:07
永远允许访问 扩展的 XFR
===中途不要关,防止再设置时,遗漏打开
我去掉触摸部分的代码,测试过确实是工作在外部的24Mhz,P_SW2也没有再关闭

神农鼎 发表于 2025-12-28 15:38:06

你把真实能跑的测试程序简化,编译能运行后,贴出来
我请研发帮你分析


还有 芯片拍个图片发上来
原理图的 PDF 发上来

testing 发表于 2025-12-28 15:46:24

神农鼎 发表于 2025-12-28 15:38
你把真实能跑的测试程序简化,编译能运行后,贴出来
我请研发帮你分析


这样可以吗,需要简化到单个.c能运行吗
#include "STC8Hxxx.h"



void TouchKey_Init(void)
{

   
    P_SW2 = 0x80;      // 允许访问扩展寄存器

    // 1. 通道使能
    TSCHEN1 = 0x00;         // 关闭0-7通道
    TSCHEN2 = 0x78;         // 使能TK11~14 (0111 1000) → 4个通道

    // 2. 其他基础配置
    TSRT = 0x00;            // LED扫描关闭
    TSWUTC = 0x00;          // 唤醒功能关闭

    // 3. 核心周期配置
    TSCFG1=(1<<4) + 4;
    TSCFG2 = 1;


    TSCTRL |= 0x80;
    // 4. 开启中断
    IE2 |= 0x80;            // 开启触摸中断


}
// 系统初始化函数
void System_Init(void)
{



    P_SW2 = 0x80;      // 允许访问扩展寄存器
   
//    // 初始化时钟
    CLKSEL = 0x00;               // 先切换到内部IRC

    XOSCCR = 0xc0;               // 启动外部晶振
    while(!(XOSCCR & 1));      // 等待外部晶振稳定
    CLKDIV = 0x00;               // 时钟分频
    CLKSEL = 0x01;               // 切换到外部晶振
    delay_ms(5);

    TouchKey_Init();   
   
   

   
    // 初始化外设
    //P1M1 = 1111,1111B
    //P1M0 = 0000,0000B
    //P1.7 高阻,P1.6 高阻
    P1M0 &= ~0x03;
//此时 P1.7 / P1.6 是啥工作模式 ?
    P1M1 &= ~0x03;
//此时 P1.7 / P1.6 是啥工作模式 ?

    P11=1;
    P10=1;
   
    Uart2_Init();
    Uart1_Init();
    Timer0_Init();      

    P3M0 &= ~0x80; P3M1 &= ~0x80;
//   P3M0 &= ~0x80; P3M1 |= 0x80;

   

    P1M0 &= ~0x10; P1M1 &= ~0x10;

    keys_init();
   
    TM1621D_init();
    WS2812_Init();
   
//后续把晶振修改放到这后可正常运行,删掉了些不相关的代码
   
   
    EA = 1;         // 总中断使能
    power_on = 1;
   
    delay_ms(5);

}

void main()
{

    // 系统初始化
    System_Init();
   
    // 初始状态


   
    while(1)
    {



    }
}




void TKSU_Interrupt(void) interrupt 35
{

//   
    u8 status ;
    u8 channel;

    status = TSSTA2;
    if(status & 0x40)       // 数据溢出
    {
      TSSTA2 |= 0x40;   // 写1清零
    }
//   
    if(status & 0x80)       // 扫描完成
    {
      channel = status & 0x0f;
      TSSTA2 |= 0x80;   // 写1清零
      
   
      if(channel >= 11 && channel <= 14)
      {
            TK_cnt = TSDAT;
      }
    }
}






testing 发表于 2025-12-28 15:52:33

神农鼎 发表于 2025-12-28 15:38
你把真实能跑的测试程序简化,编译能运行后,贴出来
我请研发帮你分析




页: [1] 2
查看完整版本: 关于开启外部晶振导致触摸按键不可用的情况