aboutsummaryrefslogtreecommitdiffstats
path: root/testhal/STM32F1xx/I2C/main.c
blob: ae1bea5af645114af11a5dbab98aa45b311507c6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/**
 * Lets imagine that we have board with LIS3LV02DL accelerometer on channel #1
 * and MAX1236 ADC, TMP75 thermometer on channel #2.
 *
 * NOTE: I assume, that you have datasheets on all this stuff.
 *
 * NOTE: Also, I assume, that you know how to I2C works.
 *
 * In order from simplicity to complexity:
 *   TMP75
 *   MAX1236
 *   LIS3LV02DL
 *
 * Project splitted to separate source files for each device.
 *
 * Data from sensors we will be read from different thread sleeping different
 * amount of time.
 */

#include "ch.h"
#include "hal.h"

#include "i2c_pns.h"
#include "lis3.h"



/*
 * Red LEDs blinker thread, times are in milliseconds.
 */
static WORKING_AREA(BlinkWA, 128);
static msg_t Blink(void *arg) {
  (void)arg;
  while (TRUE) {
    palClearPad(IOPORT3, GPIOC_LED);
    chThdSleepMilliseconds(500);
    palSetPad(IOPORT3, GPIOC_LED);
    chThdSleepMilliseconds(500);
  }
  return 0;
}

/*
 * Accelerometer thread
 */
static WORKING_AREA(PollAccelThreadWA, 128);
static msg_t PollAccelThread(void *arg) {
  (void)arg;
  systime_t time = chTimeNow();

  while (TRUE) {
    time += MS2ST(20);
    request_acceleration_data();
    chThdSleepUntil(time);
  }
  return 0;
}


/*
 * Accelerometer thread
 */
static WORKING_AREA(PollAccelThreadWA, 128);
static msg_t PollAccelThread(void *arg) {
  (void)arg;
  systime_t time = chTimeNow();

  while (TRUE) {
    time += MS2ST(20);
    request_acceleration_data();
    chThdSleepUntil(time);
  }
  return 0;
}



/*
 * Entry point, note, the main() function is already a thread in the system
 * on entry.
 */
int main(void) {

  halInit();
  chSysInit();

  chThdSleepMilliseconds(1000);
  I2CInit_pns();

  /* Create accelerometer thread */
  chThdCreateStatic(PollAccelThreadWA,
          sizeof(PollAccelThreadWA),
          HIGHPRIO,
          PollAccelThread,
          NULL);

  /* Creates the blinker thread. */
  chThdCreateStatic(BlinkWA, sizeof(BlinkWA), LOWPRIO, Blink, NULL);

  /* main loop that do nothing */
  while (TRUE) {
    chThdSleepMilliseconds(500);
  }

  return 0;
}