找回密码
 立即注册
查看: 789|回复: 12

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-28 14:12:38
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 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[12]=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[channel] = TSDAT;
        }
    }
}




回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2025-12-28 08:38:56 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-28 14:12:38
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 2025-12-28 14:12:38 | 显示全部楼层
神*** 发表于 2025-12-28 08:38
先看下这个程序:

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2025-12-28 15:03:58 | 显示全部楼层

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

截图202512281502137000.jpg


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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2025-12-28 15:07:17 | 显示全部楼层
永远允许访问 扩展的 XFR
===中途不要关,防止再设置时,遗漏打开

截图202512281506352812.jpg

截图202512281507149696.jpg

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2025-12-28 15:09:59 | 显示全部楼层
截图202512281509329904.jpg


截图202512281509561353.jpg


截图202512281512442822.jpg
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-28 14:12:38
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 2025-12-28 15:31:21 | 显示全部楼层
神*** 发表于 2025-12-28 15:07
永远允许访问 扩展的 XFR
===中途不要关,防止再设置时,遗漏打开

我去掉触摸部分的代码,测试过确实是工作在外部的24Mhz,P_SW2也没有再关闭
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:453
  • 最近打卡:2026-07-03 08:57:36

830

主题

1万

回帖

2万

积分

管理员

积分
23929
发表于 2025-12-28 15:38:06 | 显示全部楼层
你把真实能跑的测试程序简化,编译能运行后,贴出来
我请研发帮你分析



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

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-28 14:12:38
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 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 是啥工作模式 ?
截图202512281924334212.jpg
    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[channel] = TSDAT;
        }
    }
}






回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2025-12-28 14:12:38
已绑定手机

1

主题

5

回帖

17

积分

新手上路

积分
17
发表于 2025-12-28 15:52:33 | 显示全部楼层
神*** 发表于 2025-12-28 15:38
你把真实能跑的测试程序简化,编译能运行后,贴出来
我请研发帮你分析




回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 13:51 , Processed in 0.091068 second(s), 86 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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