yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
Self-balancing Robot Car📖
00.Get started quickly
  • 01.Balance car manual
  • 02.Balancing car assembly
  • 03.Get started quickly
  • 04.Balance car interface description
  • 05.Common Problem Analysis
  • 06.Balance Car V2 Library Function Development Manual
01.Environment development
  • 01.MDK-ARM installation
  • 02.STM32CubeIDE installation
  • 03.Common driver installation
  • 04.Download the program
  • 05.MDK-ARM project usage
  • 06.Program simulation
  • 07. VSCode Installation
02.STM32 getting started course
  • 01.Project creation
  • 02.LED Control(GPIO)
  • 03.Buzzer control(GPIO)
  • 04.Button control(EXTI)
  • 05.Serial communication(USART)
  • 06.Voltage detection(ADC)
  • 07.Basic timer(TIM)
  • 08.Universal timer(TIM)
  • 09.Advanced Timer(TIM)
  • 10.I2C Communication(I2C)-OLED
  • 11.SPI communication(SPI)-2.4G handle
  • 12.Independent Watchdog (IWDG)
  • 13.Window Watchdog (WWDG)
  • 14.DMA-USART
  • 15.DMA-I2C
03.STM32 expansion course
  • 01.Battery voltage detection (ADC)
  • 02.Ultrasonic module-measuring distance (TIM)
  • 03.Motor drive+encoder (TIM)
  • 04.OLED Data-Display(I2C)
  • 05.MPU6050-Data Read (I2C)
  • 06.Bluetooth module-Data reading (USART)
  • 07.2.4G handle-Data reading (SPI)
  • 08.Tracking module-Read status (GPIO)
  • 09.CCD module-Reading data (ADC)
  • 10.Electromagnetic module-Reading data (ADC)
  • 11.K210 module-Serial communication (USART)
  • 12.Tmini-Plus lidar-Reading data (USART)
04.Robot car PID control course
  • 01.PID basic concept
  • 02.PID example analysis
  • 03.P, PI, PD controller theory
  • 04.Position PID
  • 05.Incremental PID
  • 06.Cascade PID
  • 07.Balance principle of car
  • 08.Car upright control (PD)
  • 09.Car speed ​​control (PI)
  • 10.Car steering control (PD)
  • 11.Got angle and angular velocity (DMP algorithm)
  • 12.Got angle and angular velocity (Kalman filter algorithm)
  • 13.Got angle and angular velocity(Complementary filter algorithm)
05.Robot car basic course
  • 01.Car parameter adjustment
  • 02.Ultrasonic obstacle avoidance
  • 03.Ultrasonic follow
  • 04.Bluetooth remote control
  • 05.Load balance
06.Robot car advanced course
  • 01.4-channel tracking
  • 02.4-channel tracking avoid
  • 03.2.4G handle control
  • 04.CCD tracking
  • 05.CCD tracking avoid
  • 06.Electromagnetic tracking
  • 07.K210-QR code recognition
  • 08.K210-Color line tracking
  • 09.K210-Color follow
  • 10.K210-Self learning
  • 11.K210-Number recognition
  • 12.Lidar avoid
  • 13.Lidar guard
  • 14.Lidar follow
  • 15.Lidar patrol
  • 16.Lidar wall tracking-straight line
  • 17.Lidar wall tracking-multiple walls
  • 18. DIY Automatic driving car
07.Robot car LQR control
  • Robot car LQR control
08.Circuit design
  • 01.Overall circuit design
  • 02.STM32 minimum system
  • 03.Serial port circuit design
  • 04.Power circuit design
  • 05.MPU6050 Circuit Design
  • 06.Motor drive circuit design
09.Mathematical model
  • Mathematical model
10.Expand course
  • Autonomous Driving
Download
  • APP(Android)
  • Codes
  • Hardware-Info
  • SCH
  • Software Tools
  • STM32_Chip_DataSheet
  • 3D_Model_File
  • Video_PPT
Download ZIP

Welcome to Self-balancing Robot Car repository

02.LED Control(GPIO)

LED Control

LED ControlHardware connectionControl principleBit-band operationAdvantagesCodeExampleSoftware configurationPin definitionSoftware codecontrol functionExperimental phenomenon

The tutorial demonstrates controlling the LED on and off.

The tutorial only introduces the standard library project code

Hardware connection

image-20240825204711670

PeripheralsDevelopment BoardDescription
LEDPB3The anode of the LED is connected to the development board PB3, and the cathode is connected to the development board GND

Control principle

