{"id":3383,"date":"2025-04-12T13:27:39","date_gmt":"2025-04-12T13:27:39","guid":{"rendered":"https:\/\/blog.embeddedexpert.io\/?p=3383"},"modified":"2025-04-12T13:27:42","modified_gmt":"2025-04-12T13:27:42","slug":"building-library-for-neo-6m-gps-part-1-introduction-and-environment-setup","status":"publish","type":"post","link":"https:\/\/blog.embeddedexpert.io\/?p=3383","title":{"rendered":"Building Library for NEO-6M GPS Part 1: Introduction and Environment Setup"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-Apr-12-2025-at-04_14_56-PM-1024x683.png\" alt=\"\" class=\"wp-image-3384\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-Apr-12-2025-at-04_14_56-PM-1024x683.png 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-Apr-12-2025-at-04_14_56-PM-300x200.png 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-Apr-12-2025-at-04_14_56-PM-768x512.png 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-Apr-12-2025-at-04_14_56-PM-1150x767.png 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-Apr-12-2025-at-04_14_56-PM-750x500.png 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-Apr-12-2025-at-04_14_56-PM-400x267.png 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-Apr-12-2025-at-04_14_56-PM-250x167.png 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/ChatGPT-Image-Apr-12-2025-at-04_14_56-PM.png 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>The NEO-6M GPS module is a popular and cost-effective solution for adding location tracking to embedded systems. This guide demonstrates how to interface the NEO-6M with the STM32F411-Nucleo64 board and display GPS data on a 1602 LCD. In part one, we shall take a look at the sensor, hardware setup and STM32CubeIDE setup.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>In this guide, we shall cover the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What is GPS.<\/li>\n\n\n\n<li>NEO-6M GPS module.<\/li>\n\n\n\n<li>Hardware connection.<\/li>\n\n\n\n<li>STM32CubeIDE setup.<\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. What is GPS:<\/h2>\n\n\n\n<p>Humans have looked to the skies to find their way since ancient times. Ancient sailors used the constellations in the night sky to figure out where they were and where they were going.<\/p>\n\n\n\n<p>Today, all we need is a simple hand-held GPS (short for Global Positioning System) receiver to figure out exactly where we are anywhere in the world. But we still need objects high in the sky to figure out where we are and how we get to other places.<\/p>\n\n\n\n<p>Instead of stars, we use satellites. Over 30 navigation satellites are zipping around high above Earth. These satellites can tell us exactly where we are.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What is GPS?<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/spaceplace.nasa.gov\/review\/gps\/system.en.png\" alt=\"\" \/><\/figure>\n\n\n\n<p>The Global Positioning System (GPS) is made up of satellites, ground stations, and receivers.<\/p>\n\n\n\n<p>GPS is a system. It\u2019s made up of three parts: satellites, ground stations, and receivers.<\/p>\n\n\n\n<p>Satellites act like the stars in constellations\u2014we know where they are supposed to be at any given time.<\/p>\n\n\n\n<p>The ground stations use radar to make sure they are actually where we think they are.<\/p>\n\n\n\n<p>A receiver, like you might find in your phone or in your parents car, is constantly listening for a signal from these satellites. The receiver figures out how far away they are from some of them.<\/p>\n\n\n\n<p>Once the receiver calculates its distance from four or more satellites, it knows exactly where you are. Presto! From miles up in space your location on the ground can be determined with incredible precision! They can usually determine where you are within a few yards of your actual location. More high-tech receivers, though, can figure out where you are to within a few inches!<\/p>\n\n\n\n<p>The ancient sailors of history would be flabbergasted by the speed and ease of pinpointing your location today.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">GPS in everyday life<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/spaceplace.nasa.gov\/review\/gps\/in-a-snap.en.png\"><img decoding=\"async\" src=\"https:\/\/spaceplace.nasa.gov\/review\/gps\/in-a-snap.en.png\" alt=\"Space Place in a Snap logo\" \/><\/a><\/figure>\n\n\n\n<p>There\u2019s a whole lot of important things GPS is used for\u2014but perhaps nothing is more important than finding the quickest slice of pizza!<\/p>\n\n\n\n<p>Source: NASA website :&nbsp;<a href=\"https:\/\/spaceplace.nasa.gov\/gps\/en\/\" target=\"_blank\" rel=\"noreferrer noopener\">here<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. NEO-6M GPS module:<\/h2>\n\n\n\n<p>The NEO-6M GPS module is shown in the figure below. It comes with an external antenna, and does\u2019t come with header pins. So, you\u2019ll need to get and solder some.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/i2.wp.com\/randomnerdtutorials.com\/wp-content\/uploads\/2017\/10\/NEO-GPS-1.jpg?resize=670%2C526&amp;quality=100&amp;strip=all&amp;ssl=1\" alt=\"\" class=\"wp-image-45439\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>This module has an external antenna and built-in EEPROM.<\/li>\n\n\n\n<li>Interface: RS232 TTL<\/li>\n\n\n\n<li>Power supply: 3V to 5V<\/li>\n\n\n\n<li>Default baudrate: 9600 bps<\/li>\n\n\n\n<li>Works with standard NMEA sentences2<\/li>\n<\/ul>\n\n\n\n<p>The NEO-6M GPS module has four pins:&nbsp;VCC,&nbsp;RX,&nbsp;TX, and&nbsp;GND. The module communicates with the Arduino via serial communication using the TX and RX pins, so the wiring couldn\u2019t be simpler:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>NEO-6M GPS Module<\/strong><\/td><td><strong>Wiring to Arduino UNO<\/strong><\/td><\/tr><tr><td>VCC<\/td><td>5V<\/td><\/tr><tr><td>RX<\/td><td>Not used in this guide<\/td><\/tr><tr><td>TX<\/td><td>PA10 of STM32F4<\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Understanding NMEA Sentences<\/h3>\n\n\n\n<p>NMEA sentences start with the $ character, and each data field is separated by a comma.<\/p>\n\n\n\n<div class=\"wp-block-codemirror-blocks-code-block code-block\"><pre class=\"CodeMirror\" data-setting=\"{&quot;showPanel&quot;:true,&quot;languageLabel&quot;:&quot;language&quot;,&quot;fullScreenButton&quot;:true,&quot;copyButton&quot;:true,&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-csrc&quot;,&quot;theme&quot;:&quot;dracula&quot;,&quot;lineNumbers&quot;:false,&quot;styleActiveLine&quot;:false,&quot;lineWrapping&quot;:false,&quot;readOnly&quot;:true,&quot;fileName&quot;:&quot;C&quot;,&quot;language&quot;:&quot;C&quot;,&quot;maxHeight&quot;:&quot;400px&quot;,&quot;modeName&quot;:&quot;c&quot;}\">$GPGGA,110617.00,41XX.XXXXX,N,00831.54761,W,1,05,2.68,129.0,M,50.1,M,,*42\n$GPGSA,A,3,06,09,30,07,23,,,,,,,,4.43,2.68,3.53*02\n$GPGSV,3,1,11,02,48,298,24,03,05,101,24,05,17,292,20,06,71,227,30*7C\n$GPGSV,3,2,11,07,47,138,33,09,64,044,28,17,01,199,,19,13,214,*7C\n$GPGSV,3,3,11,23,29,054,29,29,01,335,,30,29,167,33*4E\n$GPGLL,41XX.XXXXX,N,00831.54761,W,110617.00,A,A*70\n$GPRMC,110618.00,A,41XX.XXXXX,N,00831.54753,W,0.078,,030118,,,A*6A \n$GPVTG,,T,,M,0.043,N,0.080,K,A*2C<\/pre><\/div>\n\n\n\n<p>There are different types of NMEA sentences. The type of message is indicated by the characters before the first comma.<\/p>\n\n\n\n<p>The GP after the $ indicates it is a GPS position.&nbsp; The $GPGGA is the basic GPS NMEA message, that provides 3D location and accuracy data. In the following sentence:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><strong>$GPGGA<\/strong>,110617.00,41XX.XXXXX,N,00831.54761,W,1,05,2.68,129.0,M,50.1,M,,*42<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>110617<\/strong>\u00a0\u2013 represents the time at which the fix location was taken, 11:06:17 UTC<\/li>\n\n\n\n<li><strong>41XX.XXXXX,N<\/strong>\u00a0\u2013 latitude 41 deg XX.XXXXX\u2019 N<\/li>\n\n\n\n<li><strong>00831.54761,W<\/strong>\u00a0\u2013 Longitude 008 deg 31.54761\u2032 W<\/li>\n\n\n\n<li><strong>1<\/strong>\u00a0\u2013 fix quality (0 = invalid; 1= GPS fix; 2 = DGPS fix; 3 = PPS fix; 4 = Real Time Kinematic; 5 = Float RTK; 6 = estimated (dead reckoning); 7 = Manual input mode; 8 = Simulation mode)<\/li>\n\n\n\n<li><strong>05<\/strong>\u00a0\u2013 number of satellites being tracked<\/li>\n\n\n\n<li><strong>2.68<\/strong>\u00a0\u2013 Horizontal dilution of position<\/li>\n\n\n\n<li><strong>129.0, M<\/strong>\u00a0\u2013 Altitude, in meters above the sea level<\/li>\n\n\n\n<li><strong>50.1, M<\/strong>\u00a0\u2013\u00a0Height of geoid (mean sea level) above WGS84 ellipsoid<\/li>\n\n\n\n<li>empty field \u2013\u00a0time in seconds since last DGPS update<\/li>\n\n\n\n<li>empty field \u2013\u00a0DGPS station ID number<\/li>\n\n\n\n<li><strong>*42<\/strong>\u00a0\u2013 the checksum data, always begins with *<\/li>\n<\/ul>\n\n\n\n<p>The other NMEA sentences provide additional information:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>$GPGSA<\/strong>\u00a0\u2013\u00a0GPS DOP and active satellites<\/li>\n\n\n\n<li><strong>$GPGSV<\/strong>\u00a0\u2013\u00a0Detailed GPS satellite information<\/li>\n\n\n\n<li><strong>$GPGLL<\/strong>\u00a0\u2013\u00a0Geographic Latitude and Longitude<\/li>\n\n\n\n<li><strong>$GPRMC<\/strong>\u00a0\u2013\u00a0Essential GPS pvt (position, velocity, time) data<\/li>\n\n\n\n<li><strong>$GPVTG<\/strong>\u00a0\u2013\u00a0Velocity made good<\/li>\n<\/ul>\n\n\n\n<p>To know what each data field means in each of these sentences, you can consult&nbsp;<a rel=\"noreferrer noopener\" href=\"http:\/\/www.gpsinformation.org\/dale\/nmea.htm\" target=\"_blank\">NMEA data here<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Hardware Setup:<\/h2>\n\n\n\n<p>The connection as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"922\" height=\"1024\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11-922x1024.jpg\" alt=\"\" class=\"wp-image-3385\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11-922x1024.jpg 922w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11-270x300.jpg 270w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11-768x853.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11-1382x1536.jpg 1382w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11-1150x1278.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11-750x833.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11-400x444.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11-250x278.jpg 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-11.jpg 1584w\" sizes=\"(max-width: 922px) 100vw, 922px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td>STM32F411RE Nucleo64<\/td><td>NEO-6M Module<\/td><\/tr><tr><td>5V or 3V3<\/td><td>Vcc<\/td><\/tr><tr><td>GND<\/td><td>GND<\/td><\/tr><tr><td>PA10 (D2 Arduino pin)<\/td><td>Tx<\/td><\/tr><tr><td>No connection<\/td><td>Rx<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For the LCD setup, please refer to this guide here:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/blog.embeddedexpert.io\/?p=3168\">Part 1.<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/blog.embeddedexpert.io\/?p=3186\" data-type=\"link\" data-id=\"https:\/\/blog.embeddedexpert.io\/?p=3186\" target=\"_blank\" rel=\"noreferrer noopener\">Part 2.<\/a><\/li>\n<\/ul>\n\n\n\n<p><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. STM32CubeIDE Setup:<\/h2>\n\n\n\n<p>Open STM32CubeIDE after selecting the workspace and create new project as following:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"355\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-1024x355.jpg\" alt=\"\" class=\"wp-image-2940\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-1024x355.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-300x104.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-768x266.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-1536x532.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-2048x709.jpg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-1150x398.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-750x260.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-400x139.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-26-00-250x87.jpg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Select the MCU:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"832\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-1024x832.jpg\" alt=\"\" class=\"wp-image-2941\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-1024x832.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-300x244.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-768x624.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-1536x1248.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-2048x1664.jpg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-1150x934.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-750x609.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-400x325.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-27-14-250x203.jpg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Give the project a name:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"813\" height=\"1024\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_15-53-56-813x1024.jpg\" alt=\"\" class=\"wp-image-3386\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_15-53-56-813x1024.jpg 813w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_15-53-56-238x300.jpg 238w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_15-53-56-768x968.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_15-53-56-750x945.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_15-53-56-400x504.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_15-53-56-250x315.jpg 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_15-53-56.jpg 984w\" sizes=\"(max-width: 813px) 100vw, 813px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>In the CubeMX window, enable the following GPIOs as output:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-1024x1024.jpg\" alt=\"\" class=\"wp-image-3174\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-1024x1024.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-300x300.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-150x150.jpg 150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-768x767.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-1536x1534.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-1150x1149.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-750x750.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-400x400.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48-250x250.jpg 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/01\/2025-01-18_17-06-48.jpg 1552w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Give each GPIO a name as shown in the figure above. <\/p>\n\n\n\n<p>Thats for setup of LCD.<\/p>\n\n\n\n<p>For NEO-6M GPS, Enable USART1 and set baudrate to 9600 and this will set PA9 and PA10 for UART as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"514\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-1024x514.jpg\" alt=\"\" class=\"wp-image-3387\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-1024x514.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-300x151.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-768x385.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-1536x771.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-2048x1028.jpg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-1150x577.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-750x376.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-400x201.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-00-35-250x125.jpg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<p>Next, from NVIC Settings of USART1, enable USART1 Global Interrupt as following:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"809\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-02-14-1024x809.jpg\" alt=\"\" class=\"wp-image-3388\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-02-14-1024x809.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-02-14-300x237.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-02-14-768x607.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-02-14-1150x909.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-02-14-750x593.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-02-14-400x316.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-02-14-250x198.jpg 250w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2025\/04\/2025-04-12_16-02-14.jpg 1164w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>From Project Manager tab, select Code Generation and enable Generate peripheral initialization as pair of .c\/.h files per peripheral as following:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"363\" src=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-1024x363.jpg\" alt=\"\" class=\"wp-image-2949\" srcset=\"https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-1024x363.jpg 1024w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-300x106.jpg 300w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-768x273.jpg 768w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-1536x545.jpg 1536w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-2048x727.jpg 2048w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-1150x408.jpg 1150w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-750x266.jpg 750w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-400x142.jpg 400w, https:\/\/blog.embeddedexpert.io\/wp-content\/uploads\/2024\/10\/2024-10-26_16-45-24-250x89.jpg 250w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Save the project this will generate the project.<\/p>\n\n\n\n<p>Stay tuned for part 2.<\/p>\n\n\n\n<p>Happy coding\u00a0\ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The NEO-6M GPS module is a popular and cost-effective solution for adding location tracking to embedded systems. This guide demonstrates how to interface the NEO-6M with the STM32F411-Nucleo64 board and display GPS data on a 1602 LCD. In part one, we shall take a look at the sensor, hardware setup and STM32CubeIDE setup. In this [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,19,11,12],"tags":[],"class_list":["post-3383","post","type-post","status-publish","format-standard","hentry","category-embedded-systems","category-lcd","category-peripheral-drivers","category-stm32"],"_links":{"self":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/3383"}],"collection":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3383"}],"version-history":[{"count":1,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/3383\/revisions"}],"predecessor-version":[{"id":3389,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=\/wp\/v2\/posts\/3383\/revisions\/3389"}],"wp:attachment":[{"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3383"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3383"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embeddedexpert.io\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3383"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}