6

我尝试实现 USART 通信。所以我将我的 STM32f1 的 RX 与他的 TX 连接起来。我还为这种通信编写了一个程序。此代码由以下组件组成:

  1. 碾压混凝土配置
  2. GPIO配置
  3. USART 配置
  4. 发送和接收字符串
  5. 发送字符串与接收字符串的比较
  6. 测试通讯是否成功 => LED4 亮,否则 LED3 亮

问题是在所有情况下 LED3 都会亮起。这意味着数据传输失败。

使用我的 IDE(IAR 的嵌入式工作台)我编译这个程序代码:

/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"
#include "stm32_eval.h"


/* Private typedef -----------------------------------------------------------*/
typedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;

/* Private define ------------------------------------------------------------*/
#define USARTy                   USART1
#define USARTy_GPIO              GPIOA /* PORT name*/
#define USARTy_CLK               RCC_APB2Periph_USART1
#define USARTy_GPIO_CLK          RCC_APB2Periph_GPIOA
#define USARTy_RxPin             GPIO_Pin_10/* pin Rx name*/ 
#define USARTy_TxPin             GPIO_Pin_9 /* pin Tx name*/

#define USARTz                   USART2
#define USARTz_GPIO              GPIOA/* PORT name*/
#define USARTz_CLK               RCC_APB1Periph_USART2
#define USARTz_GPIO_CLK          RCC_APB2Periph_GPIOA
#define USARTz_RxPin             GPIO_Pin_3/* pin Rx name*/
#define USARTz_TxPin             GPIO_Pin_2/* pin Tx name*/

#define TxBufferSize   (countof(TxBuffer))

/* Private macro -------------------------------------------------------------*/
#define countof(a)   (sizeof(a) / sizeof(*(a)))

/* Private variables ---------------------------------------------------------*/
USART_InitTypeDef USART_InitStructure;
uint8_t TxBuffer[] = "Bufferrr";
uint8_t RxBuffer[8];
__IO uint8_t TxConteur = 0, RxConteur = 0;
volatile TestStatus TransferStatus = FAILED;  

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
__IO uint8_t index = 0;

GPIO_InitTypeDef GPIO_InitStructure;

int main(void)
{
  STM_EVAL_LEDInit(LED1);
  STM_EVAL_LEDInit(LED2);
  STM_EVAL_LEDInit(LED3);
  STM_EVAL_LEDInit(LED4);

/* System Clocks Configuration */
 RCC_Configuration();
/* Configure the GPIO ports */
GPIO_Configuration();

USART_InitStructure.USART_BaudRate = 230400 /*115200*/; 
  USART_InitStructure.USART_WordLength =USART_WordLength_8b ;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  /* Configure USARTy */
  USART_Init(USART1,&USART_InitStructure);

  /* Enable the USARTy */
  USART_Cmd(USART1,ENABLE);

  while(TxConteur < TxBufferSize)
  {  
    /* Send one byte from USARTy to USARTz */
     USART_SendData(USARTy, TxBuffer[TxConteur++]);
    /* Loop until USARTy DR register is empty */ 
    while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
    {
    }
    /* Store the received byte in RxBuffer */
    RxBuffer[RxConteur++] = USART_ReceiveData(USARTy) & 0xFF;
  }  

  /* Check the received data with the send ones */
  TransferStatus = Buffercmp(TxBuffer, RxBuffer, TxBufferSize);
  /* TransferStatus = FAILED, if the data transmitted from USARTy and 
     received by USARTz are different */
  if (TransferStatus == FAILED)
  {
      STM_EVAL_LEDOn(LED3);

  }
  else 
  {

   STM_EVAL_LEDOn(LED4);
  }

  while (1)
  {
  }
}

void RCC_Configuration(void)
{    

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 , ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);
}

void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure1,GPIO_InitStructure2;

  /* Configure USARTy Rx as input floating */
  GPIO_InitStructure1.GPIO_Pin =GPIO_Pin_10;
  GPIO_InitStructure1.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure1.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA, &GPIO_InitStructure1);

  /* Configure USARTy Tx as alternate function push-pull */
  GPIO_InitStructure2.GPIO_Pin =GPIO_Pin_9;
  GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure2);
  /* Configure USARTz Tx as alternate function push-pull */


}


TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
{
  while(BufferLength--)
  {
    if(*pBuffer1 != *pBuffer2)
    {
      return FAILED;
    }

    pBuffer1++;
    pBuffer2++;
  }

  return PASSED;  
}
4

1 回答 1

3

就像 Hans Passant 在评论中解释的那样,OP 正在测试标志USART_FLAG_TC(传输完成)而不是标志USART_FLAG_RXNE(RX 缓冲区非空)。

于 2013-10-26T12:43:16.667 回答