实验现象:
这里驱动程序有一句逻辑搞反了:
if(UART1_RX_STA & 0x8000)//判断16位数据UART1_RX_STA最高位是否=1
高位是1就应该结束接收,只有最高位=0的时候才能接收,所以要改成:
if(!(UART1_RX_STA & 0x8000))//判断16位数据UART1_RX_STA最高位是否=1
我手头的板子P36 接74HC595 (可以把JP595拔掉解决)
AD/DA光敏 XPT2046 用到P36 是焊死的,导致接收的字符出现乱码
无线接口 NRF 2041 接P37
真的只能把核心板拆下来,用杜邦线连接HC6800-ES V2.0 的P30 P31 去核心板P3.6P3.7
就一切正常
然后把板子上P30(RxD) 接核心板RxD2(P3.6),板子上P31(TxD) 接核心板TxD2(P3.7),
P36P37有没有其他公用设备,且焊死,只能把核心板拆下来,2者共地,只使用HC6800-ESV2.0 的USC转TTL电路
见下图:
把主函数改动一下:
////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
//<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
// 在此添加用户主函数初始化代码
u16 len = 0;
u16 i = 0;
//<<AICUBE_USER_MAIN_INITIAL_END>>
SYS_Init();
//<<AICUBE_USER_MAIN_CODE_BEGIN>>
// 在此添加主函数中运行一次的用户代码
printf("Hello World !\n");
//<<AICUBE_USER_MAIN_CODE_END>>
while (1)
{
//<<AICUBE_USER_MAIN_LOOP_BEGIN>>
// 在此添加主函数中用户主循环代码
if(UART1_RX_STA & 0x8000)//判断16位数据UART1_RX_STA最高位是否=1
{
len= UART1_RX_STA%0x3FFF; //取出状态字中的长度
for(i=0;i<len;i++)
{
UART1_SendData(UART1_RX_BUF);
while(!UART1_CheckTxFlag());//等待每个字符发送完成
UART1_ClearTxFlag(); //清除串口发送中断标志
}
UART1_RX_STA = 0; //本次发送完成,清状态字准备好下一次接收
printf("Hello World !\n");
}
//<<AICUBE_USER_MAIN_LOOP_END>>
}
}
证实printf()函数也是正常的,到处可以本实验结束
我们先搁置各种问题,继续往下学习18.1-WDT看门狗实验-简介
我们看看看门狗寄存器:
我们的主频是40MHZ,时间就是2.5S,不能超过,超过就会溢出,重新启动
用到的硬件如下:
重点看软件配置: