How to use STM3. Nucleo serial port. As we have seen in the previous tutorial about this new developing board from ST, the STM3. ThirdParty Tool Categories. Microchips thirdparty tools and providers offer a diverse range of embeddeddesign development boards and software that compliment. One of the tools we use most when debugging our projects is serial inputoutput. Serial is very easy to implement, and it allows you to sendreceive any data you need. Nucleo provides an integrated ST Link v. ST Link is mainly designed to allow flashing of target MCU trough the mini USB interface. But, it provides at least another really useful feature a Virtual COM port. When you install the ST Link drivers, a new device appears in your hardware devices list the ST Link Virtual COM port. If you use a Linux PC or a Mac, youll find a new terminal in the dev directory. Usually, this device is named something similar to tty. XXXX, as shown below. The serial port is mostly useful for two reasons if you want to debug your firmware printing messages not strictly necessary with the ARM architecture, since we can also use ARM semihosting or if you want to exchange commands and messages between your Nucleo board and your PC perhaps, using a dedicated application you are building. In this post Ill show you how to properly configure and use the integrated virtual COM port of STM3. Nucleo board. But, before we start coding, it could be really useful take a look to the hardware. ST provides the full hardware project of the STM3. Nucleo the board is designed using the Altium Designer CAD, a professional CAD used in the electronics industry, but you are not required to have a so expensive piece of software to use your Nucleo. Ill assume the Nucleo F4. RE model, but it should be really easy to rearrange instructions to properly use your specific Nucleo. First pinout. A complex yet flexible MCU like the STM3. IOs that have overloaded functionalities. This means that, before we can use a peripheral in our case, the USART, we need to configure the peripherals associated to corresponding pins. Looking to STM3. 2Cube. MX tool, we discover that the STM3. F4. 01. RETx processor has 3 different USARTs USART1, USART2 and USART6. Now we have to take a look to the Nucleo schematics. As we can see in the following picture, the USARTTX and USARTRX ports are connected to PA2 and PA3 pins. Raspberry Pi Serial Port Uarts' title='Raspberry Pi Serial Port Uarts' />This means that the Nucleo board is configured to use the USART2 peripheral of target MCU. Ok. Weve grabbed all the necessary information related to the hardware needed to start coding. Second the code. Before we start configuring the USART2 peripheral, we need a test project. Well generate an empty project using the GCC ARM Eclipse plug in, as shown in my series about the GCC toolchain for the STM3. When you generate the test project, you can using the following configuration parameters. If you have followed my previous tutorial about GNU Eclipse plug in, you already know that the plug ins generates an incorrect clock configuration for the Nucleo F4 board. Ive shown how to use the STM3. Cube. MX tool to generate the right clock initialization code. For the sake of simplicity, this is the code you have to put inside the initializehardware. RCCOsc. Init. Type. Def RCCOsc. Init. Struct. RCCClk. Init. Type. Def RCCClk. Init. Struct. PWRCLKENABLE. HALPWRVOLTAGESCALINGCONFIGPWRREGULATORVOLTAGESCALE2. RCCOsc. Init. Struct. Oscillator. Type RCCOSCILLATORTYPEHSI. RCCOsc. Init. Struct. HSIState RCCHSION. RCCOsc. Init. Struct. HSICalibration. Value 6. RCCOsc. Init. Struct. PLL. PLLState RCCPLLON. RCCOsc. Init. Struct. PLL. PLLSource RCCPLLSOURCEHSI. RCCOsc. Init. Struct. PLL. PLLM 1. 6. RCCOsc. Init. Struct. PLL. PLLN 3. 36. RCCOsc. Init. Struct. PLL. PLLP RCCPLLPDIV4. RCCOsc. Init. Struct. PLL. PLLQ 7. HALRCCOsc. Config RCCOsc. Init. Struct. RCCClk. Init. Struct. Clock. Type RCCCLOCKTYPESYSCLKRCCCLOCKTYPEPCLK1. RCCClk. Init. Struct. SYSCLKSource RCCSYSCLKSOURCEPLLCLK. RCCClk. Init. Struct. AHBCLKDivider RCCSYSCLKDIV1. RCCClk. Init. Struct. APB1. CLKDivider RCCHCLKDIV2. RCCClk. Init. Struct. APB2. CLKDivider RCCHCLKDIV1. HALRCCClock. Config RCCClk. Init. Struct, FLASHLATENCY2. RCCOsc. Init. Type. Def RCCOsc. Init. Struct RCCClk. Init. Type. Def RCCClk. Init. Struct PWRCLKENABLE HALPWRVOLTAGESCALINGCONFIGPWRREGULATORVOLTAGESCALE2 RCCOsc. Init. Struct. Oscillator. TypeRCCOSCILLATORTYPEHSI RCCOsc. Init. Struct. HSIStateRCCHSION RCCOsc. Init. Struct. HSICalibration. Value6 RCCOsc. Init. Struct. PLL. PLLStateRCCPLLON RCCOsc. Init. Struct. PLL. PLLSourceRCCPLLSOURCEHSI RCCOsc. Daz Poser Mrl Aislinn Miller. Init. Struct. PLL. PLLM1. 6 RCCOsc. Init. Struct. PLL. PLLN3. RCCOsc. Init. Struct. PLL. PLLPRCCPLLPDIV4 RCCOsc. Init. Struct. PLL. PLLQ7 HALRCCOsc. Config RCCOsc. Init. Struct RCCClk. Init. Struct. Clock. TypeRCCCLOCKTYPESYSCLKRCCCLOCKTYPEPCLK1 RCCClk. Init. Struct. SYSCLKSourceRCCSYSCLKSOURCEPLLCLK RCCClk. Init. Struct. AHBCLKDividerRCCSYSCLKDIV1 RCCClk. Init. Struct. APB1. CLKDividerRCCHCLKDIV2 RCCClk. Init. Struct. APB2. CLKDividerRCCHCLKDIV1 HALRCCClock. Config RCCClk. Init. Struct,FLASHLATENCY2. Next, we have to add a function to configure the USART interface. We call it MXUSART2UARTInit, as shown below. UARTHandle. Type. Def huart. 2. void MXUSART2UARTInitvoid. Instance USART2. Init. Baud. Rate 1. Init. Word. Length UARTWORDLENGTH8. B. huart. 2. Init. Stop. Bits UARTSTOPBITS1. Init. Parity UARTPARITYNONE. Init. Mode UARTMODETXRX. Init. Hw. Flow. Ctl UARTHWCONTROLNONE. HALUARTInit huart. UARTHandle. Type. Def huart. 2. void. MXUSART2UARTInitvoidhuart. InstanceUSART2 huart. Init. Baud. Rate1. Init. Word. LengthUARTWORDLENGTH8. B huart. 2. Init. Stop. BitsUARTSTOPBITS1 huart. Init. ParityUARTPARITYNONE huart. Init. ModeUARTMODETXRX huart. Init. Hw. Flow. CtlUARTHWCONTROLNONE HALUARTInit huart. The function is really self explaining. UARTHandle. Type. Def descriptor. Its a struct used to configure the UART peripheral. However, this code is still not sufficient to use the UART. We need to configure the hardware part, setting the right pins and initializing the right clocks associated to UART peripheral. This work is done with the following hook function. HALUARTMsp. InitUARTHandle. Type. Def huart. GPIOInit. Type. Def GPIOInit. Struct. ifhuart InstanceUSART2. GPIOACLKENABLE. USART2CLKENABLE. USART2 GPIO Configuration. PA2 USART2TX. PA3 USART2RX. GPIOInit. Struct. Pin GPIOPIN2GPIOPIN3. GPIOInit. Struct. Mode GPIOMODEAFPP. GPIOInit. Struct. Pull GPIONOPULL. GPIOInit. Struct. Speed GPIOSPEEDLOW. GPIOInit. Struct. Alternate GPIOAF7USART2. HALGPIOInitGPIOA, GPIOInit. Struct. 1. 23. HALUARTMsp. InitUARTHandle. Type. Defuart GPIOInit. Type. Def GPIOInit. Struct ifhuart InstanceUSART2 GPIOACLKENABLE USART2CLKENABLE USART2 GPIO Configuration PA2 USART2TX PA3 USART2RX GPIOInit. Struct. PinGPIOPIN2GPIOPIN3 GPIOInit. Struct. ModeGPIOMODEAFPP GPIOInit. Struct. PullGPIONOPULL GPIOInit. Struct. SpeedGPIOSPEEDLOW GPIOInit. Struct. AlternateGPIOAF7USART2 HALGPIOInitGPIOA, GPIOInit. Struct . Even in this case, the code is really self explaining. First, we need to initialize peripheral clock for PORTA GPIOs. Next, we need to enable the clock associated to UART2 peripheral. Finally, we have to proper configure PIN2 e PIN3 as UART2 TX and UART2 RX. An important aspect to remark is that we dont need to explicit call this function in the initialization section. This is an hook function automatically called by the HALUARTInit function which we call inside the function MXUSART2UARTInit. The right place to call this initialization function is inside the initializehardware function in the initializehardware. Ok. Now we only need to write a simple main function to test the UART. Hello Nucleo Funnr. HALUARTTransmit huart. FFFF. intmainintargc,charrgv charsgHello Nucleo Funnr HALUARTTransmit huart.