1

STM32f1 マイクロコントローラを SIM20 モジュールと通信させようとしています。すべてのハードウェア設定が適切に行われていることを願っています。ソフトウェアといえば、私の C プログラムは次のコンポーネントで構成されています。

  1. RCC 構成
  2. GPIO 構成
  3. USART構成
  4. 文字列「AT+SRDFIRM」の送信
  5. 受信バッファをファイル「test.txt」に格納
  6. LED3をオンにする

ただし、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++;
  }
4

1 に答える 1

0

いくつかの注意事項:

  • UART はリセットされていますか?

STM32 がデフォルトで UART をリセットしたままにしておく場合、私は思い出すことはありません。クロックを有効にしますが、明示的にリセットを解除しません。まだリセットされている場合、RXNE フラグが設定されるのを待ってスピンすると、常にリセットとして読み取られる可能性があります。これにより実行が停止し、LED が有効になりません。

  • データレジスタの状態を確認しますUSART_SendDataか?USART_ReceiveData

これらの関数がデータ レジスタの状態をチェックしない場合、送信が正しく行われていない可能性があります。115200 で文字を送信するのに 80 マイクロ秒かかります。DR への最初の書き込みはすぐにシフト レジスタにロードされ、DR への 2 番目の書き込みは保持されますが、その後のUSART_SendData送信試行で DR ステータスがチェックされない限り、以前にロードされたバイトを踏みつけます。送信された最終結果は、シリアル ライン上に として出力される可能性がありますAM

同様にUSART_ReceiveData、次のバイトが来るまで同じバイトの繰り返しで受信バッファがいっぱいになる可能性があります (ただし、値が読み取られた後に STM32 が DR をクリアする場合があります)。

  • ファイル。どのコンパイラとランタイムを使用していますか?

これはあなたのmain()関数なので、起動時に何が初期化されているかがわかります。ファイルシステムの初期化が見られません。ランタイムによっては、メインの前に発生する可能性があります。これを構築するために使用しているツールは何ですか?また、ファイル アクセスをサポートしていますか? IAR のランタイムが標準のファイル呼び出しをサポートしていることは知っていますが、低レベルの関数を実装しない限り、デフォルトでは失敗が返されます。ファイルが正常に開かれたことを確認しておらず、書き込みfprintfがクラッシュしている可能性があります。

ランタイムがファイル アクセスをサポートし、呼び出しで意味のある処理を行うことを確認し、ファイル呼び出しにエラー チェックを追加します。

于 2013-10-18T17:41:55.750 に答える