找回密码
 立即注册
查看: 205|回复: 28

8H系列,串口1打印问题。

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-21 15:48:36
已绑定手机

1

主题

13

回帖

43

积分

新手上路

积分
43
发表于 2025-4-18 17:33:28 | 显示全部楼层 |阅读模式
更改串口1的连接引脚为1.6和1.7后,不能进行打印。3.0 3.1能够正常打印。
芯片是8H1K08T芯片
代码如下
使用库函数的
  1. #include        "config.h"
  2. #include        "STC8G_H_GPIO.h"
  3. #include        "STC8G_H_UART.h"
  4. #include        "STC8G_H_Delay.h"
  5. #include        "STC8G_H_NVIC.h"
  6. #include        "STC8G_H_Switch.h"
  7. /*************        功能说明        **************
  8. 本例程基于STC8H8K64U为主控芯片的实验箱8进行编写测试,STC8G、STC8H系列芯片可通用参考.
  9. 双串口全双工中断方式收发通讯程序。
  10. 通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回, 默认波特率:115200,N,8,1.
  11. 通过开启 STC8G_H_UART.h 头文件里面的 UART1~UART4 定义,启动不同通道的串口通信。
  12. 用定时器做波特率发生器,建议使用1T模式(除非低波特率用12T),并选择可被波特率整除的时钟频率,以提高精度。
  13. 下载时, 选择时钟 22.1184MHz (用户可在"config.h"修改频率).
  14. ******************************************/
  15. /*************        本地常量声明        **************/
  16. /*************        本地变量声明        **************/
  17. /*************        本地函数声明        **************/
  18. /*************  外部函数和变量声明 *****************/
  19. /******************* IO配置函数 *******************/
  20. void        GPIO_config(void)
  21. {
  22.         GPIO_InitTypeDef        GPIO_InitStructure;                //结构定义
  23.         GPIO_InitStructure.Pin  = GPIO_Pin_6 | GPIO_Pin_7;                //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
  24.         GPIO_InitStructure.Mode = GPIO_PullUp;        //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
  25.         GPIO_Inilize(GPIO_P1,&GPIO_InitStructure);        //初始化
  26. }
  27. /***************  串口初始化函数 *****************/
  28. void        UART_config(void)
  29. {
  30.         COMx_InitDefine                COMx_InitStructure;                                        //结构定义
  31.         COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;        //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
  32.         COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;                        //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
  33.         COMx_InitStructure.UART_BaudRate  = 115200ul;                        //波特率, 一般 110 ~ 115200
  34.         COMx_InitStructure.UART_RxEnable  = ENABLE;                                //接收允许,   ENABLE或DISABLE
  35.         COMx_InitStructure.BaudRateDouble = DISABLE;                        //波特率加倍, ENABLE或DISABLE
  36.         UART_Configuration(UART1, &COMx_InitStructure);                //初始化串口1 UART1,UART2,UART3,UART4
  37.         NVIC_UART1_Init(ENABLE,Priority_1);                //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
  38.         UART1_SW(UART1_SW_P16_P17);                //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
  39. }
  40. /**********************************************/
  41. void main(void)
  42. {
  43.         u8        i;
  44.         EAXSFR();                /* 扩展寄存器访问使能 */
  45.         GPIO_config();
  46.         UART_config();
  47.         EA = 1;
  48.         printf("STC8H8K64U UART1 Test Programme!\r\n");        //UART1发送一个字符串
  49. //        PrintString1("STC8H8K64U UART1 Test Programme!\r\n");        //UART1发送一个字符串
  50.         while (1)
  51.         {
  52.                 delay_ms(1);
  53.                 if(COM1.RX_TimeOut > 0)                //超时计数
  54.                 {
  55.                         if(--COM1.RX_TimeOut == 0)
  56.                         {
  57.                                 if(COM1.RX_Cnt > 0)
  58.                                 {
  59.                                         for(i=0; i<COM1.RX_Cnt; i++)        TX1_write2buff(RX1_Buffer[i]);        //收到的数据原样返回
  60.                                 }
  61.                                 COM1.RX_Cnt = 0;
  62.                         }
  63.                 }
  64.         }
  65. }
复制代码


