NUCLEO-F103RB: Difference between revisions

From Embedded Workshop
Jump to navigation Jump to search
No edit summary
No edit summary
Line 3: Line 3:
  This development board functions well in at least three development environments:
  This development board functions well in at least three development environments:
  1) Arduino & Arduino IDE using the STM32 processor plug-in
  1) Arduino & Arduino IDE using the STM32 processor plug-in
  2) MBed - The on-board STM32 loader / debugger supports loading binaries created using MBed, https://os.mbed.com/
  2) MBed - The on-board STM32 loader / debugger supports loading web site created binaries
  3) STMicro's STM32CubeMX / Keil uVision or STMicro's new STM32CubeIDE, https://www.st.com/en/development-tools/stm32cubeide.html
    See https://os.mbed.com/
  I prefer STMicro's environment, allowing me easy access to peripherals, registers, and clock systems, with full access to every part of this system on ch1p.
  3) STMicro's STM32CubeMX / Keil uVision or STMicro's new STM32CubeIDE
    See https://www.st.com/en/development-tools/stm32cubeide.html
  I prefer STMicro's environment, allowing me easy access to peripherals, registers,
  and clock systems, with full access to every part of this system on chip.


[[File:NUCLEO_large.jpg|right|thumb]]
[[File:NUCLEO_large.jpg|right|thumb]]
  Processor: STM32F103RBT6
  '''Processor: STM32F103RBT6'''
  128KB Flash
  128KB Flash
  20KB SRAM
  20KB SRAM
Line 14: Line 17:
  Single-cycle multiplication and hardware division
  Single-cycle multiplication and hardware division
  2.0 to 3.6 V application supply and I/Os
  2.0 to 3.6 V application supply and I/Os
Within this part series, this is considered a "Medium-density device",
  and as such, has the following peripherals:
3 USARTs
3 16-bit timers
2 SPIs, 2 I2Cs, USB, CAN, 1 PWM Timer, 2 ADCs
Notes:
    "Low-density device" has fewer peripherals.
    "High-density device" has more peripherals.


<strong>Hardware</strong><br>
<strong>Hardware</strong><br>

Revision as of 16:14, 4 December 2020

The NUCLEO-F103RB development board uses the STM32F103RBT6 as the target processor. (The is the same processor used on "Blue Pill" boards.) It was after playing with the "Blue Pill" boards that I decided I need a REAL STMicro development board. This board is a rock solid development board with on-board ST-Link loader / debugger, using an STM32F103CBT6.

This development board functions well in at least three development environments:
1) Arduino & Arduino IDE using the STM32 processor plug-in
2) MBed - The on-board STM32 loader / debugger supports loading web site created binaries
    See https://os.mbed.com/
3) STMicro's STM32CubeMX / Keil uVision or STMicro's new STM32CubeIDE
    See https://www.st.com/en/development-tools/stm32cubeide.html
I prefer STMicro's environment, allowing me easy access to peripherals, registers,
  and clock systems, with full access to every part of this system on chip.
Processor: STM32F103RBT6
128KB Flash
20KB SRAM
72MHz clock
Single-cycle multiplication and hardware division
2.0 to 3.6 V application supply and I/Os
Within this part series, this is considered a "Medium-density device",
  and as such, has the following peripherals:
3 USARTs
3 16-bit timers
2 SPIs, 2 I2Cs, USB, CAN, 1 PWM Timer, 2 ADCs
Notes:
   "Low-density device" has fewer peripherals.
   "High-density device" has more peripherals.

Hardware

  • Green LED, LD2, connected to PA5, illuminates when driven high
  • Blue PushButton, B1, connects to PC13, grounding the signal when pressed
  • 32,768Hz crystal oscillator, LSE, used for Real Time Clock (RTC)
  • 8MHz HSE, is provided by the 8MHz crystal oscillator from the attached ST-Link, into PD0
  • UART2 connects the target processor to the ST-Link, providing a USB COM port connection on the host computer. Uses PA2 for TX, and PA3 for RX.
  • ST-Link connects to TCK (PA14), TMS (PA13)

https://www.st.com/en/evaluation-tools/nucleo-f103rb.html

Firmware
https://www.st.com/en/evaluation-tools/nucleo-f103rb.html https://www.st.com/en/embedded-software/stm32cubef1.html

ST Website for the STM32F1 family: http://www.st.com/stm32f1

Getting Started

1 Open STM32CubeMX
2 Create New Project using "Start My project from ST Board" selector button
3 In the "Commercial Part Number" box, enter NUCLEO-F103RB
4 The board will display in the lower right part of the screen.  Select the board.
5 Click on Start Project in upper right corner of window
6 A dialog will be displayed, asking "Initialize all peripherals with their default Mode ?"
   Select Yes
7 Using the Clock Configuration tab, a 64MHz SYSCLK is configured by default.  This can be adjusted to 72MHz if desired.
8 Using the Project Manager tab, give the project a name.  Something like "Blinky" will work well.
9 Within this same tab, select MDK-ARM for "Toolchain/IDE".  This instructs the Keil uVision application to be used.
10 Select GENERATE CODE button in upper right corner.
   (You may get a dialog box indicating you are missing some dependencies.  Select "Yes" to download them now.)
