100% found this document useful (1 vote)
225 views

STM32F0 C Code For Remote Control Input

This document contains C code for initializing and configuring various hardware peripherals on a STM32 microcontroller including SPI, I2C, timers, PWM outputs, GPIO pins and LEDs. It also contains functions for reading sensor data, performing calculations, and displaying outputs on an LCD screen. The main function sets up the peripherals and enters a loop to continuously read gyroscope data, calculate control values, and update the motor PWM signals and LCD display.

Uploaded by

Luke Maximo Bell
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
100% found this document useful (1 vote)
225 views

STM32F0 C Code For Remote Control Input

This document contains C code for initializing and configuring various hardware peripherals on a STM32 microcontroller including SPI, I2C, timers, PWM outputs, GPIO pins and LEDs. It also contains functions for reading sensor data, performing calculations, and displaying outputs on an LCD screen. The main function sets up the peripherals and enters a loop to continuously read gyroscope data, calculate control values, and update the motor PWM signals and LCD display.

Uploaded by

Luke Maximo Bell
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 15

//-f interface/stlink-v2.cfg -f target/stm32f0x_stlink.

cfg
#include
#include
#include
#include
#include
#include
#include
#include

<stdint.h>
"stm32f0xx.h"
"stm32f0xx_spi.h"
"stm32f0xx_rcc.h"
"stm32f0xx_gpio.h"
"lcd_stm32f0.h"
<stdint.h>
"stm32f0xx_tim.h"

//#include "MPU6050.h"
#include "stm32f0xx_i2c.h"
//#include "stm320518_eval.h"
typedef enum RES{
RES6 = (0x18),
RES8 = (0x10),
RES10 = (0x8),
RES12 = (0x0)
} RES_Type;
typedef enum pin{
BUT0 = 0,
BUT1 = 1,
BUT2 = 2,
BUT3 = 3,
POT0 = 5,
POT1 = 6
} PIN_Type;
void main(void);
void init_spi(void);
void chipSelect(void);
void chipDeSelect(void);
uint8_t writeSPIgyro(uint8_t regAdr, uint8_t data);
void setup_gyro_registers(void);
void getGyro(float* out );
int16_t twosCompToDec16(uint16_t val);
static void delay(uint32_t delay_in_us);
void Calculations(float* value , double time, float temp1);
float* gyro[3];
void
void
void
void
void
void
void

tim6Enablev2(void);
tim14Enablev2(void);
InitializeTimer3(void);
InitializePWMChannel1();
InitializePWMChannel2();
init_leds(void);
init_leds2(void);

uint16_t pulse1;
uint16_t pulse2;
double g, g1, g2;
void writeLED(uint16_t pat);

uint8_t isPressed(uint8_t pin);


void enableGPIO();
void ADC_setup(void);
void ADC_switch6(void);
float temp1;
uint32_t readadc(void);
uint8_t c, q, t, I, I2, j;
uint32_t light_reading1, light_reading2;
double tmp;
double difference;
uint16_t P_gain, timeI;
float throttle, steering;
float I_gain, D_gain, I_error, D_error;
TIM_ICInitTypeDef TIM_ICInitStructure;
uint32_t IC2Value1, DutyCycle1, Frequency1, IC2Value2, DutyCycle2, Frequency2;
void
void
void
void

TIM1_Config(void);
TIM2_Config(void);
TIM1_IRQHandler(void);
TIM2_IRQHandler(void);

