CH559L的UART1的SER1_FCR的问题?

在一个项目中,?用CH559L的UART1进行只发不收(1s发送100次左右的数据串),?和能发能收(60s使能一次);

#define? uart1_EnRxd? IE_UART1=?1? ? ? ? ? ?// 开启 接收中断, 这个60s使能一次

#define? uart1_UnRxd? IE_UART1=0? ? ? ? ?// 关闭 接收中断, 收一次数据就关闭中断


void uart1_init()

{

unsigned int x;

SER1_LCR |= bLCR_DLAB;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 停 设置屏蔽

SER1_DIV = 12;

x = 10 * 12000000 * 2 / 12 / 16 / 115200;? ? ? ? ? ? ? ? ? ? ? ? ? // 默认时钟, 12分频, 115200bps

if ( x % 10 >= 5) x += 10;

x /= 10;

SER1_DLM = x >> 8;

SER1_DLL = x;

SER1_LCR &= ~bLCR_DLAB;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?// 启 设置屏蔽


XBUS_AUX |= bALE_CLK_EN;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // UART 功能

SER1_LCR = bLCR_WORD_SZ1 | bLCR_WORD_SZ0;? ? ? ? ? ? ? // 8bit, NONE, 1stop

SER1_IER = bIER_PIN_MOD1 | bIER_RECV_RDY;? ? ? ? ? ? ? ? ? ? // P2.6, P2.7, RDY这个中断是必须要使能吗, 不使能好像都不能发送

SER1_FCR = MASK_U1_FIFO_TRIG | bFCR_T_FIFO_CLR | bFCR_R_FIFO_CLR | bFCR_FIFO_EN;? ? ? ? // SER1_FCR = 0xC7

SER1_MCR = bMCR_OUT2;

SER1_ADDR |= 0xff;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 点对点?

}


void UART1_Interrupt(void) interrupt INT_NO_UART1 using 1 ? ? ? ? ? ? ? ?//UART1中断服务程序,使用寄存器组1

{

u8 _tmp = 0;

u8 _int = SER1_IIR & 0x0f; // SER1_IIR 低4位, 组成7个中断标志


switch(_int){

case U1_INT_RECV_RDY:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // 数据可用 中断

? ? _tmp = UART1_Rxd(&UART1_RecBuff[CNT_Rxd1]);? ? //? 7位 FIFO 数据

? ? CNT_Rxd1 += _tmp;

? ? FLAG_RecFull = 1;? ? ? ? ? ? ? ? ? ? ?

break;

case U1_INT_RECV_TOUT:? ? ? ?// 接收超时 中断?

? ? _tmp = UART1_Rxd(&UART1_RecBuff[CNT_Rxd1]);? ? ?// 1~6 位 FIFO 数据

? ? CNT_Rxd1 += _tmp;

? ? FLAG_RecHalf = 1;

break;

case U1_INT_LINE_STAT://线路状态中断

break;

case U1_INT_SLV_ADDR://设备地址match中断

break;

case U1_INT_NO_INTER://无中断

break;

case U1_INT_MODEM_CHG:? ? //MODEM中断

_tmp = SER1_MSR;? ? // 读 SER1_MSR 清中断

break;

case U1_INT_THR_EMPTY:? ? //发送空中断,可以启动下次发送或者等待接收

break;

default:? ? break;

}

}

发现的问题:

  1. uart1_init()初始化后,? 读SER1_FCR为 0xC1,? 显示bFCR_FIFO_EN,? 这个是对的,? 但收了几次数据(未开启UART1中断)后, SER1_FCR变为了 0xC4;? ? 这是什么原因,?有什么影响呢;

  2. 开启uart1_EnRxd后,? 从UART1中断接收数据,? ?经常会跑飞(程序死机).? ?外部main函数是根据FLAG_RecFull? ?和? ?FLAG_RecHalf标志位,? ?判断长度是否满足总数据长度15位,? ?再读取进行判断.?

  3. 关于U1_INT_RECV_TOUT,? ?接收超时中断;? ? 如果接收的数据正好是7位(使能7位FIFO),? ?那这个时候响应的应该是U1_INT_RECV_RDY中断还是U1_INT_RECV_TOUT中断呢(或者是2个都响应);?

  4. 这个是我这个函数有问题吗? 有没有完善一点的UART1接收函数例程呢, 多谢了

  5. 帖子修改之后,?空格?会被识别成"?",?这个问题...



SER1_IER;SER1_IIR;SER1_FCR;SER1_LCR;SER1_MCR;SER1_LSR;SER1_MSR; 这些寄存器,刚初始化是 "21 C4 C4 03 08 63 00"; 发送几次数据之后(UART1会收到返回值, 但因没开启中断, 所以不会响应数据)的值是 "21 C1 C1 03 08 60 00"


引用一个外链吧:https://blog.csdn.net/havc_W/article/details/122345259?spm=1001.2014.3001.5501

不要过分纠结寄存器的变化,而应该关注示例代码本身的处理思想。


跑飞常规思路检查是否有RAM访问越界,尤其是你定义的UART1_RecBuff



只有登录才能回复,可以选择微信账号登录