Quellcode von STM32F4-Discovery

Download:

 

vollständiger Ausschnitt aus main.c

/* File: main.c
* Date: 13.05.2013
* Author: Jan Kurzawski
* Description: Programm für ADC-Wandlung mit I2C-Schnittstelle.
* Wert aus dem Infrarot-Sensor (GP2Y0A710K0F) über I2C-Bus als Ausgangsspannung zur Variable "voltage" zugewiesen. (siehe auch Datenblatt)
*/

#include "i2c.h"
#include <stm32f4xx_tim.h>

// I2C Slave-Adresse = 01001000
#define DEVICE_ADDRESS ((uint8_t)0x48)

// Initialisierung vom Timer TIM6
// Update Event (Hz) = Timer_Clock / [(TIMx_PSC+1)*(TIMx_ARR+1)]
void TIM6_Init(void)
{
RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; // APB1 als Clock für den Timer aktivieren (Internal timer clock = 84 MHz)
TIM6->PSC = 0; // Frequenz von der CLock übernehmen
TIM6->ARR = 83999; // Autoreload auf 83999 setzen --> 1 reload = 1ms (bei 84MHz)
TIM6->CR1 |= TIM_CR1_OPM; // One pulse mode
TIM6->EGR |= TIM_EGR_UG; // Update erzwingen
TIM6->SR &= ~TIM_SR_UIF; // Update flag löschen
}
/**********************************************************************************/

// Funktion zum Warten (Wertangabe 1ms)
void myDelay (__IO uint16_t nTime)
{
for(nTime; nTime>0; nTime--)
{
TIM6->CR1 |= TIM_CR1_CEN; // TIM6 counter aktivieren
while(TIM6->CR1 & TIM_CR1_CEN){}
}
}
/**********************************************************************************/

// Funktion zum Ausrechnen von Dezimalwerten
// Aus 2 8-Bit-Werten wird der gemessene Wert bestimmt
uint16_t calcValue (uint8_t* rawVal)
{
uint16_t result;

*(((uint8_t*)(&result)) + 0) = rawVal[1];
*(((uint8_t*)(&result)) + 1) = rawVal[0];

return result;
}

// Messwerte umrechnen und in 1 Array speichern
uint16_t arrPrepData[3];
volatile uint32_t test;

int main(void)
{
// Variable zum Speichern des Sensorwertes
uint16_t sensor_value;
uint32_t voltage;

I2CBus_Init();
TIM6_Init();

/* ADS1000 auf continuous-read mode setzen (Cfg-Byte) */
/***************************************************************************************/
// I2C1 aktivieren, ADC ansprechen und festlegen, dass der Master Daten übertragen wird
I2C_start(I2C1, DEVICE_ADDRESS, I2C_Direction_Transmitter);
// Konfigurationsbyte des ADC schreiben
I2C_write(I2C1, (uint8_t)0x80);
// I2C1 anhalten und den Bus freigeben
I2C_stop(I2C1);

while(1)
{
uint8_t sensor_value_byte[2];

/* Werte aus dem ADC lesen - dazu müssen in Folge zwei Register gelesen werden, welche die
Low- und High-Bytes des 16bt */
// I2C1 aktivieren, ADC ansprechen und festlegen, dass der Master auf Daten wartet
I2C_start(I2C1, DEVICE_ADDRESS, I2C_Direction_Receiver);
// Das 1. Byte vom ADC empfangen und mit ACK bestätigen
sensor_value_byte[0] = I2C_read_ack(I2C1);
// Das 2. Byte(das letzte) vom ADC empfangen und mit ACK bestätigen
sensor_value_byte[1] = I2C_read_ack(I2C1);
// I2C anhalten und den Bus freigeben
I2C_stop(I2C1);
/***************************************************************************************/

/* Sensorwert zu einem großen int zusammenrechnen */
sensor_value = calcValue(sensor_value_byte);

voltage = sensor_value * 5000 / 2048; /* Ausgangsspannung */
test = voltage * 2;

/* 100 ms warten, bis der nächste Wert ausgelesen wird */
myDelay(100);
}
}