By controlling the PB3 pin to output high and low levels, the LED can be turned on and off.

Control pinOutput levelLED effect
PB3Output low levelLED off
PB3Output high levelLED on

Bit-band operation

xxxxxxxxxx
For specific implementation ideas, refer to Chapter 5 (pages 87 to 92) of <<CM3 Authoritative Guide>>

Using bit-band operation, you can read and write a single bit of the memory.

  • Bit-band area: address area supporting bit-band operation

  • Bit-band alias: access to alias address ultimately affects access to bit-band area

Range of two memory areas supporting bit-band operation

  • SRAM bit-band area address: 0x2000 0000 - 0x200F FFFF

  • Peripheral bit-band area address: 0x4000 0000 - 0x400F FFFF

Bit-band alias area

A: byte address

n: bit number (0≤n≤7)

  • SRAM bit-band alias area address: 0x2200 0000 - 0x23FF FFFC

xxxxxxxxxx
AliasAddr= =0x22000000+ ((A-0x20000000)*8 +n)*4
  • Peripheral bit-band alias area address: 0x4200 0000 - 0x43FF FFFC

xxxxxxxxxx
AliasAddr= =0x42000000+ ((A-0x40000000)*8 +n)*4

Advantages

You can directly control the bits of the hardware register to improve program execution efficiency!

Code

​x
// A macro that converts "bit with address + bit serial number" to an alias address
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
// Converts an address to a pointer
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
// Converts the bit-tape alias area address to a pointer
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

// GPIO ODR and IDR register address mapping
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C

#define GPIOA_IDR_Addr    (GPIOA_BASE+8)  //0x40010808
#define GPIOB_IDR_Addr    (GPIOB_BASE+8)  //0x40010C08
#define GPIOC_IDR_Addr    (GPIOC_BASE+8)  //0x40011008
#define GPIOD_IDR_Addr    (GPIOD_BASE+8)  //0x40011408
#define GPIOE_IDR_Addr    (GPIOE_BASE+8)  //0x40011808
#define GPIOF_IDR_Addr    (GPIOF_BASE+8)  //0x40011A08
#define GPIOG_IDR_Addr    (GPIOG_BASE+8)  //0x40011E08

// Operate an I/O port of GPIO alone, n(0,1,2...) 15),n indicates the specific I/O port
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) // Output
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) // Enter

#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) // Output
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) // Input

#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n) // Output
define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n) // Enter

#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n) // Output
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n) // Enter this parameter

#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n) // Output
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n) // Enter a value

#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) // Output
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) // Enter

#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) // Output
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) // Input

Example

PB3 output low

The following code actually works the same, the bitband operation is relatively simpler and faster!

  • Standard Library

xxxxxxxxxx
GPIO_ResetBits(GPIOB,GPIO_Pin_3)
GPIO_WriteBit(GPIOB, GPIO_Pin_3, Bit_RESET)
  • Bit band operation

xxxxxxxxxx
PBout(3)  = 0;

Software configuration

Pin definition

 pin of the main control chipmain function (after reset)default reuse functionredefine function
STM32F103RCT6PB3JTDOSPI3_SCK/I2S3_CKPB3/TRACESWO TIM2_CH2/ SPI1_SCK

Software code

Since the default function of the PB3 pin is the JTDO function, we need to disable its function and configure the PB3 as a normal IO pin function.

xxxxxxxxxx
Product supporting information source path: attachment → source summary → 1.Base_Course → 2.LED

control function

The tutorial only briefly introduces the code, the specific can open the project source code to read.

Init_Led_GPIO

xxxxxxxxxx
void Init_Led_GPIO(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(LED_RCC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = LED_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
    GPIO_Init(LED_PORT, &GPIO_InitStructure);
    LED = 0;
}

Experimental phenomenon

The LEd.hex file generated by the project compilation is located in the OBJ folder of the LED project, find the corresponding LEd.hex file of the project and use FlyMcu software to download the program into the development board.

After the program is successfully downloaded, the LED switches on and off every 500ms.

 

Project creation
Buzzer control(GPIO)

COMPANY

  • About us
  • Team Style
  • Blog

LEARNING & EXPLORATION

  • Tutorials
  • Edge AI hardware
  • Educational robots
  • Embedded intelligent hardware

WHERE TO BUY

  • Yahboom Online Store
  • Amazon
  • Alibaba
  • AliExpress
  • Mercado

TECHNOLOGY SUPPORT

  • Email: support@yahboom.com

BE A DISTRIBUTOR

  • Email: sales@yahboom.com
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文