打印

有经验的大侠过来帮着看下是啥意思的啊

[复制链接]
395|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tongbu2015|  楼主 | 2015-9-21 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  我在调试程序的时候,遇到下边的问题的,,调试的是利用32位CPU的UART来发送数据的,但道理说UART发送数据一直是以一个字节的往出发送的,但是现在的主CPU是32位的,采集到的数据也是双字节的,这就需要将这双字节的数据从UART发送出去的,,但道理说是需要通过移位操作的,将双字节数据分两次通过UART发送出去的,但是我看程序库中的原函数的,有些疑惑的,大家帮着解释下的吧。。
     请看下边的程序代码:
  u16 vibra_send[35]={0x5442,1,0,0};   //

    USART1_Send((u8*)vibra_send,70);
   这是发送70个字节的数据的
  

相关帖子

沙发
tongbu2015|  楼主 | 2015-9-21 20:07 | 只看该作者
然后是内部调用的函数及相关程序的:
static u8 *pUSART1_TxBuff;

void USART1_Send(u8 *buff,s16 len)
{
        //USART_Cmd(USART1, ENABLE);
        pUSART1_TxBuff=buff;
        USART1_TxCount=len;       
        USART1_SendSta=USART_SENDSTA_RUN;
        //USART_ClearITPendingBit(USART1,USART_IT_TXE);
        USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
        while(USART1_SendSta==USART_SENDSTA_RUN);
        //        PWR_EnterSLEEPMode(0,PWR_SLEEPEntry_WFI);           //
        USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   /* Disable the USART1 Transmit interrupt */
        //USART_Cmd(USART1, DISABLE);       
}

使用特权

评论回复
板凳
tongbu2015|  楼主 | 2015-9-21 20:08 | 只看该作者
下边是终端函数的:
void USART1_IRQHandler(void)
{
  static vu8 tmp;

  if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET)
  {       
                if(USART1_RecvSta!=USART_RECVSTA_RUN)
                {
                        tmp=USART_ReceiveData(USART1);
                        return;
                }
    if(USART1_RxCount>0)
                {
            *pUSART1_RxBuff++ = USART_ReceiveData(USART1);
                        USART1_RxCount--;                       
                }
                  if(USART1_RxCount<=0)
            {                              /* Disable the USART1 Receive interrupt */
               USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
                                 USART1_RecvSta=USART_RECVSTA_SUCC;
                                //USART_Cmd(USART1, DISABLE);
            }
        }
  if((USART1_SendSta==USART_SENDSTA_RUN)&&(USART_GetITStatus(USART1, USART_IT_TXE) != RESET))//if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)
  {
    if(USART1_TxCount>0)
                {
            USART_SendData(USART1, *pUSART1_TxBuff++);                    
                        USART1_TxCount--;
                        if(USART1_TxCount<=0)
            {
              /* Disable the USART1 Transmit interrupt */
              USART_ITConfig(USART1, USART_IT_TXE, DISABLE);  
                                USART1_SendSta=USART_SENDSTA_SUCC;
            }
                }     
  }       
}

注意发送数据部分的
USART_SendData(USART1, *pUSART1_TxBuff++);     

使用特权

评论回复
地板
tongbu2015|  楼主 | 2015-9-21 20:09 | 只看该作者
调用其原函数的
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data)
{
  /* Check the parameters */
  assert_param(IS_USART_ALL_PERIPH(USARTx));
  assert_param(IS_USART_DATA(Data));
   
  /* Transmit Data */
  USARTx->DR = (Data & (uint16_t)0x01FF);
}

使用特权

评论回复
5
tongbu2015|  楼主 | 2015-9-21 20:10 | 只看该作者
问题就在最后变得一个原函数的,,,看着像是发送了一个字节的数据出去了,但是实际效果是发送两个字节的数据的,这里我就比较迷惑了,,求解大家了

使用特权

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

本版积分规则

25

主题

1943

帖子

2

粉丝