Che Guevara
21.01.2015, 22:36
Hi,
ich habe hier ein STM32F4DISCOVERY Board, auf dem sitzt ein STM32F407VGT6 mit FPU.
Da ich noch neu in der Welt der STM32 (oder allg. ARM) bin, sitzt der Fehler vermutlich vorm Bildschirm.
Ich setze einen Pin low, führe 50 Multiplikationen eines float32 aus und setze anschließend den Pin high.
Die Multiplikation passiert nicht in einer Schleife, sondern einfach 50x die gleiche Instruktion hintereinander. Das Oszi zeigt knapp 3µs an.
Eigentlich sollte durch die FPU das ganze nur 50 Takte dauern, der STM32 läuft auf 168MHz (macht aber glaube ich 210MIPS durch Accelerator), also sollte es nur ca. 2.4e-7 Sekunden dauern.
Hier mal der Code:
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_tim.h"
#include "stm32f4xx_spi.h"
#include "system_stm32f4xx.h"
#include "arm_math.h"
void GPIO_setup(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14; // we want to configure all LED GPIO pins
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // we want the pins to be an output
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; // this sets the GPIO modules clock speed
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // this sets the pin type to push / pull (as opposed to open drain)
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // this sets the pullup / pulldown resistors to be inactive
GPIO_Init(GPIOD, &GPIO_InitStruct);
}
void InitTimeTimer(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM3->PSC = 41999;
TIM3->ARR = 1;
TIM3->DIER = TIM_DIER_UIE; // Enable update interrupt (timer level)
TIM3->CR1 = TIM_CR1_CEN; // Enable timer
}
volatile uint8_t TimerFlag = 0;
volatile int32_t TimeElapsed = 0;
int main(void)
{
SystemInit();
GPIO_setup();
InitTimeTimer();
NVIC_EnableIRQ(TIM3_IRQn); // Enable interrupt from TIM3 (NVIC level)
float float1 = 3.14f;
while(1)
{
GPIOD->ODR &= ~GPIO_Pin_13;
/*
for(cnt = 0;cnt<1000;cnt+=1)
{
float1 *= 5.1f;
}
*/
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
GPIOD->ODR |= GPIO_Pin_13;
}
}
void TIM3_IRQHandler(void)
{
if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set
{
TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag
}
TimerFlag = 1;
TimeElapsed += 1;
}
Programmiert wird mit EM:Blocks.
Vielen Dank & Gruß
Chris
ich habe hier ein STM32F4DISCOVERY Board, auf dem sitzt ein STM32F407VGT6 mit FPU.
Da ich noch neu in der Welt der STM32 (oder allg. ARM) bin, sitzt der Fehler vermutlich vorm Bildschirm.
Ich setze einen Pin low, führe 50 Multiplikationen eines float32 aus und setze anschließend den Pin high.
Die Multiplikation passiert nicht in einer Schleife, sondern einfach 50x die gleiche Instruktion hintereinander. Das Oszi zeigt knapp 3µs an.
Eigentlich sollte durch die FPU das ganze nur 50 Takte dauern, der STM32 läuft auf 168MHz (macht aber glaube ich 210MIPS durch Accelerator), also sollte es nur ca. 2.4e-7 Sekunden dauern.
Hier mal der Code:
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_tim.h"
#include "stm32f4xx_spi.h"
#include "system_stm32f4xx.h"
#include "arm_math.h"
void GPIO_setup(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14; // we want to configure all LED GPIO pins
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; // we want the pins to be an output
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz; // this sets the GPIO modules clock speed
GPIO_InitStruct.GPIO_OType = GPIO_OType_PP; // this sets the pin type to push / pull (as opposed to open drain)
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; // this sets the pullup / pulldown resistors to be inactive
GPIO_Init(GPIOD, &GPIO_InitStruct);
}
void InitTimeTimer(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM3->PSC = 41999;
TIM3->ARR = 1;
TIM3->DIER = TIM_DIER_UIE; // Enable update interrupt (timer level)
TIM3->CR1 = TIM_CR1_CEN; // Enable timer
}
volatile uint8_t TimerFlag = 0;
volatile int32_t TimeElapsed = 0;
int main(void)
{
SystemInit();
GPIO_setup();
InitTimeTimer();
NVIC_EnableIRQ(TIM3_IRQn); // Enable interrupt from TIM3 (NVIC level)
float float1 = 3.14f;
while(1)
{
GPIOD->ODR &= ~GPIO_Pin_13;
/*
for(cnt = 0;cnt<1000;cnt+=1)
{
float1 *= 5.1f;
}
*/
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
float1 *= 5.1f;
GPIOD->ODR |= GPIO_Pin_13;
}
}
void TIM3_IRQHandler(void)
{
if(TIM3->SR & TIM_SR_UIF) // if UIF flag is set
{
TIM3->SR &= ~TIM_SR_UIF; // clear UIF flag
}
TimerFlag = 1;
TimeElapsed += 1;
}
Programmiert wird mit EM:Blocks.
Vielen Dank & Gruß
Chris