使用寄存器的


  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* --- STC 1T Series MCU RC Demo -----------------------------------*/
  4. /* --- Mobile: (86)13922805190 -------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
  7. /* --- Web: www.stcmcudata.com -------------------------------------*/
  8. /* --- Web: www.stcai.com ------------------------------------------*/
  9. /* --- BBS: www.stcaimcu.com ---------------------------------------*/
  10. /* If you want to use the program or the program referenced in the  */
  11. /* article, please specify in which data and procedures from STC    */
  12. /*------------------------------------------------------------------*/
  13. /*********************************************************/
  14. #define MAIN_Fosc                11059200L        //定义主时钟
  15. #include        "..\..\STC8Hxxx.h"
  16. /*************        功能说明        **************
  17. 请先别修改程序, 直接下载"07-串口1中断收发-多机通信-C语言"里的"UART1.hex"测试, 主频选择11.0592MHZ. 测试正常后再修改移植.
  18. 串口1全双工中断方式收发通讯程序, 地址匹配多机通信方式.
  19. 通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
  20. 默认参数:
  21. 串口1设置均为 1位起始位, 8位数据位, 1位校验位, 1位停止位.
  22. 串口1(P3.0 P3.1): 115200bps.
  23. 通讯原理解释:
  24. 用户宏定义从机地址SLAVE_ADDR(本例为0xaa), 初始化串口1为9位数据位,将匹配地址写入SADDR, 并将SM2至1.
  25. 然后程序等待地址匹配. 发送端将TB8置1并发送地址.
  26. 当地址匹配, 则自动进入接收中断, 将SM2置0, 准备接收数据.
  27. 发送端将TB8置0, 发送数据.
  28. 接收数据并保存, 并且设置超时, 用于判断接收完成.
  29. 检测到超时, 则接收完成, 数据处理(本例为将数据原样返回).
  30. 将SM2置1, 重复上述过程.
  31. 使用PC机的串口助手测试, 串口助手必须能支持9位数据. 发送例子:
  32. 校验位为1, 发送地址0xaa.
  33. 校验位为0, 发送数据(本例不超过128字节).
  34. 串口助手将看到MCU返回的数据, 跟发送的数据一致.
  35. ******************************************/
  36. /*************        本地常量声明        **************/
  37. #define        SLAVE_ADDR        0xaa        //匹配地址
  38. #define        RX1_Length        128                /* 接收缓冲长度 */
  39. /*************        本地变量声明        **************/
  40. u8        xdata        RX1_Buffer[RX1_Length];        //接收缓冲
  41. u8        RX1_TimerOut;        //接收超时
  42. u8        RX1_cnt;                //接收字节计数
  43. bit        B_TX1_Busy;                // 发送忙标志
  44. /*************        本地函数声明        **************/
  45. void        UART1_config(u32 brt, u8 timer, u8 io);        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  46. void         UART1_PrintString(u8 *puts);
  47. void        delay_ms(u8 ms);
  48. //========================================================================
  49. // 函数: void main(void)
  50. // 描述: 主函数
  51. // 参数: none.
  52. // 返回: none.
  53. // 版本: VER1.0
  54. // 日期: 2018-4-2
  55. // 备注:
  56. //========================================================================
  57. void main(void)
  58. {
  59.         u8        i;
  60.         EAXRAM();
  61.         UART1_config(115200UL, 1, 3);        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  62.         EA = 1;
  63.         for(i=0; i<RX1_Length; i++)                RX1_Buffer[i] = 0;
  64.         B_TX1_Busy  = 0;
  65.         RX1_TimerOut = 0;
  66.         RX1_cnt = 0;
  67.         UART1_PrintString("STC8H 8C serial UART1 Test Prgramme!\r\n");
  68.         while (1)
  69.         {
  70.                 delay_ms(1);
  71.                
  72.                 if(RX1_TimerOut != 0)
  73.                 {
  74.                         if(--RX1_TimerOut == 0)        //超时, 则接收结束, 数据处理(本例子仅仅是将数据原样返回)
  75.                         {
  76.                                 if(RX1_cnt != 0)        //收到有数据
  77.                                 {
  78.                                         TB8 = 0;
  79.                                         for(i=0; i<RX1_cnt; i++)
  80.                                         {
  81.                                                 B_TX1_Busy = 1;                //标志发送忙
  82.                                                 SBUF = RX1_Buffer[i];                //发一个字节
  83.                                                 while(B_TX1_Busy);        //等待发送完成
  84.                                         }
  85.                                         RX1_cnt = 0;
  86.                                         SM2 = 1;        //允许地址匹配
  87.                                 }
  88.                         }
  89.                 }
  90.         }
  91. }
  92. //========================================================================
  93. // 函数: void  delay_ms(u8 ms)
  94. // 描述: 延时函数。
  95. // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
  96. // 返回: none.
  97. // 版本: VER1.0
  98. // 日期: 2018-4-1
  99. // 备注:
  100. //========================================================================
  101. void  delay_ms(u8 ms)
  102. {
  103.         u16 i;
  104.         do
  105.         {
  106.                 i = MAIN_Fosc / 10000;
  107.                 while(--i)        ;
  108.         }while(--ms);
  109. }
  110. //========================================================================
  111. // 函数: SetTimer2Baudraye(u16 dat)
  112. // 描述: 设置Timer2做波特率发生器。
  113. // 参数: dat: Timer2的重装值.
  114. // 返回: none.
  115. // 版本: VER1.0
  116. // 日期: 2018-4-2
  117. // 备注:
  118. //========================================================================
  119. void        SetTimer2Baudraye(u16 dat)        // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  120. {
  121.         AUXR &= ~(1<<4);        //Timer stop
  122.         AUXR &= ~(1<<3);        //Timer2 set As Timer
  123.         AUXR |=  (1<<2);        //Timer2 set as 1T mode
  124.         TH2 = (u8)(dat >> 8);
  125.         TL2 = (u8)dat;
  126.         IE2  &= ~(1<<2);        //禁止中断
  127.         AUXR |=  (1<<4);        //Timer run enable
  128. }
  129. //========================================================================
  130. // 函数: void        UART1_config(u32 brt, u8 timer, u8 io)
  131. // 描述: UART1初始化函数。
  132. // 参数:   brt: 通信波特率.
  133. //       timer: 波特率使用的定时器, timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率.
  134. //          io: 串口1切换到的IO,  io=1: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  135. // 返回: none.
  136. // 版本: VER1.0
  137. // 日期: 2018-4-2
  138. // 备注:
  139. //========================================================================
  140. void        UART1_config(u32 brt, u8 timer, u8 io)        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  141. {
  142.         brt = 65536UL - (MAIN_Fosc / 4) / brt;
  143.         if(timer == 2)        //波特率使用定时器2
  144.         {
  145.                 AUXR |= 0x01;                //S1 BRT Use Timer2;
  146.                 SetTimer2Baudraye((u16)brt);
  147.         }
  148.         else                //波特率使用定时器1
  149.         {
  150.                 TR1 = 0;
  151.                 AUXR &= ~0x01;                //S1 BRT Use Timer1;
  152.                 AUXR |=  (1<<6);        //Timer1 set as 1T mode
  153.                 TMOD &= ~(1<<6);        //Timer1 set As Timer
  154.                 TMOD &= ~0x30;                //Timer1_16bitAutoReload;
  155.                 TH1 = (u8)(brt >> 8);
  156.                 TL1 = (u8)brt;
  157.                 ET1 = 0;                        // 禁止Timer1中断
  158.                 INT_CLKO &= ~0x02;        // Timer1不输出高速时钟
  159.                 TR1  = 1;                        // 运行Timer1
  160.         }
  161.                  if(io == 1)        {S1_USE_P36P37();        P3n_standard(0xc0);}        //切换到 P3.6 P3.7
  162.         else if(io == 2)        {S1_USE_P16P17();        P1n_standard(0xc0);}        //切换到 P1.6 P1.7
  163.         else if(io == 3)        {S1_USE_P43P44();        P4n_standard(0x18);}        //切换到 P4.3 P4.4
  164.         else                                {S1_USE_P30P31();        P3n_standard(0x03);}        //切换到 P3.0 P3.1
  165.         SCON = (SCON & 0x3f) | (3<<6);        // 8位数据, 1位校验位, 1位起始位, 1位停止位
  166. //        PS  = 1;        //高优先级中断
  167.         SADDR = SLAVE_ADDR;                //匹配地址
  168.         SADEN = 0xff;                        //地址屏蔽
  169.         SM2 = 1;        //允许地址匹配
  170.         ES  = 1;        //允许中断
  171.         REN = 1;        //允许接收
  172. }
  173. //========================================================================
  174. // 函数: void UART1_PrintString(u8 *puts)
  175. // 描述: 串口1字符串打印函数
  176. // 参数: puts: 字符串指针.
  177. // 返回: none.
  178. // 版本: VER1.0
  179. // 日期: 2018-4-2
  180. // 备注:
  181. //========================================================================
  182. void UART1_PrintString(u8 *puts)
  183. {
  184.     for (; *puts != 0;        puts++)
  185.         {
  186.                 B_TX1_Busy = 1;                //标志发送忙
  187.                 TB8 = 0;
  188.                 SBUF = *puts;                //发一个字节
  189.                 while(B_TX1_Busy);        //等待发送完成
  190.         }
  191. }
  192. //========================================================================
  193. // 函数: void UART1_int (void) interrupt UART1_VECTOR
  194. // 描述: 串口1中断函数
  195. // 参数: none.
  196. // 返回: none.
  197. // 版本: VER1.0
  198. // 日期: 2018-4-2
  199. // 备注:
  200. //========================================================================
  201. void UART1_int (void) interrupt UART1_VECTOR
  202. {
  203.         if(RI)
  204.         {
  205.                 RI = 0;
  206.                 if(RB8)                                //为地址信息, 地址匹配
  207.                 {
  208.                 //        if(SBUF == SLAVE_ADDR)                //这句可以不用, 能收到则为地址匹配了
  209.                         {
  210.                                 SM2 = 0;                //允许接收数据
  211.                                 RX1_cnt = 0;        //接收计数归0
  212.                         }
  213.                 }
  214.                 else                //接收到数据
  215.                 {
  216.                         RX1_Buffer[RX1_cnt] = SBUF;        //保存一个数据
  217.                         if(++RX1_cnt > RX1_Length)        RX1_cnt = 0;
  218.                         RX1_TimerOut = 5;                                //接收数据超时时间
  219.                 }
  220.         }
  221.         if(TI)
  222.         {
  223.                 TI = 0;
  224.                 B_TX1_Busy = 0;
  225.         }
  226. }
