[Cortex-M0技术交流] 谁能帮我看看这个代码问题出哪里了

[复制链接]
 楼主| stul海盗 发表于 2014-2-25 09:56 | 显示全部楼层 |阅读模式
-------------------------------------------uart.c---------------------------------
uint32_t uart_buf[64];
uint8_t uart_flag=0;

void Init_Uart(void)
{       
        SYSCLK->CLKSEL1.UART_S= 0x00;       //Ñ¡ÔñÍⲿ12MΪʱÖÓÔ´
        SYS->GPBMFP.UART0_RX=1;             //ÅäÖÃB0£¬B1ΪRX0£¬TX0
        SYS->GPBMFP.UART0_TX=1;
       
        SYS->IPRSTC2.UART0_RST=  1;
        SYS->IPRSTC2.UART0_RST=  0;         //¸´Î»UART0
        SYSCLK->APBCLK.UART0_EN= 1;         //ʹÄÜUART0ʱÖÓ

        SYSCLK->CLKDIV.UART_N=0;
        //UART0->BAUD= (2<<28) |(12000000/115200)-2;
        UART0->BAUD.DIV_X_EN =1;
        UART0->BAUD.DIV_X_ONE=1;
        UART0->BAUD.BRD = ((12000000/115200)-2);  //ÉèÖò¨ÌØÂÊΪ115200
        UART0->LCR.NSB =0;  
        UART0->LCR.WLS=3;
        UART0->LCR.PBE=0;        //1¸öֹͣ룬Êý¾Ý³¤¶ÈΪ8룬ÎÞÆæÅ¼¼ìÑé
       

  UART0->FCR.RFITL=0;

        UART0->IER.RDA_IEN=1;    //½ÓÊÕÊý¾ÝÖжÏʹÄÜ
        NVIC_EnableIRQ(UART0_IRQn);
       
       
}



void UART_Read(uint32_t        *pu8RxBuf,uint32_t u32ReadBytes)
{
  uint32_t i;
        for(i=0;i<u32ReadBytes;i++)
        {
     pu8RxBuf[i]= UART0->u32DATA;
                //*(pu8RxBuf+i)= UA0_RBR;
  }
}

void UART_Write(uint32_t        *pu8TxBuf,         uint32_t u32WriteBytes)
{
  uint32_t i;
        for(i=0;i<u32WriteBytes;i++)
        {
    UART0->u32DATA = pu8TxBuf[i];
                //UA0_THR   = *(pu8TxBuf +i);
  }
}


void UART02_IRQHandler(void)
{

       
  if(UART0->ISR.RDA_INT==1)
        {
               
     while(UART0->FSR.RX_EMPTY==0)
                 {
       UART_Read(uart_buf,64);
                 }
               
        }
        uart_flag=1;
}

----------------------------------------------main.c----------------------------------------
extern uint32_t uart_buf[64];
extern uint8_t uart_flag;

int32_t main (void)
{
  while(1)
   {
   
       
          if(uart_flag==1)
                        {
         uart_flag=0;
                         UART_Write(uart_buf,64);
               
            Delay_ms(1000);
      }
       
                 
                 
               
   }
}
这段代码能进入接收数据中断,但是发出来的数据全是0,好蛋疼啊
 楼主| stul海盗 发表于 2014-2-25 10:06 | 显示全部楼层
贴一个有注释的,这是NUC120的,可有人知道问题出在哪里了啊,能进中断,但是读到的都是0,发出来的自然也是0


uint32_t uart_buf[64];
uint8_t uart_flag=0;


