jiang1234 发表于 2026-7-10 21:16:30

STC8H2K32U使用P3.0/P3.1串口打印求助

第一次使用STC芯片,求助!
使用Aicube配置的程序串口打印一直调试失败,没有任何输出,
配置GPIO高低电平输出是正常的,
可否提供一个例程,
只需要P3.0和P3.1串口打印功能,
STC8H2K32U芯片,24M时钟,115200波特率。
非常感谢!

神农鼎 发表于 2026-7-10 21:28:38


神农鼎 发表于 2026-7-10 21:29:00

<p>好的,信息已经查全了。现在我来给这位用户提供一个完整的 STC8H2K32U 串口1(P3.0/P3.1)打印例程。</p>
<hr />
<h2>STC8H2K32U 串口1(P3.0/P3.1)打印例程</h2>
<p>您好!第一次使用 STC 芯片遇到串口打印问题很常见,我来帮您分析并提供可直接编译运行的例程。</p>
<h3>常见失败原因排查</h3>
<p>在给出代码之前,先排查几个最容易出问题的地方:</p>
<ol>
<li><strong>P3.0/P3.1 默认就是串口1的 RxD/TxD</strong>,无需切换功能脚(S1_S=00 即为默认值)</li>
<li><strong>STC8H2K32U 上电后 P3.0/P3.1 为弱上拉/准双向口模式</strong>,可直接用于串口通信</li>
<li><strong>串口1的波特率发生器可以选择定时器1或定时器2</strong>,推荐用定时器2(更简单)</li>
<li><strong>ISP下载时选择的IRC频率必须与代码中一致</strong>,您选24MHz,代码中也要用24MHz</li>
</ol>
<h3>完整例程代码</h3>
<pre><code class="language-c">/*
* STC8H2K32U 串口1 (P3.0/P3.1) 打印例程
* 时钟:内部IRC 24MHz
* 波特率:115200
* 串口模式:模式1(8位UART,可变波特率)
* 波特率发生器:定时器2(1T模式)
*
* 使用说明:
* 1. 在ISP下载软件中,设置内部IRC频率为 24MHz
* 2. 将本代码编译后下载到芯片
* 3. 用USB转串口工具连接:P3.0(RxD)接对方TxD,P3.1(TxD)接对方RxD,GND接GND
* 4. 打开串口助手,设置波特率115200,数据位8,停止位1,无校验
* 5. 上电或复位后,串口助手将收到 &quot;STC8H2K32U UART1 Test OK!\r\n&quot;
*/

#include &quot;stc8h.h&quot;
#include &quot;intrins.h&quot;

// 函数声明
void UART1_Init(void);
void UART1_SendByte(unsigned char dat);
void UART1_SendString(unsigned char *str);

void main(void)
{
    unsigned char i;

    // 使能访问XFR(扩展寄存器区域)
    P_SW2 |= 0x80;

    // 设置所有I/O口为准双向口(默认模式)
    P0M0 = 0x00; P0M1 = 0x00;
    P1M0 = 0x00; P1M1 = 0x00;
    P2M0 = 0x00; P2M1 = 0x00;
    P3M0 = 0x00; P3M1 = 0x00;
    P4M0 = 0x00; P4M1 = 0x00;
    P5M0 = 0x00; P5M1 = 0x00;

    // 初始化串口1,波特率115200,时钟24MHz
    UART1_Init();

    // 发送测试字符串
    UART1_SendString(&quot;STC8H2K32U UART1 Test OK!\r\n&quot;);

    // 循环发送递增数字,验证通信
    i = 0;
    while(1)
    {
      UART1_SendString(&quot;Count: &quot;);
      UART1_SendByte('0' + i);// 发送数字字符(0~9循环)
      UART1_SendString(&quot;\r\n&quot;);
      i++;
      if(i &gt; 9) i = 0;

      // 延时约1秒(粗略延时)
      {
            unsigned int j, k;
            for(j = 0; j &lt; 1000; j++)
                for(k = 0; k &lt; 1200; k++);
      }
    }
}

/*
* 串口1初始化函数
* 使用定时器2作为波特率发生器
* 模式1(8位UART),波特率115200
* 时钟频率:24MHz
*
* 波特率计算公式(定时器2,1T模式):
* 波特率 = SYSclk / 4 / (65536 - RL)
* 115200 = 24000000 / 4 / (65536 - RL)
* RL = 65536 - 24000000 / 4 / 115200
* RL = 65536 - 52.08 ≈ 65536 - 52 = 65484 = 0xFFCC
*/
void UART1_Init(void)
{
    // 配置串口1控制寄存器
    SCON = 0x50;    // 模式1(8位UART),允许接收(REN=1)

    // 配置定时器2为波特率发生器
    // 定时器2的寄存器在XFR区域,需要先使能访问
    P_SW2 |= 0x80;// 使能访问XFR(如果之前已使能可省略)

    // 选择定时器2作为串口1的波特率发生器
    AUXR &amp;= ~0x01;// S1ST2 = 0 选择定时器1... 不对,查手册:
                  // AUXR.0 (S1ST2) = 1 选择定时器2作为波特率发生器
    AUXR |= 0x01;   // S1ST2 = 1,选择定时器2作为串口1波特率发生器

    // 配置定时器2:1T模式,自动重装载
    AUXR |= 0x10;   // T2x12 = 1,定时器2为1T模式(12倍速)
    AUXR |= 0x04;   // T2R = 1... 先设置重装值再启动

    // 设置定时器2重装载值
    // 24MHz,115200波特率,1T模式
    // 重装值 = 65536 - 24000000 / 4 / 115200 = 65536 - 52 = 65484 = 0xFFCC
    T2H = (unsigned char)((65536 - 52) &gt;&gt; 8);   // 0xFF
    T2L = (unsigned char)(65536 - 52);         // 0xCC

    // 启动定时器2
    AUXR |= 0x10;   // T2x12 = 1,1T模式(重复确保)
    AUXR |= 0x04;   // T2R = 1,启动定时器2

    // 清除发送和接收标志
    TI = 0;
    RI = 0;
}