复制代码
UART1_config(115200UL, 1, 3); // brt: 通信波特率, timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1, =1: 切换到P3.6 P3.7, =2: 切换到P1.6 P1.7, =3: 切换到P4.3 P4.4.,已经换成了3,但是仍然打印不了。



我想使用P1.6,P1.7作为串口1的引脚,现在无法通过电脑的串口助手进行打印,只有当串口1引脚为3.0 3.1时才能正常打印


回复

使用道具 举报 送花

3

主题

1160

回帖

1031

积分

等待验证会员

积分
1031
发表于 2025-4-18 17:38:00 | 显示全部楼层
在STC8H1K08T芯片中,串口1的默认引脚是P3.0(RXD)和P3.1(TXD)。当您将串口1的连接引脚更改为P1.6和P1.7后,无法进行打印,而使用默认引脚P3.0和P3.1时能够正常打印。这个问题可能与以下几个因素有关:

1. 引脚配置问题
首先,确保您已经正确配置了P1.6和P1.7为串口1的RXD和TXD引脚。在STC8H系列芯片中,串口引脚可以通过寄存器进行重映射。您需要检查并确认以下几点:
P1.6和P1.7的复用功能:确保P1.6和P1.7已经配置为串口1的RXD和TXD功能。可以通过设置相关的寄存器来实现这一点。
GPIO模式配置:确保P1.6和P1.7的GPIO模式已经配置为正确的模式(通常为推挽输出或开漏输出)。