void main(void)
{
//MPU6050_I2C_Init();
//MPU6050_Initialize();
volatile uint32_t delay_counter = 0;
P_gain = 360;
I_gain = 0.00;
D_gain = 0.00;
TIM1_Config();
TIM2_Config();

lcd_init();
enableGPIO();
init_spi();
setup_gyro_registers();
tim6Enablev2();
tim14Enablev2();
ADC_setup();
InitializeTimer3();
init_leds();
init_leds2();
delay(2000000);
for(;;)
{

//120

//
//
//
//
//
//
//
//
//
_counter++)
//
//
//
//
//
//

if(isPressed(BUT0))
{
lcd_command(LCD_CLEAR_DISPLAY);
lcd_string("Calibrating Gyro");
delay(200000);
lcd_command(LCD_GOTO_LINE_2);
for(delay_counter = 0; delay_counter < 16; delay
{
delay(25000);
lcd_string(">");
}
g = 0;
}
temp1 = readadc();
double time;
TIM_SetCounter(TIM6, 0);
getGyro(gyro);
time = TIM_GetCounter(TIM6);
TIM_SetCounter(TIM6, 0);
Calculations(gyro, time, temp1);
}

}
void Calculations(float* value, double time, float temp1)
{
//
if (t == 0)
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//light 1 is on
//
//
//
//
//
//

{
delay(10000);
light_reading1 = 4*readadc();
delay(10000);
t = 1;
writeLED(0b0000000000);
}
if (t < 6)
{
light_reading2 = 4*readadc();
if (light_reading2 <= 5)
}
if ((light_reading2 >= 1.45*light_reading1) && (t == 1))
{
t = 2;
writeLED(0b0100000000);
}
if ((light_reading2 <= 1.15*light_reading1) && (t == 2))

//light 1 is off
//
//
//
//
//
//
//light 2 is on
//
//
//
//
//
//
//light 2 is off
//
//
//
//
//
//
|| (light_reading2 <=
//
//
//
//
//
//

{
t = 3;
writeLED(0b0000000000);
}
if ((light_reading2 >= 1.45*light_reading1) && (t == 3))
{
t = 4;
writeLED(0b0100000001);
}
if ((light_reading2 <= 1.15*light_reading1) && (t == 4))
{
t = 5;
writeLED(0b0000000000);
}
if (((light_reading2 >= 1.4*light_reading1) && (t == 5))
0.4*light_reading1))
//light 3 is on
{
t = 6;
writeLED(0b1000000000);
ADC_switch6();
temp1 = readadc();
}

t = 6;
writeLED(0b0000000000);
ADC_switch6();
temp1 = readadc();
tmp = value[2];
//tmp = (tmp - (0.086*(temp1) - 6));
uint8_t a, b, x, y;
uint16_t duty_cycleF1, duty_cycleF2, period;
if (t == 6)
{
if ((tmp > -2 && tmp < 2) || (t < 6))
{
tmp=0;
}
if ((tmp > 300 || tmp < -300) || (t < 6))
{
tmp=0;
}
//

period = 20000;
g = g + 0.1*(tmp)*(time)*0.0022458;

//
//

if (I == 0)
{

//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//

TIM_SetCounter(TIM14, 0);
g1 = g;
I++;
}
if (I2 == 1)
{
timeI = TIM_GetCounter(TIM14);
difference = g - g1;
I_error = 0.1*difference*timeI;
I_error = I_gain*I_error;
D_error = ((10*difference)/timeI)*D_gain;
D_error = D_gain*D_error;
I = 0;
}
I2++;
if(I2 == 2)
{
I2 = 0;
}
TIM1_IRQHandler();
TIM2_IRQHandler();
throttle = ((DutyCycle1*0.274)-138);
steering = ((DutyCycle2*0.274)-138);
pulse1 = (20000*(steering/100)) ;

//

- (P_gain*(temp1 + I_error + D_error));


pulse2 = (20000*(steering/100));

//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//

if (q < 4)
{
if(q == 0)
{
pulse1 = 0.73*pulse1;
pulse2 = 0.62*pulse2;
}
if(q == 1)
{
pulse1 = 0.77*pulse1;
pulse2 = 0.70*pulse2;
}
if(q == 2)
{
pulse1 = 0.85*pulse1;
pulse2 = 0.80*pulse2;
}
if(q == 3)
{
pulse1 = 0.97*pulse1;
pulse2 = 0.92*pulse2;
q = 4;

//
//

}
}
InitializePWMChannel1();
InitializePWMChannel2();

//
//
//
//
//
//
//
//
//
//
//
//
//
//

c++;
if ( q < 4 )
{
if (c == 115)
{
q++;
c = 0;
}
}
duty_cycleF1 = ((pulse1*100)/period);
duty_cycleF2 = ((pulse2*100)/period);
a = DutyCycle1/10;
b = (DutyCycle1-a)*10;
x = g;
y = (g-x)*10;
c++;
if ( c == 50 )
{
j++;
lcd_command(LCD_CLEAR_DISPLAY);
lcd_command(LCD_CURSOR_HOME);
lcd_string("Throttle:");
LCD_display_uint8(throttle);
//lcd_string("D:");

//
//
//
//
//
//
//

if ( tmp < 0 )
{
a = 256-a;
b = 256-b;
lcd_string("-");
}
//LCD_display_uint8(a);
//lcd_string(".");
//LCD_display_uint8(b);
lcd_command(LCD_GOTO_LINE_2);
lcd_string("Steering:");

//
//

if (g < 0)
{

//
//
//
//

x = 256-x;
y = 256-y;
lcd_string("-");
}
LCD_display_uint8(steering);
//lcd_string(" ");
//LCD_display_uint8(IC2Value);
//lcd_string(" ");
//LCD_display_uint8(Frequency);

//
//
//

lcd_string(" t:");
LCD_display_uint8(duty_cycleF1);
c = 0;
}
}

void tim6Enablev2(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
TIM_TimeBaseInitTypeDef timer6InitStructure;
TIM_TimeBaseStructInit(&timer6InitStructure);
timer6InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
timer6InitStructure.TIM_Period = 2000;
timer6InitStructure.TIM_Prescaler = 9000;
TIM_TimeBaseInit(TIM6, &timer6InitStructure);
TIM_Cmd(TIM6, ENABLE);
}
void tim14Enablev2(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14, ENABLE);
TIM_TimeBaseInitTypeDef timer14InitStructure;
TIM_TimeBaseStructInit(&timer14InitStructure);
timer14InitStructure.TIM_CounterMode = TIM_CounterMode_Up;
timer14InitStructure.TIM_Period = 20000;
timer14InitStructure.TIM_Prescaler = 9000;
TIM_TimeBaseInit(TIM6, &timer14InitStructure);
TIM_Cmd(TIM14, ENABLE);
}
void InitializeTimer3(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitTypeDef timerInitStructure;
timerInitStructure.TIM_Prescaler = 40;
timerInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
timerInitStructure.TIM_Period = 20000;
timerInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
timerInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM3, &timerInitStructure);

