Development Board For Stm8S003F3: by Nitin Chand M S (2018H1400171P), Rohith Krishnan P (2018H1400180P)
Development Board For Stm8S003F3: by Nitin Chand M S (2018H1400171P), Rohith Krishnan P (2018H1400180P)
Development Board For Stm8S003F3: by Nitin Chand M S (2018H1400171P), Rohith Krishnan P (2018H1400180P)
DESCRIPTION
This project aims to build a development board for STM8S003F3P6 (20 pin SMD) microcontroller.
STM8 microcontrollers are 8-bit general purpose microcontrollers from STMicroelectronics (STM).
They are robust, has a lot of features and are highly economical when it comes to price. STM8 MCUs
are one of the most unexplored yet efficient microcontrollers and this project aims to provide a
platform for enthusiasts to learn and appreciate them.
The development board features STM8S003F3P6 microcontroller (with 8-Kbyte flash memory, 1-
Kbyte RAM, 128-byte EEPROM), external crystal for clocking, type B mini USB port, a USB to UART
converter, voltage regulator, LED, switch , buzzer, potentiometer for ADC input and general purpose
IO ports for user applications.
DETAILS
The STM8S003F3 microcontroller development board is designed primarily for general purpose
applications. The microcontroller features 16 GPIO pins all of which can be accessed easily by the
user through the male header pins provided along the sides of the board. Separate header pins are
provided for programming the board through ST-Link programmer as well as for switching the
operating voltage between 5V and 3.3V. The board can be powered up through USB cable as well as
through the ST-Link programmer. The on-board 3.3V voltage regulator has a current capacity of
800mA and can power up the board as well as interfaced external peripherals. The Type-B mini USB
port along with USB to Serial chip (CH340G) provides communication with PC.
Fig.1
SOFTWARES USED:
Eagle PCB Design software
Gerbview software
IAR Embedded Workbench
IMPLEMENTATION:
Schematic and layout designing
Schematic and layout designing is done on the Eagle PCB design software. The design is made taken
into consideration of the different requirements of the ICs used in the board. The schematic and the
layout files are given below.
Fig.2 Schematic
Fig.3 Layout
PCB fabrication and soldering of the components
The layout is checked and each layer is verified using Gerbview software. Then it is given for the
fabrication. After the PCB is received, the components are soldered in the main PCB and are checked
for any short connections.
The development board and the working of the peripherals is tested using the codes which are
uploaded. The programmer used is ST-Link V2 and is programmed using the SWIM port. The
compiler used for the codes is IAR Embedded workbench.
Fig.6 ST LINK V2
PRECAUTION:
The important design aspect which is to be taken care of is to choose the value of VCAP of the
microcontroller. The value of the VCAP is to be choosen between 470nFand 1uF. If the value is not
choosen carefully then the whole design won’t work.
Testing results:
A. GPIO pins
The GPIO pins are checked with the help of a LED. We can program the pins of the
GPIO to become ON and OFF alternatively for fixed amount of time. By connecting
the LED to the Particular GPIO will make it blink.
The code snippet is
#include <iostm8s003f3.h>
while (1)
{
//Turn on and off the output and then delay
PD_ODR_bit.ODR3 = !PD_ODR_bit.ODR3;
delay(30000);
}
}
Circuit diagram:
Fig.8 LED ON
// Delay function
void wait(int x)
{
for(int i=0;i<1000;i++)
{
for(int j=0;j<x;j++);
}
}
void InitialiseSystemClock()
{
CLK_ICKR = 0; // Reset the Internal Clock Register.
CLK_ICKR_HSIEN // Enable the HSI.
CLK_ECKR = 0; // Disable the external clock.
while (CLK_ICKR_HSIRDY == 0);// Wait for the HSI to be ready for
use.
CLK_CKDIVR = 0; //Ensure the clocks are running at full speed.
CLK_PCKENR1 = 0xff; // Enable all peripheral clocks.
CLK_PCKENR2 = 0xff; // Ditto.
CLK_CCOR = 0; // Turn off CCO.
CLK_HSITRIMR = 0; // Turn off any HSIU trimming.
CLK_SWIMCCR = 0; // Set SWIM to run at clock / 2.
CLK_SWR = 0xe1; // Use HSI as the clock source.
CLK_SWCR = 0; // Reset the clock switch control register.
CLK_SWCR_SWEN = 1; // Enable switching.
while (CLK_SWCR_SWBSY != 0); // Pause while the clock switch is
busy.
}
//
// Setup the UART to run at 115200 baud, no parity, one stop bit, 8
data bits.
void InitialiseUART()
{
unsigned char tmp = UART1_SR;
tmp = UART1_DR;
//
// Reset the UART registers to the reset values.
//
UART1_CR1 = 0;
UART1_CR2 = 0;
UART1_CR4 = 0;
UART1_CR3 = 0;
UART1_CR5 = 0;
UART1_GTR = 0;
UART1_PSCR = 0;
//
// Now setup the port to 115200,n,8,1.
//
UART1_CR1_M = 0; // 8 Data bits.
UART1_CR1_PCEN = 0; // Disable parity.
UART1_CR3_STOP = 0; // 1 stop bit.
UART1_BRR2 = 0x0a; // Set the baud rate registers to 115200
baud
UART1_BRR1 = 0x08; // based upon a 16 MHz system clock.
//
// Disable the transmitter and receiver.
//
UART1_CR2_TEN = 0; // Disable transmit.
UART1_CR2_REN = 0; // Disable receive.
//
// Set the clock polarity, lock phase and last bit clock pulse.
//
UART1_CR3_CPOL = 1;
UART1_CR3_CPHA = 1;
UART1_CR3_LBCL = 1;
//
// Turn on the UART transmit, receive and the UART clock.
//
UART1_CR2_TEN = 1;
UART1_CR2_REN = 1;
UART1_CR3_CKEN = 0;
}
void SetupTimer2()
{
TIM2_PSCR = 0x05; // Prescaler = 32.
TIM2_ARRH = 0xc3; // High byte of 50,000.
TIM2_ARRL = 0x50; // Low byte of 50,000.
TIM2_CR1_CEN = 1; // Finally enable the timer.
}
void timer_contrl(void)
{
//UARTPrintF("int_start");
PD_ODR_ODR3 = !PD_ODR_ODR3; // Indicate that the ADC has
completed.
ADC_CR1_ADON = 1;
ADC_CR1_ADON = 1; // Second write starts the conversion.
TIM2_CNTRH=0X00; //Resetting the timer counters
TIM2_CNTRL=0X00;
}
int adc_read(void)
{
unsigned char low, high;
int d;
ADC_CR1_ADON = 0; // Disable the ADC.
UARTPrintF("adc_value:");
TIM1_CR1_CEN = 0; // Disable Timer 1.
ADC_CSR_EOC = 0; // Indicate that ADC conversion is
complete.
//UARTPrintF("adc_read_end");
low = ADC_DRL; // Extract the ADC reading.
high = ADC_DRH;
d=(high * 256) + low;
return d;
}
//-------------------------------------------------------------------
-------------
//
// Setup the ADC to perform a single conversion and then generate an
interrupt.
//
void SetupADC()
{
ADC_CR1_ADON = 1; // Turn ADC on, note a second set is
required to start the conversion.
wait(1000);
// UARTPrintF("adc_setup_start");
ADC_CSR_CH = 0x02;
ADC_CR3_DBUF = 0;
ADC_CR2_ALIGN = 1; // Data is right aligned.
ADC_CSR_EOCIE = 1; // Enable the interrupt after conversion
completed.
// UARTPrintF("adc_setup_end");
}
void SetupOutputPorts()
{
PD_ODR = 0; // All pins are turned off.
PD_DDR_DDR3 = 1;
PD_CR1_C13 = 1;
PD_CR2_C23 = 1;
}
while (1)
{
timer_contrl();
SetupADC();
int num=adc_read();
int temp=num;
int j;
for(j=0; temp!=0;j++)
{
temp=temp/10;
}
char data[5]={48};
for(int i=1; i<=j;i++)
{
data[j-i]=(char)(num%10)+48;
num=(num)/10;
}
data[4]='\0';
UARTPrintF(data);
UARTPrintF("\n\r");
Circuit diagram:
Fig.10 ADC, UART and Timer testing Circuit diagram
Result:
Fig.9 ADC value obtained in putty screen