2. 串口初始化代码
在您的代码中,串口1的初始化部分需要正确配置波特率、数据位、停止位等参数。请确保以下代码段已经正确配置:
  1. c
  2. void UART1Init(void)
  3. {
  4.     UARTInitTypeDef UARTInitStructure;
  5.     UARTInitStructure.UARTMode = UARTMode8Bit; // 8位数据位
  6.     UARTInitStructure.UARTBaudRate = 115200;     // 波特率115200
  7.     UARTInitStructure.UARTStopBits = UARTStopBits1; // 1位停止位
  8.     UARTInitStructure.UARTParity = UARTParityNo;    // 无校验位
  9.     UARTInitStructure.UARTRX = GPIOPin6;            // RXD引脚为P1.6
  10.     UARTInitStructure.UARTTX = GPIOPin7;            // TXD引脚为P1.7
  11.     UARTInit(UART1, &UARTInitStructure);
  12. }
复制代码

3. 引脚重映射
在STC8H系列芯片中,串口引脚可以通过寄存器进行重映射。您需要检查并确认以下几点:
PSW1寄存器:在STC8H系列芯片中,PSW1寄存器用于配置串口1的引脚重映射。您需要将PSW1寄存器的相应位设置为1,以将串口1的RXD和TXD引脚重映射到P1.6和P1.7。
  1. c
  2. PSW1 |= 0x40; // 将串口1的RXD和TXD引脚重映射到P1.6和P1.7
复制代码

4. 硬件连接
确保硬件连接正确,P1.6和P1.7已经正确连接到串口通信的接收和发送线路上。如果硬件连接不正确,串口通信将无法正常工作。

