STM32微控制器与带有UART设备的SIM20模块之间的通信

时间:2013-01-01 19:55:56

标签: c embedded stm32

我正在尝试让STM32f1微控制器与SIM20模块通信。 我希望所有硬件设置都做得很好。 说到软件,我的C程序由以下组件组成:

  1. RCC配置
  2. GPIO配置
  3. USART配置
  4. 发送字符串“AT + SRDFIRM”
  5. 将收到的缓冲区存储在文件“test.txt”
  6. 打开LED3
  7. 然而,SIM20没有收到任何信息。文件中没有存储任何内容,LED3也没有打开。

    我的C代码如下:

    /* Includes ------------------------------------------------------------------*/
    #include "stm32f10x.h"
    #include "stm32_eval.h"
    #include <stdio.h>
    #include <stdlib.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[] = "AT+SRDFIRM";
    uint8_t RxBuffer[TxBufferSize];
    __IO uint8_t TxConteur = 0, RxConteur = 0;
    uint8_t Bin[16];
    /* Private function prototypes -----------------------------------------------*/
    void RCC_Configuration(void);
    void GPIO_Configuration(void);
    void Delay(__IO uint32_t);
    TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength);
    __IO uint8_t index = 0;
    volatile TestStatus TransferStatus = FAILED;  
    
    GPIO_InitTypeDef GPIO_InitStructure;
    
    int main(void)
    {
      STM_EVAL_LEDInit(LED1);
      STM_EVAL_LEDInit(LED2);
      STM_EVAL_LEDInit(LED3);
      STM_EVAL_LEDInit(LED4);
        int i;
      /*TxBuffer[0] = 'B';
      RxBuffer[0] ='\0';*/
    
    /* System Clocks Configuration */
     RCC_Configuration();
    /* Configure the GPIO ports */
    GPIO_Configuration();
    
    USART_InitStructure.USART_BaudRate = 115200;      // configuration vitesse
    USART_InitStructure.USART_WordLength = USART_WordLength_8b; // configuration longueur mot
    USART_InitStructure.USART_StopBits = USART_StopBits_1;  // bit de stop
    USART_InitStructure.USART_Parity = USART_Parity_No; // bit de parite
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // hardware control
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // half duplex
    
      /* Configure USARTy */
      USART_Init(USART1,&USART_InitStructure);
    
      /* Enable the USARTy */
      USART_Cmd(USART1,ENABLE);
      uint16_t reciv;
    
        /*********************************************************/
            FILE* fichier = NULL; 
             fichier = fopen("test.txt", "w");
        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_RXNE) == RESET);
    
          while(TxConteur < TxBufferSize)
      { 
        RxBuffer[RxConteur] = USART_ReceiveData(USARTy) & 0xFF;
        RxConteur++;
      }
    
       fprintf(fichier,"%s","RxBuffer");  
      fclose(fichier); // On ferme le fichier qui a été ouvert
       TransferStatus = Buffercmp(TxBuffer, RxBuffer, TxBufferSize);
     STM_EVAL_LEDOn(LED3);
    
      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); 
    }
    
    
    TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint16_t BufferLength)
    {
      while(BufferLength--)
      {
        if(*pBuffer1 != *pBuffer2)
        {
          return FAILED;
        }
    
        pBuffer1++;
        pBuffer2++;
      }
    
      return PASSED;  
    }
    

    @ H2CO3:这是包含问题的程序的一部分:

     while(TxConteur < TxBufferSize-1)
      {  
        /* Send one byte from USARTy to USARTz */
          USART_SendData(USARTy, TxBuffer[TxConteur++]);
        while(USART_GetFlagStatus(USART1, USART_FLAG_IDLE) == RESET);
      } 
    RxConteur=0;
        /* Store the received byte in RxBuffer */
          while(RxConteur < TxBufferSize-1)
      { 
        RxBuffer[RxConteur] = USART_ReceiveData(USARTy) & 0xFF;
        RxConteur++;
      }
    

1 个答案:

答案 0 :(得分:0)

要注意的一些事项:

  • UART是否处于重置状态?

如果STM32默认情况下UART处于复位状态,我不记得了。您启用时钟,但不要明确地将其从复位中取出。如果它仍处于复位状态,那么当您旋转等待RXNE标志置位时,它可能始终读为复位。这将停止执行,您将无法启用LED。

  • 执行USART_SendDataUSART_ReceiveData检查数据寄存器的状态吗?

如果这些功能没有检查数据寄存器的状态,那么您的传输可能无法正常传输。在115200传输一个字符需要80微秒。对DR的第一次写入将快速加载到移位寄存器中,第二次写入DR将被保留,但除非在USART_SendData中检查DR状态。进一步尝试发送将踩踏前面加载的字节。传输的最终结果可能会出现在串行线上AM

类似地,USART_ReceiveData可能会填充接收缓冲区并重复相同的字节,直到下一个字节进入(尽管STM32可能会在读取值后清除DR)。

  • 文件。你使用什么编译器和运行时?

由于这是您的main()函数,我们可以看到启动时正在初始化的内容。我没有看到文件系统的任何初始化。它可能在main之前发生,具体取决于运行时。您使用什么工具来构建它并支持文件访问?我知道IAR的运行时支持标准文件调用,但默认情况下它们将返回失败,除非您实现低级函数。您没有检查文件是否已成功打开,并且fprintf的写入可能会崩溃。

确保您的运行时支持文件访问并对调用执行一些有意义的操作,并将错误检查添加到文件调用中。