|
本帖最后由 qqqqliujin 于 2024-2-23 10:28 编辑
第1次正式使用stc的主控,有些技术问题,麻烦各位大佬看一下。
问题:可烧录程序,无法使用STC8H1K08的uart1跑通官方demo--06-串口1中断模式与电脑收发测试,demo中开机有个打印字符串,PC端也无法收到该字符串。
硬件连接:使用单片机的下载烧录口P3.0 P3.1和PC进行串口通讯,直接使用STC-USB Link1D 工具作为串口-usb转换工具,单片机连接至STC-USB Link1D的swdclk和swddat,相当于下载烧录口就是串口通讯口。
PC串口工具:使用STC-ISP的串口调试功能,打开STC-USB Link1D(CDC1)端口。同时也使用其它调试助手也测试过。
编译器:使用keil3,新建一个工程,将demo中的库文件直接复制过来的,编译没问题。
电路:未使用外部时钟。
怀疑:是否是时钟树未配置正确,导致波特率并未按照预期配置。我将config.h中的时钟配置修改为这样也不行:#define MAIN_Fosc 20000000L //定义主时钟
主函数如下:
#include "config.h"
#include "STC8G_H_GPIO.h"
#include "STC8G_H_UART.h"
#include "STC8G_H_Delay.h"
#include "STC8G_H_NVIC.h"
#include "STC8G_H_Switch.h"
void GPIO_config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //结构定义
GPIO_InitStructure.Pin = GPIO_Pin_0 | GPIO_Pin_1; //指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7
GPIO_InitStructure.Mode = GPIO_PullUp; //指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
GPIO_Inilize(GPIO_P3,&GPIO_InitStructure); //初始化
}
void UART_config(void)
{
COMx_InitDefine COMx_InitStructure; //结构定义
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 9600ul; //波特率, 一般 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
UART_Configuration(UART1, &COMx_InitStructure); //初始化串口1 UART1,UART2,UART3,UART4
NVIC_UART1_Init(ENABLE,Priority_1); //中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
UART1_SW(UART1_SW_P30_P31); //UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}
void main(void)
{
u8 i;
EAXSFR();
GPIO_config();
UART_config();
EA = 1;
printf("STC8H8K64U UART1 Test Programme!\r\n"); //UART1发送一个字符串
// PrintString1("STC8H8K64U UART1 Test Programme!\r\n"); //UART1发送一个字符串
while (1)
{
delay_ms(100);
printf("STC8H8K64U UART1 Test Programme!\r\n");
if(COM1.RX_TimeOut > 0) //超时计数
{
if(--COM1.RX_TimeOut == 0)
{
if(COM1.RX_Cnt > 0)
{
for(i=0; i<COM1.RX_Cnt; i++) TX1_write2buff(RX1_Buffer); //收到的数据原样返回
}
COM1.RX_Cnt = 0;
}
}
}
}
|
|