5. 调试建议
如果以上配置都正确,但仍然无法进行打印,建议您进行以下调试步骤:
检查波特率:确保波特率设置正确,且与PC端的波特率一致。
检查时钟频率:确保芯片的时钟频率与波特率设置匹配,避免因时钟频率不匹配导致的通信问题。
使用示波器或逻辑分析仪:通过示波器或逻辑分析仪观察P1.6和P1.7的信号,确认是否有数据发送和接收。

6. 代码示例
以下是一个完整的代码示例,展示了如何将串口1的引脚重映射到P1.6和P1.7,并进行串口通信:
  1. c
  2. include "config.h"
  3. include "STC8GHGPIO.h"
  4. include "STC8GHUART.h"
  5. include "STC8GHDelay.h"
  6. include "STC8GHNVIC.h"
  7. include "STC8GHSwitch.h"
  8. void GPIOconfig(void)
  9. {
  10.     GPIOInitTypeDef GPIOInitStructure;
  11.     GPIOInitStructure.Pin = GPIOPin6 | GPIOPin7; // P1.6和P1.7
  12.     GPIOInitStructure.Mode = GPIOModeOutPP;       // 推挽输出
  13.     GPIOInitStructure.Speed = GPIOSpeed50MHz;      // 50MHz
  14.     GPIOInit(GPIOP1, &GPIOInitStructure);
  15. }
  16. void UART1Init(void)
  17. {
  18.     UARTInitTypeDef UARTInitStructure;
  19.     UARTInitStructure.UARTMode = UARTMode8Bit; // 8位数据位
  20.     UARTInitStructure.UARTBaudRate = 115200;     // 波特率115200
  21.     UARTInitStructure.UARTStopBits = UARTStopBits1; // 1位停止位
  22.     UARTInitStructure.UARTParity = UARTParityNo;    // 无校验位
  23.     UARTInitStructure.UARTRX = GPIOPin6;            // RXD引脚为P1.6
  24.     UARTInitStructure.UARTTX = GPIOPin7;            // TXD引脚为P1.7
  25.     UARTInit(UART1, &UARTInitStructure);
  26. }
  27. void main(void)
  28. {
  29.     GPIOconfig();
  30.     PSW1 |= 0x40; // 将串口1的RXD和TXD引脚重映射到P1.6和P1.7
  31.     UART1Init();
  32.     while (1)
  33.     {
  34.         if (UARTGetFlagStatus(UART1, UARTFLAGRX))
  35.         {
  36.             uint8t data = UARTReceiveData(UART1);
  37.             UARTSendData(UART1, data);
  38.         }
  39.     }
  40. }
复制代码

7. 总结
通过以上步骤,您应该能够解决串口1在P1.6和P1.7引脚上无法打印的问题。如果问题仍然存在,建议进一步检查硬件连接和芯片的寄存器配置,确保所有设置都正确无误。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:458
  • 最近打卡:2025-05-01 07:48:22
已绑定手机
已实名认证

110

主题

2218

回帖

5450

积分

版主

积分
5450
发表于 2025-4-18 18:33:17 | 显示全部楼层
寄存器方式中,没有设置P16、P17的IO口模式,默认是高阻默认,不能通讯。
P30和P31出于需要下载程序的考虑, 上电默认模式就是准双向口,所以不用设置也可以通讯。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-21 15:48:36
已绑定手机

1

主题

13

回帖

43

积分

新手上路

积分
43
发表于 2025-4-18 21:37:49 | 显示全部楼层
王*** 发表于 2025-4-18 18:33
寄存器方式中,没有设置P16、P17的IO口模式,默认是高阻默认,不能通讯。
P30和P31出于需要下载程序的考虑 ...

void GPIOconfig(void)
{
    GPIOInitTypeDef GPIOInitStructure;
    GPIOInitStructure.Pin = GPIOPin6 | GPIOPin7; // P1.6和P1.7
    GPIOInitStructure.Mode = GPIOModeOutPP;       // 推挽输出
    GPIOInitStructure.Speed = GPIOSpeed50MHz;      // 50MHz
    GPIOInit(GPIOP1, &GPIOInitStructure);
}
这个不是设置了引脚的IO口模式了吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-21 15:48:36
已绑定手机

1

主题

13

回帖

43

积分

新手上路

积分
43
发表于 2025-4-19 09:31:58 | 显示全部楼层
王*** 发表于 2025-4-18 18:33
寄存器方式中,没有设置P16、P17的IO口模式,默认是高阻默认,不能通讯。
P30和P31出于需要下载程序的考虑 ...

你好,麻烦解决下我的问题,我尝试设置为推挽模式,或者使用寄存器直接配置,都无法使用P1.6 P1.7进行串口打印,在电脑的串口助手都无法显示打印的消息
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:415
  • 最近打卡:2025-04-30 09:58:34
