ch552用time2 16位做波特率发生器不能工作

用time2  16位做波特率发生器不能工作

哪里出了问题 可能帮看看


voidUART0Setup( )

{

    SM0 = 0;

    SM1 = 1;

    SM2 = 0;                                                                   //串口0使用模式1

    RCLK = 1;                                                                  //UART0接收时钟

    TCLK = 1;                                                                  //UART0发送时钟   

                                                                             //使用Timer2作为波特率发生器

    C_T2=0;

    CP_RL2=0;

    T2MOD = T2MOD | bTMR_CLK |bT2_CLK ;

   

    //TL2 = 65536 - FREQ_SYS / 115200 / 16;

   // TH2 = (65536 - FREQ_SYS / 115200 / 16) >> 8;

    RCAP2 = 65536 - FREQ_SYS/16/UART0_BUAD;

    

    TR2 = 1;                                                                   //启动定时器2

    TI = 1;                                                                    //使能串口0中断

    REN = 1;                                                                   //串口0接收使能

    

}


程序没问题,可以用,你是用错口了,默认串口P30 P31.如果没有这2个引脚,要映射的,你看看。


mInitSTDIO注释了。

默认串口P30 P31 必须要映射才能用吗。


确实可以用,但是只能发不能收。我加了调节波特率的函数就挂了。应该是调节波特率不对,

可能帮看下这个问题哪里写错了。

这样写好像不对吧,设置波特率





void Config_Uart0(UINT8 *cfg_uart)

{

UINT32 uart0_buad = 0;

*((UINT8 *)&uart0_buad) = cfg_uart[3];*((UINT8 *)&uart0_buad+1) = cfg_uart[2];*((UINT8 *)&uart0_buad+2) = cfg_uart[1];*((UINT8 *)&uart0_buad+3) = cfg_uart[0];

ES = 0;RCAP2 = 65536 - FREQ_SYS/16/uart0_buad;

ES = 1;

}

这样写好像不对吧,设置波特率


发长点就把回复按钮给覆盖了。。。。这


memcpy(LineCoding,UsbSetupBuf,USB_RX_LEN);


Config_Uart0(LineCoding);     //注释掉才能用


是不是中断优先级出问题了?


void Uart0_ISR(void) interrupt INT_NO_UART0

{

if(RI)   //收到数据

{

Receive_Uart_Buf[Uart_Input_Point++] = SBUF;

UartByteCount++;                    //当前缓冲区剩余待取字节数

if(Uart_Input_Point>=UART_REV_LEN)

Uart_Input_Point = 0;           //写入指针

RI =0;}}


发送能发送,接收就可以,如果不能接收说明接收函数有问题;

修改波特率你要算,看误差多少能不能用,如果明显算出来误差大,改了就没有意义。

优先级?啥意思?


void Uart0_ISR(void) interrupt INT_NO_UART0


串口0 不能中断 所以收不到数据


但是如果设置成串口1    void Uart1_ISR(void) interrupt INT_NO_UART1

串口1能中断获取数据。


写成  while(1){}也不行

串口1可以中断,串口0无法中断。


找到原因,设置ES=1没设置,但是设置ES=1,就串口就不能打开了。。。。


改好了,复制过来的TI=1没删掉。  真是吐血了。


发送能达到1.5m,接收只能5k。51也就这样了。


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