打印
[Cortex-M0技术交流]

谁能帮我看看这个代码问题出哪里了

[复制链接]
1790|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
-------------------------------------------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 | 只看该作者
官网有代码的,测试完美通过

使用特权

评论回复
5
stul海盗|  楼主 | 2014-2-25 10:57 | 只看该作者
xyz549040622 发表于 2014-2-25 10:21
官网有代码的,测试完美通过

真的假的,是哪个包的

使用特权

评论回复
6
stul海盗|  楼主 | 2014-2-25 10:58 | 只看该作者
xyz549040622 发表于 2014-2-25 10:21
官网有代码的,测试完美通过

能放出来看看嘛,是120的吗,我发现void UART0_IRQHandler(void);函数根本进不了中断,必须是void UART02_IRQHandler(void)

使用特权

评论回复
7
xyz549040622| | 2014-2-25 11:09 | 只看该作者
stul海盗 发表于 2014-2-25 10:58
能放出来看看嘛,是120的吗,我发现void UART0_IRQHandler(void);函数根本进不了中断,必须是void UART0 ...

官网下载即可,至于你说的这个名字问题
              DCD     BOD_IRQHandler  
                DCD     WDT_IRQHandler  
                DCD     EINT0_IRQHandler
                DCD     EINT1_IRQHandler
                DCD     GPAB_IRQHandler
                DCD     GPCDE_IRQHandler
                DCD     PWMA_IRQHandler
                DCD     PWMB_IRQHandler
                DCD     TMR0_IRQHandler
                DCD     TMR1_IRQHandler
                DCD     TMR2_IRQHandler
                DCD     TMR3_IRQHandler
                DCD     UART02_IRQHandler
                DCD     UART1_IRQHandler
                DCD     SPI0_IRQHandler
                DCD     SPI1_IRQHandler
                DCD     SPI2_IRQHandler
                DCD     SPI3_IRQHandler
                DCD     I2C0_IRQHandler
                DCD     I2C1_IRQHandler
                DCD     CAN0_IRQHandler
                DCD     Default_Handler
                DCD     Default_Handler
                DCD     USBD_IRQHandler  
                DCD     PS2_IRQHandler  
                DCD     ACMP_IRQHandler
                DCD     PDMA_IRQHandler
                DCD     I2S_IRQHandler
                DCD     PWRWU_IRQHandler
                DCD     ADC_IRQHandler
                DCD     Default_Handler  
                DCD     RTC_IRQHandler  

本来就是
 UART02_IRQHandler
呀,哈哈

使用特权

评论回复
8
xyz549040622| | 2014-2-25 11:10 | 只看该作者
xyz549040622 发表于 2014-2-25 11:09
官网下载即可,至于你说的这个名字问题

本来就是呀,哈哈

你在库函数里面找例程就可以啦

使用特权

评论回复
9
stul海盗|  楼主 | 2014-2-25 11:37 | 只看该作者
xyz549040622 发表于 2014-2-25 11:10
你在库函数里面找例程就可以啦

官网没有啊,我怎么没找到,话说那个中断服务程序名字把我搞死了,折腾了两天

使用特权

评论回复
10
stul海盗|  楼主 | 2014-2-25 11:43 | 只看该作者
就这几个例程啊

QQ图片20140225114012.jpg (41.94 KB )

QQ图片20140225114012.jpg

使用特权

评论回复
11
stul海盗|  楼主 | 2014-2-25 11:44 | 只看该作者
xyz549040622 发表于 2014-2-25 11:10
你在库函数里面找例程就可以啦

帮我看看啊,拜托了

使用特权

评论回复
12
xyz549040622| | 2014-2-25 11:45 | 只看该作者
是呀,有这些就够了

使用特权

评论回复
13
wxz910| | 2014-2-25 12:41 | 只看该作者
:D看看

使用特权

评论回复
14
stul海盗|  楼主 | 2014-2-25 20:01 | 只看该作者
xyz549040622 发表于 2014-2-25 11:45
是呀,有这些就够了

好吧,我搞定了,底层把寄存器锁了,在初始化里面再设置时钟根本不起作用,还是谢谢你

使用特权

评论回复
15
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();   

一定要打开寄存器保护再设置时钟

使用特权

评论回复
16
xyz549040622| | 2014-2-25 20:26 | 只看该作者
stul海盗 发表于 2014-2-25 20:06
我发一下自己的代码,让后来的同学不要走那么多弯路
UNLOCKREG();

我晕,和我调试的时候碰到的问题一样。。。

使用特权

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

本版积分规则

10

主题

40

帖子

0

粉丝