/****************************************************************************
* 名    称:void Init_Uart(void)
* 功    能:串口初始化
* 入口参数:无
* 出口参数:无
****************************************************************************/
void Init_Uart(void)
{       
        SYSCLK->CLKSEL1.UART_S= 0x00;       //选择外部12M为时钟源
        SYS->GPBMFP.UART0_RX=1;            
        SYS->GPBMFP.UART0_TX=1;            //配置PB0,PB1为RX0,TX0
       
        SYS->IPRSTC2.UART0_RST=  1;
        SYS->IPRSTC2.UART0_RST=  0;         //复位UART0
        SYSCLK->APBCLK.UART0_EN= 1;         //使能UART0时钟

        SYSCLK->CLKDIV.UART_N=0;
        //UART0->BAUD= (2<<28) |(12000000/115200)-2;
        UART0->BAUD.DIV_X_EN =1;
        UART0->BAUD.DIV_X_ONE=1;
        UART0->BAUD.BRD = ((12000000/115200)-2);  //设置波特率为115200
        UART0->LCR.NSB =0;  
        UART0->LCR.WLS=3;
        UART0->LCR.PBE=0;        //1个停止位,数据长度8位,无奇偶校验
       

  UART0->FCR.RFITL=0;

        UART0->IER.RDA_IEN=1;    //接收数据中断使能
        NVIC_EnableIRQ(UART0_IRQn);
       
       
}


/****************************************************************************
* 名    称:void UART_Read(uint32_t        *pu8RxBuf,uint32_t u32ReadBytes)
* 功    能:从串口缓存读取数据
* 入口参数:*pu8RxBuf :要读入的缓存
            u32ReadBytes :读多少个(64)
*出口参数:无
****************************************************************************/
void UART_Read(uint32_t        *pu8RxBuf,uint32_t u32ReadBytes)
{
  uint32_t i;
        for(i=0;i<u32ReadBytes;i++)
        {
     pu8RxBuf[i]= UART0->u32DATA;
                //*(pu8RxBuf+i)= UA0_RBR;
  }
}

/****************************************************************************
* 名    称:void UART_Write(uint32_t        *pu8TxBuf,         uint32_t u32WriteBytes)
* 功    能:往串口缓存写数据
* 入口参数:*pu8RxBuf :要写入的缓存
            u32ReadBytes :写多少个(64)
* 出口参数:无
****************************************************************************/
void UART_Write(uint32_t        *pu8TxBuf,         uint32_t u32WriteBytes)
{
  uint32_t i;
        for(i=0;i<u32WriteBytes;i++)
        {
    UART0->u32DATA = pu8TxBuf[i];
                //UA0_THR   = *(pu8TxBuf +i);
  }
}

/****************************************************************************
* 名    称:void UART02_IRQHandler(void)
* 功    能:中断服务子程序
* 入口参数:无
* 出口参数:无            

****************************************************************************/
void UART02_IRQHandler(void)
{

       
  if(UART0->ISR.RDA_INT==1)
        {
               
     while(UART0->FSR.RX_EMPTY==0)   
                 {
       UART_Read(uart_buf,64);
                 }
               
        }
        uart_flag=1;
}
 楼主| stul海盗 发表于 2014-2-25 10:08 | 显示全部楼层
但是只往发送缓存里面写数据可以发送到串口调试助手上面,有人知道为什么吗,或者谁能发我个NUC120写好的代码参考下,小弟不甚感激
xyz549040622 发表于 2014-2-25 10:21 | 显示全部楼层
官网有代码的,测试完美通过
 楼主| stul海盗 发表于 2014-2-25 10:57 | 显示全部楼层
xyz549040622 发表于 2014-2-25 10:21
官网有代码的,测试完美通过

真的假的,是哪个包的
 楼主| stul海盗 发表于 2014-2-25 10:58 | 显示全部楼层
xyz549040622 发表于 2014-2-25 10:21
官网有代码的,测试完美通过

能放出来看看嘛,是120的吗,我发现void UART0_IRQHandler(void);函数根本进不了中断,必须是void UART02_IRQHandler(void)
xyz549040622 发表于 2014-2-25 11:09 | 显示全部楼层
stul海盗 发表于 2014-2-25 10:58
能放出来看看嘛,是120的吗,我发现void UART0_IRQHandler(void);函数根本进不了中断,必须是void UART0 ...