11 Select Open Project when prompted.
   (Keil may need to run it's package installer if it doesn't have support for the board.  This will take some time.  Don't click anything!)
12 Within Keil IDE, before we make any changes / additions to the code, let's make sure it builds.  Click on Project -> Build Target
   You can use the short-cut icon, available in the tool-bar, to Build(F7)
13 Within the project view, open the project, and then the Application/User/Core folder and then double click main.c
14 The LED GPIO should already have initialization code within MX_GPIO_Init().
   Find the infinite loop inside the main() function, and add the following two {{#if:|{{#ifexpr:({{#time:U|{{{3}}}}} - {{#time:U|now}}) > 0|highlighted lines of code:|highlighted lines of code:}}|highlighted lines of code:}}
 
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 while (1)
 {
{{#if:|{{#ifexpr:({{#time:U|{{{3}}}}} - {{#time:U|now}}) > 0|   HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
   HAL_Delay(500);|   HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
   HAL_Delay(500);}}|   HAL_GPIO_TogglePin(LD2_GPIO_Port,LD2_Pin);
   HAL_Delay(500);}}
   /* USER CODE END WHILE */

   /* USER CODE BEGIN 3 */
 }
 
 NOTE:
 Be sure to always place your code between the USER CODE BEGIN and USER CODE END comments
 This will protect your code from being removed should you make changes using the STM32CubeMX again.

14 Click Build (F7)
15 Click Download (F8)
16 At this point the board should now contain your code.  Press the reset button to watch it run.

PWM - Driving an RC Servo, 20ms period, 1.5ms initial pulse-width
See: https://en.wikipedia.org/wiki/Servo_control and https://en.wikipedia.org/wiki/Servo_(radio_control)
This assumes the instructions from "Getting Started" have already been performed...

1) Looking at the PCBA, I see the Arduino connector set and the PWM marking for Arduino D6
2) Looking at the MB1136.pdf schematic for this board, the D6 signal is mapped to PB10
3) Select PB10 using STM32CubeMX, Pinout & Configuration tab.  From the drop-down menu, choose {{#if:|{{#ifexpr:({{#time:U|{{{3}}}}} - {{#time:U|now}}) > 0|TIM2_CH3|TIM2_CH3}}|TIM2_CH3}}.
4) Select Timers ->TIM2.
4.1) Change Channel3 from Disable to {{#if:|{{#ifexpr:({{#time:U|{{{3}}}}} - {{#time:U|now}}) > 0|PWM Generation CH3|PWM Generation CH3}}|PWM Generation CH3}}
4.2) Set "Clock Source to "Internal Clock"
4.3) Set Prescaler (PSC - 16 bits value) to "72-1"  (This will reduce our 72MHz SYSCLK to 1MHz (1us period))
4.4) Set Counter Period to "20000-1" (This configures the period to be 20,000us long - 20ms / 50Hz)
4.5) Set Pulse (16 bits value) to 1500  (This configures the pulse width to 1500us / 1.5ms
5) Select GENERATE CODE button in upper right corner. This will produce the code that will initialize the TIM2_CH3 accordingly
6) If you have the Arduino D6 pin connected to your RC-Servo control signal pin,
   you won't see any changes even after building and downloading the code.
7) Add the following lines of highlight code:  (1 line of code with 1 line for comment)
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 {{#if:|{{#ifexpr:({{#time:U|{{{3}}}}} - {{#time:U|now}}) > 0|// Initialize TIM2_CH3, for PB10 (Arduino D6)
 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);|// Initialize TIM2_CH3, for PB10 (Arduino D6)
 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);}}|// Initialize TIM2_CH3, for PB10 (Arduino D6)
 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);}}
 while (1)
 {
8) Build (F7), Download (F8), press reset button.  The Arduino D6 pin will begin creating the desired PWM pulse,
   causing the servo to center itself.
9) Add the following additional code to the while (1) loop:
 /* Infinite loop */
 /* USER CODE BEGIN WHILE */
 // Initialize TIM2_CH3, for PB10 (Arduino D6)
 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_3);
 while (1)
 {
    htim2.Instance->CCR3 = 1000; // 1.0ms
    HAL_Delay(1000);
    htim2.Instance->CCR3 = 1250; // 1.25ms
    HAL_Delay(1000);
    htim2.Instance->CCR3 = 1500; // 1.5ms
    HAL_Delay(1000);
    htim2.Instance->CCR3 = 1750; // 1.75ms
    HAL_Delay(1000);
    htim2.Instance->CCR3 = 2000; // 2.0ms
    HAL_Delay(1000);
    /* USER CODE END WHILE */
10) Build (F7), Download (F8), press reset button.
    The while (1) loop will create multiple pulse widths, causing the servo to move to five distinct positions.

Arduino IDE Support
Using the Arduino Board Manager for the "duino" family
https://www.instructables.com/id/Quick-Start-to-STM-Nucleo-on-Arduino-IDE/
http://www.emcu.eu/2017/03/13/how-to-use-stm32-and-arduino-ide/

External STLink V2

External STLink V2: https://www.st.com/resource/en/user_manual/dm00026748-stlinkv2-incircuit-debuggerprogrammer-for-stm8-and-stm32-stmicroelectronics.pdf