TIM_Cmd(TIM3, ENABLE);
}
void InitializePWMChannel1()
{
TIM_OCInitTypeDef outputChannelInit = {0,};
outputChannelInit.TIM_OCMode = TIM_OCMode_PWM1;
outputChannelInit.TIM_Pulse = pulse1;
outputChannelInit.TIM_OutputState = TIM_OutputState_Enable;
outputChannelInit.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &outputChannelInit);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_1);
}
void InitializePWMChannel2()
{
TIM_OCInitTypeDef outputChannelInit = {0,};
outputChannelInit.TIM_OCMode = TIM_OCMode_PWM1;
outputChannelInit.TIM_Pulse = pulse2;
outputChannelInit.TIM_OutputState = TIM_OutputState_Enable;
outputChannelInit.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC2Init(TIM3, &outputChannelInit);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_1);
}
void writeLED(uint16_t pat)
{
GPIOB->ODR = pat;
}
uint8_t isPressed(uint8_t pin)
{
return ((GPIOA->IDR&(1<<pin))==0);
}
//void InitializeLEDs()
//{
//
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
//
GPIO_InitTypeDef gpioStructure;
//
//
gpioStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
//
gpioStructure.GPIO_Mode = GPIO_Mode_OUT;
//
gpioStructure.GPIO_Speed = GPIO_Speed_50MHz;
//
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
//
GPIO_Init(GPIOB, &gpioStructure);
//}
void init_leds(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;

GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void init_leds2(void)
{
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void init_spi()
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_12;//CSN =B12
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //output mode
GPIO_InitStructure.GPIO_OType= GPIO_OType_PP; //push pull
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; //#gottagofast
GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_UP; //doesn't matter
GPIO_Init(GPIOB, &GPIO_InitStructure);
chipDeSelect();
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //alternate mode
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3; //faster than fast
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //push pull that pin yo!
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //Do you even lift?
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_Init(GPIOB, &GPIO_InitStructure);
SPI_InitTypeDef SPI_InitStructure;
SPI_I2S_DeInit(SPI2);
SPI_InitStructure.SPI_Mode= SPI_Mode_Master; //the dev board is the mast
er and the peripheral is the slave
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //rec
eiving
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8 bit
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_Cmd(SPI2, ENABLE);

}
void setup_gyro_registers(void)
{
writeSPIgyro(0x23, 0b10000000);
writeSPIgyro(0x20, 0b11001111);
}
void getGyro(float* out )
{
uint8_t crtlB;
crtlB=(uint8_t)writeSPIgyro(0b10100011,0x00);//determines what range the
gyro is in (250dps, 500dps or 2000dps)
uint8_t
uint8_t
uint8_t
uint8_t
uint8_t
uint8_t

gyroXL=writeSPIgyro(0xA8,0x1);
gyroXH=writeSPIgyro(0xA9,0x1);
gyroYL=writeSPIgyro(0xAA,0x1);
gyroYH=writeSPIgyro(0xAB,0x1);
gyroZL=writeSPIgyro(0xAC,0x1);
gyroZH=writeSPIgyro(0xAD,0x1);

uint8_t buffer[6];
buffer[1]=gyroXL;
buffer[0]=gyroXH;
buffer[3]=gyroYL;
buffer[2]=gyroYH;
buffer[5]=gyroZL;
buffer[4]=gyroZH;
uint16_t t=0;
int i=0;
uint8_t temp=(uint8_t)(crtlB & 0x30);
switch(temp)
{
case (uint8_t)0x00://250dps
for(i=0; i<3; i++)
{
t=(((uint16_t)buffer[2*i] << 8) | buffer[2*i+1]);
int16_t temp2=twosCompToDec16(t);
out[i]=(float)((temp2*8.75/1000.0));
}
break;
case (uint8_t)0x10://500dps
for(i=0; i<3; i++)
{
t=(((uint16_t)buffer[2*i] << 8) |buffer[2*i+1]);
int16_t temp2=twosCompToDec16(t);
out[i]=(float)((temp2*17.5/1000.0));
}
break;
case (uint8_t)0x20://2000dps
for(i=0; i<3; i++)
{
t=(((uint16_t)buffer[2*i] << 8) |buffer[2*i+1]);
int16_t temp2=twosCompToDec16(t);
out[i]=(float)((temp2*70/1000.0));
}
break;

case (uint8_t)0x30://20000dps
for(i=0; i<3; i++)
{
t=(((uint16_t)buffer[2*i] << 8) | buffer[2*i+1]);
int16_t temp2=twosCompToDec16(t);
out[i]=(float)((temp2*70/1000.0));
}
break;
}
}
void chipSelect()
{
GPIO_ResetBits(GPIOB, GPIO_Pin_12);
}
void chipDeSelect()
{
GPIO_SetBits(GPIOB, GPIO_Pin_12);
}
uint8_t writeSPIgyro(uint8_t regAdr, uint8_t data)
{
uint8_t dummyVar;
uint32_t val;
chipSelect();
delay(10);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET)
{
}
uint16_t temp=(uint16_t)regAdr|(uint16_t)data<<8;
SPI_I2S_SendData16(SPI2, temp);
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET)
{
}
delay(200);
uint8_t val2 =SPI_ReceiveData8(SPI2);
val =SPI_ReceiveData8(SPI2);
chipDeSelect();
return (uint8_t)val;
}
int16_t twosCompToDec16(uint16_t val)
{
uint16_t v=val;
int16_t temp=0;
temp=~val;
temp+=1;
return (int16_t)temp;
}
static void delay(uint32_t delay_in_us)
{
volatile uint32_t counter = 0;
delay_in_us *= 3;
for(; counter < delay_in_us; counter++) {
__asm("nop");
__asm("nop");

}
}
void enableGPIO()
{
RCC->AHBENR |= 0x60000;
GPIOB->MODER |= 0x5555;
GPIOA->PUPDR |= 0x55;
GPIOA->MODER |= 0x3C00;
}
uint32_t readadc(void)
{
uint32_t mask = 1 << 2;
uint32_t reg = 0;
ADC1->CR |= 1 << 2; // kick off conversion
while (reg != mask){ // wait for conversion complete.
reg = ADC1->ISR;
reg &= mask;
}
return ADC1->DR;
}
void ADC_setup(void)
{
uint32_t status = 0;
RCC->AHBENR |= 1 << 17;
GPIOA->PUPDR |= 0b01010101;
GPIOA->MODER |= 3 << 12;
RCC->AHBENR |= 1 << 18;
GPIOB->MODER |= 0x5555;
RCC->APB2ENR |= 1 << 9;
ADC1->CFGR1 |= 1 << 3;
ADC1->CHSELR |= 1 << 5;
ADC1->CR |= 1;
while (status == 0) {
status = ADC1->ISR;
status &= 1;
}
}
void ADC_switch6(void)
{
ADC1->CHSELR =0;
ADC1->CHSELR |= 1 << 6;
}
void TIM1_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* TIM2 clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM15, ENABLE);
/* GPIOB clock enable */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
/* TIM2 chennel2 configuration : PA.01 */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1| GPIO_Pin_3;


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* Connect TIM pin to AF2 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_2);
/* Enable the TIM2 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM15_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//NVIC_Init(&NVIC_InitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(TIM15, &TIM_ICInitStructure);
/* Select the TIM2 Input Trigger: TI2FP2 */
TIM_SelectInputTrigger(TIM15, TIM_TS_TI2FP2);
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM15, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM1,TIM_MasterSlaveMode_Enable);
/* TIM enable counter */
TIM_Cmd(TIM15, ENABLE);
/* Enable the CC2 Interrupt Request */
TIM_ITConfig(TIM15, TIM_IT_CC2, ENABLE);
}
void TIM1_IRQHandler(void)
{
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
/* Clear TIM2 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM15, TIM_IT_CC2);
/* Get the Input Capture value */
IC2Value1 = TIM_GetCapture2(TIM15);
IC2Value1 = 0.01*IC2Value1;
if (IC2Value1 != 0)
{
/* Duty cycle computation */
DutyCycle1 = (TIM_GetCapture1(TIM15) * 100) / IC2Value1;
/* Frequency computation
TIM2 counter clock = (RCC_Clocks.HCLK_Frequency)/2 */
Frequency1 = RCC_Clocks.HCLK_Frequency / IC2Value1;

}
else
{
DutyCycle1 = 0;
Frequency1 = 0;
}
}

