2013-01-01 67 views
1

我正在嘗試使STM32f1微控制器與SIM20模塊進行通信。 我希望所有的硬件設置都做得很好。該軟件的 說起,我的C程序是由以下幾個部分組成:STM32微控制器和SIM20模塊與USART設備之間的通信

  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++; 
    } 
+0

這可能更適合http://electronics.stackexchange.com。 –

+1

TL; DR。問題位於哪條線上?不會通讀所有這些試圖瞭解哪個部分做什麼。 – 2013-01-01 20:05:42

+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可能會崩潰。

確保您的運行時支持文件訪問並對調用執行一些有意義的操作,併爲您的文件調用添加錯誤檢查。