打印
[技术问答]

M0516小板串口发送数据的问题

[复制链接]
1120|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
JY-DX-JY|  楼主 | 2015-6-25 19:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有一块M0516LDN的小板,参考温子祺的书写程序,发现数据不对,貌似波特率的问题。
大神给看看,谢谢!
#include "SmartM_M0.h"
/*******************************************
*º¯ÊýÃû³Æ£ºUartInit
*ÊäÈ룺unFosc
    unBaud   ·¢ËÍ×Ö½Ú×ÜÊý
*Êä³ö£ºÎÞ
*¹¦ÄÜ£º´®¿Ú³õʼ»¯
************************************************/
VOID UartInit(UINT32 unFosc,UINT32 unBaud)
{
P3_MFP&=~(P31_TXD0|P30_RXD0);
P3_MFP|=(TXD0|RXD0);             //P3.0ʹÄÜΪ´®¿Ú0½ÓÊÕÒý½Å
                        //P3.1ʹÄÜΪ´®¿Ú0·¢ËÍÒý½Å
UART0_Clock_EN;                //´®¿Ú0ʱÖÓʹÄÜ
UARTClkSource_ex12MHZ;            //´®¿ÚʱÖÓÑ¡ÔñΪÍⲿ¾§Õñ
CLKDIV&=~(15<<8);               //´®¿ÚʱÖÓ·ÖƵΪ0
IPRSTC2|=UART0_RST;              //¸´Î»´®¿Ú0
IPRSTC2&=~UART0_RST;             //¸´Î»½áÊø
UA0_FCR|=TX_RST;               //·¢ËÍFIFO¸´Î»
UA0_FCR|=RX_RST;               //½ÓÊÕFIFO¸´Î»
UA0_LCR&=~PBE;                //УÑéλ¹¦ÄÜÈ¡Ïû
UA0_LCR&=~WLS;               
UA0_LCR&=WL_8BIT;               //8λÊý¾Ýλ
UA0_LCR&=NSB_ONE;               //1λֹͣλ
UA0_BAUD|=DIV_X_EN|DIV_X_ONE;         //ÉèÖò¨ÌØÂÊ·ÖƵ
UA0_BAUD|=((unFosc/unBaud)-2);        //²¨ÌØÂÊÉèÖÃUART_CLK/(A+2)=115200bps
}
/*******************************************
*º¯ÊýÃû³Æ£ºUartSend
*ÊäÈ룺   pBuf      ·¢ËÍÊý¾Ý»º³åÇø
      unNumOfBytes  ·¢ËÍ×Ö½Ú×ÜÊý
*Êä³ö
*¹¦ÄÜ£º´®¿Ú·¢ËÍÊý¾Ý
**************************************************/
VOID UartSend(UINT8 *pBuf,UINT32 unNumOfBytes)
{
UINT32 i;
for(i=0;i<unNumOfBytes;i++)
{
  UA0_THR=*(pBuf+i);
  while((UA0_FSR&TX_EMPTY)!=0x00);       //¼ì²é·¢ËÍFIFOÊÇ·ñΪ¿Õ
}
}
VOID UartSendByte(UINT8 pBuf)
{

  UA0_THR=pBuf;
  while((UA0_FSR&TX_EMPTY)!=0x00);       //¼ì²é·¢ËÍFIFOÊÇ·ñΪ¿Õ

}
INT32 main(VOID)
{
UINT32 i;
UINT8  j;

PROTECT_REG                  //ISPÏÂÔØʱ±£»¤FLASH´æ´¢Æ÷
(
  PWRCON|=XTL12M_EN;             //ĬÈÏʱÖÓԴΪÍⲿ¾§Õñ
  while((CLKSTATUS & XTL12M_STB)==0);     //µÈ´ý12MHzʱÖÓÎȶ¨
  CLKSEL0=(CLKSEL0 & (~HCLK)) | HCLK_12M;   //ÉèÖÃÍⲿ¾§ÕñΪϵͳʱÖÓ
  
)
UartInit(12000000,9600);           //²¨ÌØÂÊÉèÖÃΪ9600bit/s
while(1)
{
  j=0;                    //·¢ËÍÊý¾Ý0~255
  //for(i=0;i<256;i++)
  //{
   UartSendByte(0x55);
   //j++;
   //Delayms(500);
   for(i=0;i<60000;i++);
   UartSendByte(0xaa);
   for(i=0;i<60000;i++);
   //j++;
   //Delayms(500);
  //}
}
}

沙发
JY-DX-JY|  楼主 | 2015-6-25 19:45 | 只看该作者
#include "SmartM_M0.h"