/*
* 串口1发送单字节
* 查询方式发送
*/
void UART1_SendByte(unsigned char dat)
{
    SBUF = dat;             // 将数据写入发送缓冲区,启动发送
    while(TI == 0);         // 等待发送完成
    TI = 0;               // 清除发送完成标志
}

/*
* 串口1发送字符串
* 调用 UART1_SendByte 逐字节发送
*/
void UART1_SendString(unsigned char *str)
{
    while(*str != '\0')
    {
      UART1_SendByte(*str);
      str++;
    }
}
</code></pre>
<h3>关键配置说明</h3>
<table>
<thead>
<tr>
<th align="left">项目</th>
<th align="left">值</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">芯片</td>
<td align="left">STC8H2K32U</td>
<td align="left">含2路串口,带硬件奇偶校验和接收超时中断</td>
</tr>
<tr>
<td align="left">串口</td>
<td align="left">串口1</td>
<td align="left">默认引脚 P3.0(RxD) / P3.1(TxD)</td>
</tr>
<tr>
<td align="left">工作模式</td>
<td align="left">模式1</td>
<td align="left">8位UART,1位起始位+8位数据+1位停止位</td>
</tr>
<tr>
<td align="left">波特率发生器</td>
<td align="left">定时器2</td>
<td align="left">1T模式,自动重装载</td>
</tr>
<tr>
<td align="left">时钟</td>
<td align="left">24MHz 内部IRC</td>
<td align="left">ISP下载时需选择24MHz</td>
</tr>
<tr>
<td align="left">波特率</td>
<td align="left">115200</td>
<td align="left">误差约0.16%,完全可用</td>
</tr>
</tbody>
</table>
<h3>如果仍然没有输出,请检查以下硬件问题</h3>
<ol>
<li>
<p><strong>接线是否正确?</strong></p>
<ul>
<li>P3.0(RxD)→ 串口工具的 TxD</li>
<li>P3.1(TxD)→ 串口工具的 RxD</li>
<li>GND → GND</li>
<li><strong>注意:P3.0/P3.1 同时也是 USB 的 D-/D+,如果板上有 USB 接口电路,可能会影响串口通信,建议下载完成后断开 USB 的 D+/D- 连接</strong></li>
</ul>
</li>
<li>
<p><strong>ISP下载时频率设置是否正确?</strong></p>
<ul>
<li>在 ISP 下载软件中,必须将 <strong>内部IRC频率设置为 24MHz</strong>,与代码一致</li>
</ul>
</li>
<li>
<p><strong>串口助手设置是否正确?</strong></p>
<ul>
<li>波特率:115200</li>
<li>数据位:8</li>
<li>停止位:1</li>
<li>校验位:无</li>
<li>流控制:无</li>
</ul>
</li>
<li>
<p><strong>P3.0/P3.1 是否被其他外设占用?</strong></p>
<ul>
<li>如果板上有 USB 接口或其他电路连接到 P3.0/P3.1,可能会干扰串口通信</li>
</ul>
</li>
<li>
<p><strong>尝试用示波器或逻辑分析仪测量 P3.1 引脚</strong>,看是否有数据波形输出,这是最直接的排查方法。</p>
</li>
</ol>
<p>如果以上都检查无误仍无输出,请告知您的具体硬件连接方式和 ISP 下载时的频率设置截图,我帮您进一步分析。</p>
<hr />
<p><a href="https://www.stcaimcu.com/plugin.php?id=twpx_xunsearch&amp;mod=forum&amp;q=STC%20%E5%8D%95%E7%89%87%E6%9C%BA%20%E8%AE%BA%E5%9D%9B%20%E5%B8%96%E5%AD%90&amp;f=_all&amp;m=yes&amp;syn=yes&amp;s=relevance&amp;fid=0">🔍 搜索 &quot;STC 单片机 论坛 帖子&quot;</a></p>
<p>⏱️ 查找用时 11.2s | 总回答用时 33.4s</p>

梁工 发表于 2026-7-10 21:33:59

给你个例子,串口1通用测试程序,主频11.0592MHZ,你要24MHz自己再文件开头改一下主频后重新编译一下即可。


/*************        功能说明        **************
请先别修改程序, 直接下载"01A-串口1中断收发-printf()函数映射"里的"UART1.hex"测试, 主频选择11.0592MHZ. 测试正常后再修改移植.
串口1全双工中断方式收发通讯程序。

初始化后先发一串字符串:"STC8H系列 UART1 Test Prgramme!\r\n"。
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.

默认参数:
串口1设置均为 1位起始位, 8位数据位, 1位停止位, 无校验.
串口1(P3.0 P3.1): 115200bps.
******************************************/


jiang1234 发表于 2026-7-11 11:02:00

梁工 发表于 2026-7-10 21:33
给你个例子,串口1通用测试程序,主频11.0592MHZ,你要24MHz自己再文件开头改一下主频后重新编译一下即可。 ...

感谢,应该是我配置的问题,使用例程可以正常打印
页: [1]
查看完整版本: STC8H2K32U使用P3.0/P3.1串口打印求助