已绑定手机

39

主题

2006

回帖

6841

积分

论坛元老

积分
6841
发表于 2025-4-21 09:18:05 | 显示全部楼层
请提供完整的测试项目,这样方便分析。
寄存器版本明显设置错误,选择 2 才是切换到P1.6,P1.7
io=1: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
截图202504210916521131.jpg

此外检查一下硬件连接,P1.6,P1.7脚位是否选择正确,有没有虚焊或者短路,有没有其它元器件干扰通信信号?

截图202504210924182109.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-21 15:48:36
已绑定手机

1

主题

13

回帖

43

积分

新手上路

积分
43
发表于 2025-4-21 14:43:19 | 显示全部楼层
乘风*** 发表于 2025-4-21 09:18
请提供完整的测试项目,这样方便分析。
寄存器版本明显设置错误,选择 2 才是切换到P1.6,P1.7
io=1: 串口1 ...

“. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4”注释上显示是这样,io=3我是用来测试其它引脚连接串口1是否可以成功,只有串口1切换到P3.0 P3.1才能打印,其它的都不行
  1. /*------------------------------------------------------------------*/
  2. /* --- STC MCU International Limited -------------------------------*/
  3. /* --- STC 1T Series MCU RC Demo -----------------------------------*/
  4. /* --- Mobile: (86)13922805190 -------------------------------------*/
  5. /* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
  6. /* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
  7. /* --- Web: www.stcmcudata.com -------------------------------------*/
  8. /* --- Web: www.stcai.com ------------------------------------------*/
  9. /* --- BBS: www.stcaimcu.com ---------------------------------------*/
  10. /* If you want to use the program or the program referenced in the  */
  11. /* article, please specify in which data and procedures from STC    */
  12. /*------------------------------------------------------------------*/
  13. /*********************************************************/
  14. #define MAIN_Fosc                11059200L        //定义主时钟
  15. #include        "..\..\STC8Hxxx.h"
  16. /*************        功能说明        **************
  17. 请先别修改程序, 直接下载"07-串口1中断收发-多机通信-C语言"里的"UART1.hex"测试, 主频选择11.0592MHZ. 测试正常后再修改移植.
  18. 串口1全双工中断方式收发通讯程序, 地址匹配多机通信方式.
  19. 通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
  20. 默认参数:
  21. 串口1设置均为 1位起始位, 8位数据位, 1位校验位, 1位停止位.
  22. 串口1(P3.0 P3.1): 115200bps.
  23. 通讯原理解释:
  24. 用户宏定义从机地址SLAVE_ADDR(本例为0xaa), 初始化串口1为9位数据位,将匹配地址写入SADDR, 并将SM2至1.
  25. 然后程序等待地址匹配. 发送端将TB8置1并发送地址.
  26. 当地址匹配, 则自动进入接收中断, 将SM2置0, 准备接收数据.
  27. 发送端将TB8置0, 发送数据.
  28. 接收数据并保存, 并且设置超时, 用于判断接收完成.
  29. 检测到超时, 则接收完成, 数据处理(本例为将数据原样返回).
  30. 将SM2置1, 重复上述过程.
  31. 使用PC机的串口助手测试, 串口助手必须能支持9位数据. 发送例子:
  32. 校验位为1, 发送地址0xaa.
  33. 校验位为0, 发送数据(本例不超过128字节).
  34. 串口助手将看到MCU返回的数据, 跟发送的数据一致.
  35. ******************************************/
  36. /*************        本地常量声明        **************/
  37. #define        SLAVE_ADDR        0xaa        //匹配地址
  38. #define        RX1_Length        128                /* 接收缓冲长度 */
  39. /*************        本地变量声明        **************/
  40. u8        xdata        RX1_Buffer[RX1_Length];        //接收缓冲
  41. u8        RX1_TimerOut;        //接收超时
  42. u8        RX1_cnt;                //接收字节计数
  43. bit        B_TX1_Busy;                // 发送忙标志
  44. /*************        本地函数声明        **************/
  45. void        UART1_config(u32 brt, u8 timer, u8 io);        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  46. void         UART1_PrintString(u8 *puts);
  47. void        delay_ms(u8 ms);
  48. //========================================================================
  49. // 函数: void main(void)
  50. // 描述: 主函数
  51. // 参数: none.
  52. // 返回: none.
  53. // 版本: VER1.0
  54. // 日期: 2018-4-2
  55. // 备注:
  56. //========================================================================
  57. void main(void)
  58. {
  59.         u8        i;
  60.         EAXRAM();
  61.     P1M0 &= ~0xc0; P1M1 &= ~0xc0;
  62.         UART1_config(115200UL, 1, 3);        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  63.     P1M0 &= ~0xc0; P1M1 &= ~0xc0;
  64.         EA = 1;
  65.         for(i=0; i<RX1_Length; i++)                RX1_Buffer[i] = 0;
  66.         B_TX1_Busy  = 0;
  67.         RX1_TimerOut = 0;
  68.         RX1_cnt = 0;
  69.         UART1_PrintString("STC8H 8C serial UART1 Test Prgramme!\r\n");
  70.         while (1)
  71.         {
  72.                 delay_ms(1);
  73.                
  74.                 if(RX1_TimerOut != 0)
  75.                 {
  76.                         if(--RX1_TimerOut == 0)        //超时, 则接收结束, 数据处理(本例子仅仅是将数据原样返回)
  77.                         {
  78.                                 if(RX1_cnt != 0)        //收到有数据
  79.                                 {
  80.                                         TB8 = 0;
  81.                                         for(i=0; i<RX1_cnt; i++)
  82.                                         {
  83.                                                 B_TX1_Busy = 1;                //标志发送忙
  84.                                                 SBUF = RX1_Buffer[i];                //发一个字节
  85.                                                 while(B_TX1_Busy);        //等待发送完成
  86.                                         }
  87.                                         RX1_cnt = 0;
  88.                                         SM2 = 1;        //允许地址匹配
  89.                                 }
  90.                         }
  91.                 }
  92.         }
  93. }
  94. //========================================================================
  95. // 函数: void  delay_ms(u8 ms)
  96. // 描述: 延时函数。
  97. // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟.
  98. // 返回: none.
  99. // 版本: VER1.0
  100. // 日期: 2018-4-1
  101. // 备注:
  102. //========================================================================
  103. void  delay_ms(u8 ms)
  104. {
  105.         u16 i;
  106.         do
  107.         {
  108.                 i = MAIN_Fosc / 10000;
  109.                 while(--i)        ;
  110.         }while(--ms);
  111. }
  112. //========================================================================
  113. // 函数: SetTimer2Baudraye(u16 dat)
  114. // 描述: 设置Timer2做波特率发生器。
  115. // 参数: dat: Timer2的重装值.
  116. // 返回: none.
  117. // 版本: VER1.0
  118. // 日期: 2018-4-2
  119. // 备注:
  120. //========================================================================
  121. void        SetTimer2Baudraye(u16 dat)        // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  122. {
  123.         AUXR &= ~(1<<4);        //Timer stop
  124.         AUXR &= ~(1<<3);        //Timer2 set As Timer
  125.         AUXR |=  (1<<2);        //Timer2 set as 1T mode
  126.         TH2 = (u8)(dat >> 8);
  127.         TL2 = (u8)dat;
  128.         IE2  &= ~(1<<2);        //禁止中断
  129.         AUXR |=  (1<<4);        //Timer run enable
  130. }
  131. //========================================================================
  132. // 函数: void        UART1_config(u32 brt, u8 timer, u8 io)
  133. // 描述: UART1初始化函数。
  134. // 参数:   brt: 通信波特率.
  135. //       timer: 波特率使用的定时器, timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率.
  136. //          io: 串口1切换到的IO,  io=1: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  137. // 返回: none.
  138. // 版本: VER1.0
  139. // 日期: 2018-4-2
  140. // 备注:
  141. //========================================================================
  142. void        UART1_config(u32 brt, u8 timer, u8 io)        // brt: 通信波特率,  timer=2: 波特率使用定时器2, 其它值: 使用Timer1做波特率. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4.
  143. {
  144.         brt = 65536UL - (MAIN_Fosc / 4) / brt;
  145.         if(timer == 2)        //波特率使用定时器2
  146.         {
  147.                 AUXR |= 0x01;                //S1 BRT Use Timer2;
  148.                 SetTimer2Baudraye((u16)brt);
  149.         }
  150.         else                //波特率使用定时器1
  151.         {
  152.                 TR1 = 0;
  153.                 AUXR &= ~0x01;                //S1 BRT Use Timer1;
  154.                 AUXR |=  (1<<6);        //Timer1 set as 1T mode
  155.                 TMOD &= ~(1<<6);        //Timer1 set As Timer
  156.                 TMOD &= ~0x30;                //Timer1_16bitAutoReload;
  157.                 TH1 = (u8)(brt >> 8);
  158.                 TL1 = (u8)brt;
  159.                 ET1 = 0;                        // 禁止Timer1中断
  160.                 INT_CLKO &= ~0x02;        // Timer1不输出高速时钟
  161.                 TR1  = 1;                        // 运行Timer1
  162.         }
  163.                  if(io == 1)        {S1_USE_P36P37();        P3n_standard(0xc0);}        //切换到 P3.6 P3.7
  164.         else if(io == 2)        {S1_USE_P16P17();        P1n_standard(0xc0);}        //切换到 P1.6 P1.7
  165.         else if(io == 3)        {S1_USE_P43P44();        P4n_standard(0x18);}        //切换到 P4.3 P4.4
  166.         else                                {S1_USE_P30P31();        P3n_standard(0x03);}        //切换到 P3.0 P3.1
  167.         SCON = (SCON & 0x3f) | (3<<6);        // 8位数据, 1位校验位, 1位起始位, 1位停止位
  168. //        PS  = 1;        //高优先级中断
  169.         SADDR = SLAVE_ADDR;                //匹配地址
  170.         SADEN = 0xff;                        //地址屏蔽
  171.         SM2 = 1;        //允许地址匹配
  172.         ES  = 1;        //允许中断
  173.         REN = 1;        //允许接收
  174. }
  175. //========================================================================
  176. // 函数: void UART1_PrintString(u8 *puts)
  177. // 描述: 串口1字符串打印函数
  178. // 参数: puts: 字符串指针.
  179. // 返回: none.
  180. // 版本: VER1.0
  181. // 日期: 2018-4-2
  182. // 备注:
  183. //========================================================================
  184. void UART1_PrintString(u8 *puts)
  185. {
  186.     for (; *puts != 0;        puts++)
  187.         {
  188.                 B_TX1_Busy = 1;                //标志发送忙
  189.                 TB8 = 0;
  190.                 SBUF = *puts;                //发一个字节
  191.                 while(B_TX1_Busy);        //等待发送完成
  192.         }
  193. }
  194. //========================================================================
  195. // 函数: void UART1_int (void) interrupt UART1_VECTOR
  196. // 描述: 串口1中断函数
  197. // 参数: none.
  198. // 返回: none.
  199. // 版本: VER1.0
  200. // 日期: 2018-4-2
  201. // 备注:
  202. //========================================================================
  203. void UART1_int (void) interrupt UART1_VECTOR
  204. {
  205.         if(RI)
  206.         {
  207.                 RI = 0;
  208.                 if(RB8)                                //为地址信息, 地址匹配
  209.                 {
  210.                 //        if(SBUF == SLAVE_ADDR)                //这句可以不用, 能收到则为地址匹配了
  211.                         {
  212.                                 SM2 = 0;                //允许接收数据
  213.                                 RX1_cnt = 0;        //接收计数归0
  214.                         }
  215.                 }
  216.                 else                //接收到数据
  217.                 {
  218.                         RX1_Buffer[RX1_cnt] = SBUF;        //保存一个数据
  219.                         if(++RX1_cnt > RX1_Length)        RX1_cnt = 0;
  220.                         RX1_TimerOut = 5;                                //接收数据超时时间
  221.                 }
  222.         }
  223.         if(TI)
  224.         {
  225.                 TI = 0;
  226.                 B_TX1_Busy = 0;
  227.         }
  228. }
复制代码


是完整的项目代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-21 15:48:36
已绑定手机

1

主题

13

回帖

43

积分

新手上路

积分
43
发表于 2025-4-21 15:48:36 | 显示全部楼层
oqxe*** 发表于 2025-4-21 14:43
“. io=0: 串口1切换到P3.0 P3.1,  =1: 切换到P3.6 P3.7,  =2: 切换到P1.6 P1.7,  =3: 切换到P4.3 P4.4” ...

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:3
  • 最近打卡:2025-04-21 15:48:36
已绑定手机

1

主题

13

回帖

43

积分

新手上路

积分
43
发表于 2025-4-21 15:50:19 | 显示全部楼层
这是我的芯片图
屏幕截图 2025-04-05 091339.png
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:162
  • 最近打卡:2025-05-01 06:56:44
已绑定手机

56

主题

1318

回帖

2936

积分

荣誉版主

无情的代码机器

积分
2936
发表于 2025-4-21 16:24:44 | 显示全部楼层

在8H开天斧开发板上实测通过的例程参考下,使用P16 17当串口
05-串口1中断模式与电脑收发测试.zip (335.73 KB, 下载次数: 1)
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-1 17:06 , Processed in 0.133248 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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