/*******************************************
*函数名称:UartInit
*输入:unFosc
                                unBaud   发送字节总数
*输出:无
*功能:串口初始化
************************************************/

VOID UartInit(UINT32 unFosc,UINT32 unBaud)
{
        P3_MFP&=~(P31_TXD0|P30_RXD0);
        P3_MFP|=(TXD0|RXD0);                                                                                                        //P3.0使能为串口0接收引脚
                                                                                                                                                                                                //P3.1使能为串口0发送引脚
        UART0_Clock_EN;                                                                                                                                //串口0时钟使能
        UARTClkSource_ex12MHZ;                                                                                                //串口时钟选择为外部晶振
        CLKDIV&=~(15<<8);                                                                                                                        //串口时钟分频为0
        IPRSTC2|=UART0_RST;                                                                                                                //复位串口0
        IPRSTC2&=~UART0_RST;                                                                                                        //复位结束
        UA0_FCR|=TX_RST;                                                                                                                        //发送FIFO复位
        UA0_FCR|=RX_RST;                                                                                                                        //接收FIFO复位
        UA0_LCR&=~PBE;                                                                                                                                //校验位功能取消
        UA0_LCR&=~WLS;                                                                                                                               
        UA0_LCR&=WL_8BIT;                                                                                                                        //8位数据位
        UA0_LCR&=NSB_ONE;                                                                                                                        //1位停止位
        UA0_BAUD|=DIV_X_EN|DIV_X_ONE;                                                                        //设置波特率分频
        UA0_BAUD|=((unFosc/unBaud)-2);                                                                //波特率设置UART_CLK/(A+2)=115200bps
}

/*******************************************
*函数名称:UartSend
*输入:                        pBuf                                                发送数据缓冲区
                                                unNumOfBytes                发送字节总数
*输出
*功能:串口发送数据
**************************************************/
VOID UartSend(UINT8 *pBuf,UINT32 unNumOfBytes)
{
        UINT32 i;
        for(i=0;i<unNumOfBytes;i++)
        {
                UA0_THR=*(pBuf+i);
                while((UA0_FSR&TX_EMPTY)!=0x00);                                                        //检查发送FIFO是否为空
        }
}
VOID UartSendByte(UINT8 pBuf)
{
       
                UA0_THR=pBuf;
                while((UA0_FSR&TX_EMPTY)!=0x00);                                                        //检查发送FIFO是否为空
       
}

INT32 main(VOID)
{
        UINT32 i;
        UINT8  j;
       
        PROTECT_REG                                                                                                                                                //ISP下载时保护FLASH存储器
        (
                PWRCON|=XTL12M_EN;                                                                                                        //默认时钟源为外部晶振
                while((CLKSTATUS & XTL12M_STB)==0);                                        //等待12MHz时钟稳定
                CLKSEL0=(CLKSEL0 & (~HCLK)) | HCLK_12M;                        //设置外部晶振为系统时钟
               
        )
        UartInit(12000000,9600);                                                                                        //波特率设置为9600bit/s
        while(1)
        {
                j=0;                                                                                                                                                                //发送数据0~255
                //for(i=0;i<256;i++)
                //{
                        UartSendByte(0x55);
                        //j++;
                        //Delayms(500);
                        for(i=0;i<60000;i++);
                        UartSendByte(0xaa);
                        for(i=0;i<60000;i++);
                        //j++;
                        //Delayms(500);
                //}
        }
}

使用特权

评论回复
板凳
JY-DX-JY|  楼主 | 2015-6-26 09:55 | 只看该作者
高手支招啊!

使用特权

评论回复
地板
Harvard| | 2015-6-26 13:00 | 只看该作者
用官方最新的bsp库吧 .温总的书针对早期的AN
BN系列

使用特权

评论回复
5
JY-DX-JY|  楼主 | 2015-6-26 13:02 | 只看该作者
奥。谢谢!

使用特权

评论回复
6
mintspring| | 2015-6-27 10:56 | 只看该作者
用官方最新的bsp库吧 .

使用特权

评论回复
7
598330983| | 2015-6-27 11:31 | 只看该作者
{
                        UartSendByte(0x55);
                        //j++;
                        //Delayms(500);
                        for(i=0;i<60000;i++);
                        UartSendByte(0xaa);
                        for(i=0;i<60000;i++);
                        //j++;
                        //Delayms(500);
                //}都是喜欢发个0x55...

使用特权

评论回复
8
gaoyang9992006| | 2015-6-27 11:54 | 只看该作者
我使用的库函数包里的例程,是没问题的啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:晴天响霹雳,平地一声雷。

245

主题

3349

帖子

30

粉丝