Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
source/BCM2835.cpp@2:131555dc6fb7, 2022-12-20 (annotated)
- Committer:
- hudakz
- Date:
- Tue Dec 20 12:16:18 2022 +0000
- Revision:
- 2:131555dc6fb7
- Parent:
- 1:1f2d9982fa8c
Mbed API for Raspberry Pi boards equipped with BCM2836 SoC.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
hudakz | 1:1f2d9982fa8c | 1 | #include "BCM2835.h" |
hudakz | 1:1f2d9982fa8c | 2 | |
hudakz | 1:1f2d9982fa8c | 3 | extern volatile uint32_t* bcm2835_st; |
hudakz | 1:1f2d9982fa8c | 4 | extern volatile timeval start_program; |
hudakz | 1:1f2d9982fa8c | 5 | |
hudakz | 1:1f2d9982fa8c | 6 | /** |
hudakz | 1:1f2d9982fa8c | 7 | * @brief Reads the System Timer Counter (64-bits) |
hudakz | 1:1f2d9982fa8c | 8 | * @note |
hudakz | 1:1f2d9982fa8c | 9 | * @param |
hudakz | 1:1f2d9982fa8c | 10 | * @retval |
hudakz | 1:1f2d9982fa8c | 11 | */ |
hudakz | 1:1f2d9982fa8c | 12 | uint64_t bcm2835_systimer_read(void) |
hudakz | 1:1f2d9982fa8c | 13 | { |
hudakz | 1:1f2d9982fa8c | 14 | volatile uint32_t* paddr; |
hudakz | 1:1f2d9982fa8c | 15 | uint32_t hi, lo; |
hudakz | 1:1f2d9982fa8c | 16 | uint64_t st; |
hudakz | 1:1f2d9982fa8c | 17 | |
hudakz | 1:1f2d9982fa8c | 18 | if (bcm2835_st==MAP_FAILED) { |
hudakz | 1:1f2d9982fa8c | 19 | return 0; |
hudakz | 1:1f2d9982fa8c | 20 | } |
hudakz | 1:1f2d9982fa8c | 21 | |
hudakz | 1:1f2d9982fa8c | 22 | paddr = bcm2835_st + BCM2835_ST_CHI/4; |
hudakz | 1:1f2d9982fa8c | 23 | hi = bcm2835_peri_read(paddr); |
hudakz | 1:1f2d9982fa8c | 24 | |
hudakz | 1:1f2d9982fa8c | 25 | paddr = bcm2835_st + BCM2835_ST_CLO/4; |
hudakz | 1:1f2d9982fa8c | 26 | lo = bcm2835_peri_read(paddr); |
hudakz | 1:1f2d9982fa8c | 27 | |
hudakz | 1:1f2d9982fa8c | 28 | paddr = bcm2835_st + BCM2835_ST_CHI/4; |
hudakz | 1:1f2d9982fa8c | 29 | st = bcm2835_peri_read(paddr); |
hudakz | 1:1f2d9982fa8c | 30 | |
hudakz | 1:1f2d9982fa8c | 31 | /* Test for overflow */ |
hudakz | 1:1f2d9982fa8c | 32 | if (st == hi) |
hudakz | 1:1f2d9982fa8c | 33 | { |
hudakz | 1:1f2d9982fa8c | 34 | st <<= 32; |
hudakz | 1:1f2d9982fa8c | 35 | st += lo; |
hudakz | 1:1f2d9982fa8c | 36 | } |
hudakz | 1:1f2d9982fa8c | 37 | else |
hudakz | 1:1f2d9982fa8c | 38 | { |
hudakz | 1:1f2d9982fa8c | 39 | st <<= 32; |
hudakz | 1:1f2d9982fa8c | 40 | paddr = bcm2835_st + BCM2835_ST_CLO/4; |
hudakz | 1:1f2d9982fa8c | 41 | st += bcm2835_peri_read(paddr); |
hudakz | 1:1f2d9982fa8c | 42 | } |
hudakz | 1:1f2d9982fa8c | 43 | return st; |
hudakz | 1:1f2d9982fa8c | 44 | } |
hudakz | 1:1f2d9982fa8c | 45 | |
hudakz | 1:1f2d9982fa8c | 46 | /** |
hudakz | 1:1f2d9982fa8c | 47 | * @brief |
hudakz | 1:1f2d9982fa8c | 48 | * @note |
hudakz | 1:1f2d9982fa8c | 49 | * @param |
hudakz | 1:1f2d9982fa8c | 50 | * @retval |
hudakz | 1:1f2d9982fa8c | 51 | */ |
hudakz | 1:1f2d9982fa8c | 52 | uint64_t us_ticker_read() |
hudakz | 1:1f2d9982fa8c | 53 | { |
hudakz | 1:1f2d9982fa8c | 54 | struct timeval end_point; |
hudakz | 1:1f2d9982fa8c | 55 | uint64_t elapsedTime; |
hudakz | 1:1f2d9982fa8c | 56 | |
hudakz | 1:1f2d9982fa8c | 57 | // stop timer |
hudakz | 1:1f2d9982fa8c | 58 | |
hudakz | 1:1f2d9982fa8c | 59 | gettimeofday(&end_point, NULL); |
hudakz | 1:1f2d9982fa8c | 60 | |
hudakz | 1:1f2d9982fa8c | 61 | // compute and print the elapsed time in microseconds |
hudakz | 1:1f2d9982fa8c | 62 | //elapsedTime = (end_point.tv_sec - start_program.tv_sec) * 1000000.0; // sec to us |
hudakz | 1:1f2d9982fa8c | 63 | elapsedTime += (end_point.tv_usec - start_program.tv_usec); |
hudakz | 1:1f2d9982fa8c | 64 | return elapsedTime; |
hudakz | 1:1f2d9982fa8c | 65 | } |
hudakz | 1:1f2d9982fa8c | 66 | |
hudakz | 1:1f2d9982fa8c | 67 | /** |
hudakz | 1:1f2d9982fa8c | 68 | * @brief |
hudakz | 1:1f2d9982fa8c | 69 | * @note |
hudakz | 1:1f2d9982fa8c | 70 | * @param |
hudakz | 1:1f2d9982fa8c | 71 | * @retval |
hudakz | 1:1f2d9982fa8c | 72 | */ |
hudakz | 1:1f2d9982fa8c | 73 | void bcm2835_sleep_for_ms(unsigned int millis) |
hudakz | 1:1f2d9982fa8c | 74 | { |
hudakz | 1:1f2d9982fa8c | 75 | struct timespec sleeper; |
hudakz | 1:1f2d9982fa8c | 76 | |
hudakz | 1:1f2d9982fa8c | 77 | sleeper.tv_sec = (time_t) (millis / 1000); |
hudakz | 1:1f2d9982fa8c | 78 | sleeper.tv_nsec = (long)(millis % 1000) * 1000000; |
hudakz | 1:1f2d9982fa8c | 79 | nanosleep(&sleeper, NULL); |
hudakz | 1:1f2d9982fa8c | 80 | } |