2012-03-13 09:23 AM
'morning every body
I need a little help to write an ''echo program'' (micro send anything to the uart and receives back the same transmission). does anybody have any ideas about it?? any help is VEEEEEEERY appreciate!! :) #stm32-uart-usart #echo2012-03-13 10:09 AM
// STM32 USART3 (Tx PB.10, Rx PB.11) STM32F4 Discovery - sourcer32@gmail.com
#include ''stm32f4_discovery.h''
/**************************************************************************************/
void RCC_Configuration(void)
{
/* --------------------------- System Clocks Configuration -----------------*/
/* USART3 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
/* GPIOB clock enable */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
}
/**************************************************************************************/
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*-------------------------- GPIO Configuration ----------------------------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Connect USART pins to AF */
GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_USART3);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_USART3);
}
/**************************************************************************************/
void USART3_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
/* USARTx configuration ------------------------------------------------------*/
/* USARTx configured as follow:
- BaudRate = 9600 baud
- Word Length = 8 Bits
- Two Stop Bit
- Odd parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
USART_InitStructure.USART_BaudRate = 9600;
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;
USART_Init(USART3, &USART_InitStructure);
USART_Cmd(USART3, ENABLE);
}
/**************************************************************************************/
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
USART3_Configuration();
while(1)
{
uint16_t Data;
while(USART_GetITStatus(USART3, USART_IT_RXNE) == RESET); // Wait for Char
Data = USART_ReceiveData(USART3); // Collect Char
while(USART_GetITStatus(USART3, USART_IT_TXE) == RESET); // Wait for Empty
USART_SendData(USART3, Data); // Echo Char
}
while(1); // Don't want to exit
}
Try also looking at the peripheral examples in the STM32F4 Firmware and DSP downloads.
2012-03-16 04:07 AM
2012-03-16 08:37 AM
What if i'd make the same program but using DMA?
You could certainly do that if you wish. You probably want to view the examples in the firmware library, and digest the technical manual.2012-03-19 01:10 AM
Thanks, i following your advice.
2012-03-20 08:34 AM
hi can any one help me this code seems to be right but i dont know what' the matter leds dont turn on ???
#include ''stm32f10x.h''#include ''stm32f10x_rcc.h''#include ''stm32f10x_usart.h'' #include ''stm32f10x_gpio.h''uint8_t ch;// pour USART1 PA9 et PA10, pour USART2 PA2 et PA3#define RCC_APB2Periph_GPIOx RCC_APB2Periph_GPIOA#define GPIO_Pin_Tx1 GPIO_Pin_9 // PA9 sortie#define GPIO_Pin_Rx1 GPIO_Pin_10 // PA10 entree#define GPIO_Pin_Tx2 GPIO_Pin_2 // PA2 sortie#define GPIO_Pin_Rx2 GPIO_Pin_3 // PA3 entreetypedef enum { FAILED = 0, PASSED = !FAILED} TestStatus;#define countof(a) (sizeof(a) / sizeof(*(a)))#define TxBufferSize countof(TxBuffer)GPIO_InitTypeDef GPIO_InitStructure;TestStatus TransferStatus = FAILED; ErrorStatus HSEStartUpStatus;/* Private variables ---------------------------------------------------------*/USART_InitTypeDef USART_InitStructure;u8 TxBuffer[] = ''a1a34 ceci est un essai'';u8 RxBuffer[TxBufferSize];u8 TxCounter = 0, RxCounter = 0; /* Private function prototypes -----------------------------------------------*/void RCC_Configuration(void); // configuration horloge PortA et horloge Usartvoid GPIO_Configuration(void); // configuration pattes entrees/sortiesvoid NVIC_Configuration(void); // configuration interruption (ici non utilisee)TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength);//u8 index = 0;void GPIO_Configuration(void){ GPIO_InitTypeDef GPIO_InitStructure;#ifdef USE_STM3210B_EVAL /* Enable the USARTx Pins Software Remapping */ GPIO_PinRemapConfig(GPIO_Remap_USART1, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_USART2, ENABLE);#endif /* Configure USART1 Tx (PA.09) as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_Tx1; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); // Tx USART1 en sortie push pull /* Configure led as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure USART2 Tx as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_Tx1; //PIO_Init(GPIOA, &GPIO_InitStructure); // configurer Tx USART2 en sortie push pull GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure USART1 Rx (PA.10) as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_Rx1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); // configurer Rx USART1 en entree flottante /* Configure USART2 Rx as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_Rx2; GPIO_Init(GPIOA, &GPIO_InitStructure); // configurer Rx USART2 en entree flottante}TestStatus Buffercmp(u8* pBuffer1, u8* pBuffer2, u16 BufferLength){ while(BufferLength--) { if(*pBuffer1 != *pBuffer2) { return FAILED; } pBuffer1++; pBuffer2++; } return PASSED; }int main(void){ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // autorise GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); // autorise USART1 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // autorise USART2 SystemInit(); // initialiser horloge et PLLMUL systeme et USART // GPIO_Configuration(); // configuration GPIO 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 USART1 */ USART_Init(USART1, &USART_InitStructure); // initialisation registres internes (SR et BRR) USART1 /* Configure USART2 */ USART_Init(USART2, &USART_InitStructure); // initialisation registres internes (SR et BRR) USART2 USART_Cmd(USART1, ENABLE); // autoriser USART1 a fonctionner /* Enable the USART2 */ USART_Cmd(USART2, ENABLE); // autoriser USART2 a fonctionner while(TxCounter < TxBufferSize) { /* envoyer un caractere de USART1 a USART2 */ ch=TxBuffer[TxCounter++]; if (ch=='c'){GPIO_SetBits(GPIOC,GPIO_Pin_9);}while (!(USART1->SR & USART_FLAG_TXE)); // tester si registre a decalge vide (Bit TXE) registre SRUSART1->DR = ch; // envoyer caractere pareil que USART_SendData(USART1, TxBuffer[TxCounter++]);// USART1->DR = (ch1 & (uint16_t)0x01FF); while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET) { } /* Store the received byte in RxBuffer */ RxBuffer[RxCounter++] = (USART_ReceiveData(USART2) & 0x7F); // why we must ''&'' the received value with 0x7F!!!!! if (RxBuffer[RxCounter -1]=='c'){GPIO_SetBits(GPIOC,GPIO_Pin_8);} } /* Check the received data with the send ones */ TransferStatus = Buffercmp(TxBuffer, RxBuffer, TxBufferSize); if (TransferStatus== PASSED) {GPIO_SetBits(GPIOC,GPIO_Pin_8); } } // si le contenu des deux buffers de reception et d'emission sont identiques c'est que //la communication entre port serie 1USART1 et port serie 2 USART1 s'est bien faite: PASS = 1, Failed = 02012-03-22 06:47 AM
2012-03-22 06:52 AM
2012-03-22 07:19 AM
Hi, my code isn't correct but i don't understand why, i poste my code that it describe communication between STM32F4 and UART using DMA :
I don't have the time to work through it, but the DMA_FLAG_xxIF1 and DMA_FLAG_xxIF3 nonsense doesn't seem to jive with the DMA streams you're supposedly using.
2012-06-19 12:00 AM
sorry if you found the solutions and mine goes wrong
i think in ''TCIFx and DMAy_streamx''x would be the samei mean stream no and flag no would be the same...........