USART on STM32F4 using Arduino board
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2015-08-20 3:28 PM
NOTE: edited by moderator on Oct 6th, 2016
Hello everyone,
I just received my stm32f4 discovery board yesterday and it works well :). I managed to run a LED blinking example. I now want to display some results in a serial communication. I am trying to interface an Arduino Uno with my stm board. I found an example on the internet :[[this link/image has been flagged as malicious by our security scan software and has been deleted]]
but I am not able to make it works properly.
I put wires between TX of Arduino- PB7 and RX of Arduino - PB6. Here is my Arduino code :#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(0, 1);
void
setup() {
// initialize serial communication at 9600 bits per second:
gprsSerial.begin(9600);
Serial.begin(9600);
}
/* Loop() */
void
loop() {
// Si des données sont disponible en lecture
if
(gprsSerial.available() > 0) {
// Lecture d'un octet depuis le port série
int
c = gprsSerial.read();
Serial.println(c);}
}
When I click on the reset button of the stm board, I receive these 4 numbers on the Arduinoterminal : 255;28;0;252
I don't know how to deal with these numbers. It represents Byte but what is the relation ?
Moreover, If I change the sentence to display.
USART_puts(
''b''
);
I still have 4 numbers : 255;224;0;252
Do you know what it means ? Normally, I should receive more numbers for the sentence than the char. Thank you very much for your help.- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2015-08-23 11:54 AM
NOTE: edited by moderator on Oct 6th, 2016
I have modified the way I dot it. I linked the pin Reset with the Ground of the Arduino board. So I directly receive the data from the STM32 without writing any code on the Arduino board. But it still doesn't work ... I use this terminal application :
https://sites.google.com/site/terminalbpp/
Here is my code :#include ''stm32f4xx.h''
#include ''stm32f4xx_gpio.h''
#include ''stm32f4xx_rcc.h''
#include ''stm32f4xx_usart.h''
#include ''misc.h''
inline
void
Delay(__IO uint32_t nCount);
void
UART_Initialize(
void
);
void
GPIOInitialize(
void
);
void
NVICInitialize(
void
);
void
USART_puts( volatile
char
*s);
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
int
main(
void
)
{
GPIOInitialize();
UART_Initialize();
NVICInitialize();
//USART_puts(''B'');
while
(1) {
/* Variable gérant le ''spinner'' */
unsigned
char
spin = 1;
/* Boucle infini */
for
(;;) {
/* Lecture de l'état du bouton, si appuyé on entre dans le if */
if
(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0)) {
USART_SendData(USART1, 'A');
/* ''Ecrit'' les états des led en fonction du spinner (4 bits) */
GPIO_WriteBit(GPIOD, GPIO_Pin_12, (spin & 1) ? 1 : 0);
// LSB
GPIO_WriteBit(GPIOD, GPIO_Pin_13, (spin & 2) ? 1 : 0);
//
GPIO_WriteBit(GPIOD, GPIO_Pin_14, (spin & 4) ? 1 : 0);
//
GPIO_WriteBit(GPIOD, GPIO_Pin_15, (spin & 8) ? 1 : 0);
// MSB
/* Delai (~1sec en gros) */
Delay(0x3FFFFF);
/* Rotation du ''spinner'' d'un cran */
spin = (spin << 1) & 0x0f;
/* Si le ''spinner'' a dépassé la valeur max : retour au début */
if
(spin == 0)
spin = 1;
}
}
}
}
/* Fonction de delai (trés grossiére) */
void
Delay(__IO uint32_t nCount) {
while
(nCount--)
;
}
void
UART_Initialize(
void
)
{
/* Enable peripheral clock for USART1 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
/* USART1 configured as follow:
* BaudRate 9600 baud
* Word Length 8 Bits
* 1 Stop Bit
* No parity
* Hardware flow control disabled
* 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(USART1, &USART_InitStructure);
// USART configuration
USART_Cmd(USART1, ENABLE);
// Enable USART
}
void
GPIOInitialize(
void
)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
//Enable clock for GPIOB
/* Structure permettant de stocker la configuration d'une ou plusieurs broches */
GPIO_InitTypeDef GPIO_InitStructure;
/* Mise en marche des horloge gérant les ports D (led) et A (bouton) */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
// Led
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// Button
/* Configuration de LED3, LED4, LED5, LED6 en sortie de type ''pushpull'' (mode classique) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
// LED3, LED4, LED5, LED6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
// Broches en sortie
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
// Mode PushPull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// Fréquence de commutation maximum
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
// Pas de résistance de pull-up / pull-down
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* USART1 Tx on PB6 | Rx on PB7 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_USART1);
//Connect PB6 to USART1_Tx
GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_USART1);
//Connect PB7 to USART1_Rx
/* Configuration du bouton ''User'' en entrée de type ''pushpull'' (mode classique) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
// Bouton ''User''
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
// Broches en entrée
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
// Mode PushPull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// Fréquence de commutation maximum
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
// Pas de résistance de pull-up / pull-down
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void
NVICInitialize(
void
)
{
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
}
/*void
USART_puts(volatile
char
*s){
while
(*s){
// wait until data register is empty
while
( !(USART1->SR & 0x00000040) );
USART_SendData(USART1, *s);
*s++;
}
}*/
#ifdef USE_FULL_ASSERT
void
assert_failed(uint8_t* file, uint32_t line)
{
while
(1)
{}
}
#endif
I am receiving these characters on the terminal : <0>ü I tried to change the sending characters but I still receive these kinds of characters : à , û, ü, <0>... All the parameters seem to be corrects. Do you have an idea ofhow to solve this problem ? There is something which is surprising. IfI connect PB6 ( Tx of STM32) to Rx of Arduino board, I receive nothing on the terminal. i have to connect PB6 to TX of Arduino to make It works... Thank you in advance for your help.
________________
Attachments : Terminal.png : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006I0bn&d=%2Fa%2F0X0000000bbA%2FncDuLsE36UDUPsZk6lD2uBMuXLROR2o2Wp5G9JX3paU&asPdf=false
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content
‎2015-08-23 1:27 PM
NOTE: edited by moderator on Oct 6th, 2016
The serial outputs from the STM32 are CMOS levels, RS232 compatible ones.
The STM32F4-DISCO uses an 8 MHz clock source, not a 25 MHz one, make sure the PLL settings are for the right clock source, and that the HSE_VALUE define matches the clock being used. Makes sure to check TXE before writing data to the port, and check RXNE before reading.Up vote any posts that you find helpful, it shows what's working..