官网下载即可,至于你说的这个名字问题
  1.               DCD     BOD_IRQHandler  
  2.                 DCD     WDT_IRQHandler  
  3.                 DCD     EINT0_IRQHandler
  4.                 DCD     EINT1_IRQHandler
  5.                 DCD     GPAB_IRQHandler
  6.                 DCD     GPCDE_IRQHandler
  7.                 DCD     PWMA_IRQHandler
  8.                 DCD     PWMB_IRQHandler
  9.                 DCD     TMR0_IRQHandler
  10.                 DCD     TMR1_IRQHandler
  11.                 DCD     TMR2_IRQHandler
  12.                 DCD     TMR3_IRQHandler
  13.                 DCD     UART02_IRQHandler
  14.                 DCD     UART1_IRQHandler
  15.                 DCD     SPI0_IRQHandler
  16.                 DCD     SPI1_IRQHandler
  17.                 DCD     SPI2_IRQHandler
  18.                 DCD     SPI3_IRQHandler
  19.                 DCD     I2C0_IRQHandler
  20.                 DCD     I2C1_IRQHandler
  21.                 DCD     CAN0_IRQHandler
  22.                 DCD     Default_Handler
  23.                 DCD     Default_Handler
  24.                 DCD     USBD_IRQHandler  
  25.                 DCD     PS2_IRQHandler  
  26.                 DCD     ACMP_IRQHandler
  27.                 DCD     PDMA_IRQHandler
  28.                 DCD     I2S_IRQHandler
  29.                 DCD     PWRWU_IRQHandler
  30.                 DCD     ADC_IRQHandler
  31.                 DCD     Default_Handler  
  32.                 DCD     RTC_IRQHandler  

本来就是
  1. UART02_IRQHandler
呀,哈哈
xyz549040622 发表于 2014-2-25 11:10 | 显示全部楼层
xyz549040622 发表于 2014-2-25 11:09
官网下载即可,至于你说的这个名字问题

本来就是呀,哈哈

你在库函数里面找例程就可以啦
 楼主| stul海盗 发表于 2014-2-25 11:37 | 显示全部楼层
xyz549040622 发表于 2014-2-25 11:10
你在库函数里面找例程就可以啦

官网没有啊,我怎么没找到,话说那个中断服务程序名字把我搞死了,折腾了两天
 楼主| stul海盗 发表于 2014-2-25 11:43 | 显示全部楼层
就这几个例程啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| stul海盗 发表于 2014-2-25 11:44 | 显示全部楼层
xyz549040622 发表于 2014-2-25 11:10
你在库函数里面找例程就可以啦

帮我看看啊,拜托了
xyz549040622 发表于 2014-2-25 11:45 | 显示全部楼层
是呀,有这些就够了
wxz910 发表于 2014-2-25 12:41 | 显示全部楼层
:D看看
 楼主| stul海盗 发表于 2014-2-25 20:01 | 显示全部楼层
xyz549040622 发表于 2014-2-25 11:45
是呀,有这些就够了

好吧,我搞定了,底层把寄存器锁了,在初始化里面再设置时钟根本不起作用,还是谢谢你
 楼主| stul海盗 发表于 2014-2-25 20:06 | 显示全部楼层
我发一下自己的代码,让后来的同学不要走那么多弯路
UNLOCKREG();

SYSCLK->CLKSEL1.TMR0_S=TMR_XTL12M;                     //TIMER0Ñ¡Ôñ12M×÷ΪʱÖÓÔ´
   SYSCLK->APBCLK.TMR0_EN=1;                              //ʹÄÜTIMER0µÄʱÖÓ

   SYSCLK->CLKSEL1.UART_S=UART_XTL12M;                       //UARTÑ¡ÔñPLLʱÖÓ×öΪʱÖÓÔ´
   SYSCLK->CLKDIV.UART_N=0;                               //UARTʱÖÓ²»·ÖƵ
   SYSCLK->APBCLK.UART0_EN=1;                             //ʹÄÜUART0µÄʱÖÓ
LOCKREG();   

一定要打开寄存器保护再设置时钟
xyz549040622 发表于 2014-2-25 20:26 | 显示全部楼层
stul海盗 发表于 2014-2-25 20:06
我发一下自己的代码,让后来的同学不要走那么多弯路
UNLOCKREG();

我晕,和我调试的时候碰到的问题一样。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

40

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

10

主题

40

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部