USART communication avec un STM32f1xx
Je cherche à atteindre un USART de la communication. J'ai donc brancher le RX de mon STM32f1 avec son TX.
Aussi j'écris un programme pour cette communication. Ce code est composé des éléments suivants:
- RCC configuration
- GPIO configuration
- USART configuration
- D'envoyer et de recevoir d'une chaîne
- Comparaison entre les envoyés de la chaîne et de la chaîne reçue
- Test si la communication a réussi => LED4 tour sur le reste de la LED3 tour sur
Le problème est dans tous les cas, la LED3 s'allume. Cela signifie que la transmission de données a échoué.
Avec mon IDE (IAR Embedded Workbench) je compile ce code de programme:
/* 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;
}
Subminiature stylistique note: il vaut mieux ne pas le nom de votre typedefs
Les tests USART_FLAG_TC est une mauvaise idée, que seuls des tests si l'octet est transmis. Vous avez besoin de tester si un octet est reçu à la place. Utilisation USART_FLAG_RXNE
La STM "bibliothèques standard" utiliser cette appellation, c'est ... gênant, mais dur de re-faire.
Merci, bon à savoir. Eh bien, qui n'a pas été particulièrement sage décision des auteurs de la bibliothèque, alors.
J'ai remplacé USART_FLAG_TC par USART_FLAG_RXNE et il fonctionne. Merci beaucoup
TypeDef
, utilisez Context
ou quelque chose comme ça.Les tests USART_FLAG_TC est une mauvaise idée, que seuls des tests si l'octet est transmis. Vous avez besoin de tester si un octet est reçu à la place. Utilisation USART_FLAG_RXNE
La STM "bibliothèques standard" utiliser cette appellation, c'est ... gênant, mais dur de re-faire.
Merci, bon à savoir. Eh bien, qui n'a pas été particulièrement sage décision des auteurs de la bibliothèque, alors.
J'ai remplacé USART_FLAG_TC par USART_FLAG_RXNE et il fonctionne. Merci beaucoup
OriginalL'auteur Kallel Omar | 2012-12-28
Vous devez vous connecter pour publier un commentaire.
Comme expliqué dans un commentaire par Hans Passant, l'OP a été de tester le drapeau
USART_FLAG_TC
(Transmission Terminée) au lieu du drapeauUSART_FLAG_RXNE
(RX buffer n'est Pas Vide).OriginalL'auteur