CH552的时钟应用

分频输出2M左右方波,选用T2,此时要求引脚只能配置到P1.0,程序如下:

复制代码
//分频输出方波
void setup() {
  // ===================== P10 配置为硬件时钟输出 =====================
  pinMode(10, OUTPUT);      // P10 = 引脚10
  P1_MOD_OC &= ~(1 << 0);   // P10 推挽输出
  P1_DIR_PU |=  (1 << 0);   // 强推挽驱动

  // ===================== Timer2 配置 =====================
  T2MOD = 0xF0;     //C0,D0,E0,F0:都可以
  T2CON = 0x00;
  C_T2 = 0;         
  uint16_t div = 6;  //分频数
  uint16_t reload = 65536 - div;

  RCAP2H = (uint8_t)(reload >> 8);
  RCAP2L = (uint8_t)reload;
  TH2    = RCAP2H;
  TL2    = RCAP2L;

  // ===================== 开启 T2 时钟输出到 P10 =====================
  T2MOD |= (1 << 1);  // bT2_CLKO = 1 → 硬件时钟输出
  TR2 = 1;            // 启动 Timer2
}

void loop() {
  // P10 自动持续输出方波,无需代码
}

注意在使用内部晶振时,USB设置要选择USB CODE模式,如图:

|----------|-----|--------|----------------|-------|
| 主频(M) | div | 目标值(M) | 实测值(M) | 误差(%) |
| 内置24 | 6 | 2 | 1.9952~2.0068 | 0.34 |
| 外置24 | 6 | 2 | 1.9974~2.0036 | 0.18 |
| 外置12.288 | 3 | 2.048 | 2.0446~2.0509 | 0.17 |
| 外置24.576 | 6 | 2.048 | 2.0437~2.0521 | 0.21 |

从以上数据表格可以看出,内置24M晶振稳定性能是最差的,这是可以理解的,毕竟是RC振荡,且官方保证精度是2%内。外置24.576M晶振性能也不好,考虑是受该型号单片机24M工作主频的限制,24.576M属于超频使用了。外置晶振24M和12.288M选择的是同一家供应商,指标也一致,但这个误差相当于1700~1800ppm,和官方宣传的10ppm还是有相当差距的。

以TP3057对2.048M时钟要求为例,其边沿跳变时间不大于50ns,高/低电平维持时间不小于160ns。实测图如下,很明显可以看出,完全满足要求。

进一步,同时产生8K的脉冲,其宽度不小于100ns,这里取1us,实测约为1.17us,其宽度小于3个2.048M的脉冲。

复制代码
// 分频输出方波 (P10) + 8kHz窄脉冲 (P11) ------ SDCC 兼容内联汇编
void setup() {
// ===================== P10 配置 =====================
 pinMode(10, OUTPUT);
 P1_MOD_OC &= ~(1 << 0);
 P1_DIR_PU |= (1 << 0);
 // ===================== Timer2 (P10 输出方波) =====================
 T2MOD = 0xF0;
 T2CON = 0x00;
 C_T2 = 0; 
 uint16_t div = 6;
 uint16_t reload = 65536 - div;
 RCAP2H = (uint8_t)(reload >> 8);
 RCAP2L = (uint8_t)reload;
 TH2= RCAP2H;
 TL2= RCAP2L;
 T2MOD |= (1 << 1);
 TR2 = 1;
// ===================== P11 配置 =====================
 pinMode(11, OUTPUT);
 P1_DIR_PU |= (1 << 1);   // P11 强推挽
 P1 &= ~(1 << 1);         // 初始低电平
 // ===================== Timer1 (查询模式) =====================
 TMOD &= ~0xF0;
 TMOD |= 0x10;        // 模式1 (16位)
 TH1 = 0xF4;//12.288M为FA,24.576M为F4
 TL1 = 0x00;
 TR1 = 1;
}
void loop() {
    if (TF1) {
        TF1 = 0;
        TH1 = 0xF4;
        TL1 = 0x00;
        P1 |= (1 << 1);
        delayMicroseconds(1);   // 延时约 1 μs(实际可能略长)
        P1 &= ~(1 << 1);
    }
}
相关推荐
Rsingstarzengjx20 小时前
STM32-F103ZET6开发板
stm32·单片机·嵌入式硬件
我先去打把游戏先20 小时前
VMware NAT 模式 Ubuntu 虚拟机「宿主机能上网、虚拟机 ping 不通外网 + apt 更新卡死」全故障复盘
linux·运维·vscode·单片机·嵌入式硬件·ubuntu·keil5
aini_lovee20 小时前
STM32 串口转CAN + WiFi模块实现WiFi转CAN网关
stm32·单片机·嵌入式硬件
zlinear数据采集卡20 小时前
输出短路保护电路深度解析:从电源的“最后一道防线”到ZLinear采集卡的硬核守护实战
开发语言·嵌入式硬件·持续集成
都在酒里21 小时前
FreeRTOS 手动移植教程(七):软件定时器 —— 不占硬件 Timer 的定时回调
stm32·单片机·嵌入式·rtos·嵌入式软件
原创小甜甜21 小时前
Windows 蓝屏自救手册:从紧急记录到硬件排查的完整指南
windows·stm32·单片机
tigershang1 天前
华为“韬定律”:从“缩小尺寸”到“压缩时间”——后摩尔时代的规则重塑
单片机·华为·系统架构
项目題供诗1 天前
STM32-TIM编码器接口(十六)
stm32·单片机·嵌入式硬件
都在酒里1 天前
FreeRTOS 手动移植教程(八):中断管理 —— 优先级、临界区与任务通知
stm32·单片机·嵌入式·rtos·嵌入式软件