void TIM2_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* Connect TIM pin to AF2 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_2);
/* Enable the TIM2 global Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//NVIC_Init(&NVIC_InitStructure);
TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0;
TIM_PWMIConfig(TIM2, &TIM_ICInitStructure);
/* Select the TIM2 Input Trigger: TI2FP2 */
TIM_SelectInputTrigger(TIM2, TIM_TS_TI2FP2);
/* Select the slave Mode: Reset Mode */
TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);
TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);
/* TIM enable counter */
TIM_Cmd(TIM2, ENABLE);
/* Enable the CC2 Interrupt Request */
TIM_ITConfig(TIM2, TIM_IT_CC2, ENABLE);
}
void TIM2_IRQHandler(void)
{
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq(&RCC_Clocks);
/* Clear TIM2 Capture compare interrupt pending bit */
TIM_ClearITPendingBit(TIM2, TIM_IT_CC2);
/* Get the Input Capture value */
IC2Value2 = TIM_GetCapture2(TIM2);

IC2Value2 = 0.01*IC2Value2;
if (IC2Value2 != 0)
{
/* Duty cycle computation */
DutyCycle2 = (TIM_GetCapture1(TIM2) * 100) / IC2Value2;
/* Frequency computation
TIM2 counter clock = (RCC_Clocks.HCLK_Frequency)/2 */
Frequency2 = RCC_Clocks.HCLK_Frequency / IC2Value2;
}
else
{
DutyCycle2 = 0;
Frequency2 = 0;
}
}

You might also like