关于开启外部晶振导致触摸按键不可用的情况
现象就是把时钟切换注释,用内部的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;
}
}
}
先看下这个程序:
触摸滑条,8H4K64TLCD, 触摸按键、段码LCD液晶、RTC实时时钟演示程序,有空PCB - 段码LCD/80mA大电流LED数码管自动刷新显示/RTC实时时钟/触摸按键/低功耗 国芯人工智能技术交流网站 - AI32位8051交流社区
0.4uA待机电流,15uA低功耗,郭天祥老师实战项目3超低功耗应用 - 郭天祥老师从51到32位51直播视频课程,实战项目专区,低功耗设计 国芯人工智能技术交流网站 - AI32位8051交流社区
神农鼎 发表于 2025-12-28 08:38
先看下这个程序:
我这里并没有用到低功耗,芯片是STC8H1K08T,
之前的代码都是用的外部24MHz,
加上这个触摸功能后就不行了,再用回内部irc又可以运行,
但因为我要做的是个计时的,所以用了外部的外部的晶振
https://www.stcaimcu.com/data/download/Datasheet/STC8H.pdf
选择外部晶振:
A, 外部高速晶振
B, 外部低速 32768-RTC晶振
设置参数不同
永远允许访问 扩展的 XFR
===中途不要关,防止再设置时,遗漏打开
神农鼎 发表于 2025-12-28 15:07
永远允许访问 扩展的 XFR
===中途不要关,防止再设置时,遗漏打开
我去掉触摸部分的代码,测试过确实是工作在外部的24Mhz,P_SW2也没有再关闭
你把真实能跑的测试程序简化,编译能运行后,贴出来
我请研发帮你分析
还有 芯片拍个图片发上来
原理图的 PDF 发上来
神农鼎 发表于 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;
}
}
}
神农鼎 发表于 2025-12-28 15:38
你把真实能跑的测试程序简化,编译能运行后,贴出来
我请研发帮你分析
页:
[1]
2