====== Lab03 - Nucleo Echo ======
* Download sources for a sample project for NUCLEOF401RE {{courses:be5b99cpl:labs:01stm32f401.tar.gz|}}
* Get familiar with the project in OpenSTM32 System Workbench
* Compile and upload the project into the embedded board
* Find the appropriate device (serial line) to receive data - use cat commnad to receive the data
* Write a program which will open the communication device and prints the data sent from Nucleo
* Get familiar with HomeWork 02
===== OpenSTM32 System Workbench =====
The development environment is available in ''/usr/local/Ac6/SystemWorkbench'' and then to start it write ''./eclipse'' . The details about the environment are available at [[http://www.openstm32.org]]
cd /usr/local/Ac6/SystemWorkbench
./eclipse
===== Lab submission =====
Show to the lab instructor you can:
* Compile the project
* Transmit the data from NUCLEO to PC (known serial interface)
===== NUCLEO Test Code =====
This is the code from {{courses:be5b99cpl:labs:01stm32f401.tar.gz|}} main.c which initialize the HW and allows to send a string from NUCLEO to PC.
//
// ******************************************************************************
// @file main.c
// @author CPL (Pavel Paces, based on STM examples)
// @version V0.0
// @date 01-October-2016
// @brief Serial line over ST-Link example
// Nucleo STM32F401RE USART2 (Tx PA.2, Rx PA.3)
//
// ******************************************************************************
//
#include "stm32f4xx.h"
// *******************************************************************************
//
// @brief Enable MCU internal connections to USART and GPIO
//
void RCC_Configuration(void)
{
// --- System Clocks Configuration
// USART2 clock enable
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
// GPIOA clock enable
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
} // END void RCC_Configuration(void)
// *******************************************************************************
//
// @brief Input/output pins configuration
//
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// GPIO Configuration
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; // PA.2 USART2_TX, PA.3 USART2_RX
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_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// Alternative Functions: Connect USART pins to AF
GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2);
} // END void GPIO_Configuration(void)
// *******************************************************************************
//
// @brief Baud rate settings
//
void USART2_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
// USARTx configuration
// - BaudRate = 115200 baud
// - Word Length = 8 Bits
// - One Stop Bit
// - No parity
// - Hardware flow control disabled (RTS and CTS signals)
// - Receive and transmit enabled
USART_InitStructure.USART_BaudRate = (9600)*3;
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(USART2, &USART_InitStructure);
USART_Cmd(USART2, ENABLE);
} // END void USART2_Configuration(void)
// *******************************************************************************
//
// @brief The function sends characters until 0
//
void OutString(char *s)
{
while(*s)
{
// Wait for Tx Empty
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
// Send Char
USART_SendData(USART2, *s++);
} // END while
} // END void OutString(char *s)
// *******************************************************************************
//
// @brief Main loop
//
int main(void)
{
// Init
RCC_Configuration();
GPIO_Configuration();
USART2_Configuration();
// Process
OutString("Welcome to Nucleo F401RE\r\n");
while(1) // Don't want to exit
{
uint16_t Data;
while(USART_GetFlagStatus(USART2, USART_FLAG_RXNE) == RESET); // Wait for Char
Data = USART_ReceiveData(USART2); // Collect Char
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // Wait for Empty
OutString("Welcome to Nucleo F401RE\r\n");
USART_SendData(USART2, Data); // Echo Char
OutString("\n");
} // END while(1)
} // END main
// *******************************************************************************
#ifdef USE_FULL_ASSERT
/**
* @brief Reports the name of the source file and the source line number
* where the assert_param error has occurred.
* @param file: pointer to the source file name
* @param line: assert_param error line source number
* @retval None
*/
void assert_failed(uint8_t* file, uint32_t line)
{
/* User can add his own implementation to report the file name and line number,
ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
while (1)
{}
}
#endif