Cortex-M DWT CYCCNT example

Dependencies:   mbed

Committer:
discypus
Date:
Sun Apr 26 12:51:13 2015 +0000
Revision:
0:41971777e42c
Cortex-M DWT CYCCNT example;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
discypus 0:41971777e42c 1 #include <mbed.h>
discypus 0:41971777e42c 2
discypus 0:41971777e42c 3 #if 1
discypus 0:41971777e42c 4 #define DWT_CONTROL ((volatile uint32_t *)0xE0001000)
discypus 0:41971777e42c 5 #define DWT_CYCCNT ((volatile uint32_t *)0xE0001004)
discypus 0:41971777e42c 6 #define SCB_DEMCR ((volatile uint32_t *)0xE000EDFC)
discypus 0:41971777e42c 7
discypus 0:41971777e42c 8 static inline uint32_t getDwtCyccnt(void)
discypus 0:41971777e42c 9 {
discypus 0:41971777e42c 10 return *DWT_CYCCNT;
discypus 0:41971777e42c 11 }
discypus 0:41971777e42c 12
discypus 0:41971777e42c 13 static inline void resetDwtCyccnt(void)
discypus 0:41971777e42c 14 {
discypus 0:41971777e42c 15 *DWT_CYCCNT = 0; // reset the counter
discypus 0:41971777e42c 16 }
discypus 0:41971777e42c 17
discypus 0:41971777e42c 18 static inline void enableDwtCyccnt(void)
discypus 0:41971777e42c 19 {
discypus 0:41971777e42c 20 *SCB_DEMCR = *SCB_DEMCR | (1u << 24); // TRCENA = 1
discypus 0:41971777e42c 21 *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter (CYCCNTENA = 1)
discypus 0:41971777e42c 22 *DWT_CYCCNT = 0; // reset the counter
discypus 0:41971777e42c 23 }
discypus 0:41971777e42c 24
discypus 0:41971777e42c 25 #endif
discypus 0:41971777e42c 26
discypus 0:41971777e42c 27 Serial pc(USBTX, USBRX);
discypus 0:41971777e42c 28
discypus 0:41971777e42c 29 static void benchmark_wait_us() {
discypus 0:41971777e42c 30 uint32_t count[11];
discypus 0:41971777e42c 31 enableDwtCyccnt();
discypus 0:41971777e42c 32 resetDwtCyccnt();
discypus 0:41971777e42c 33 count[0] = getDwtCyccnt();
discypus 0:41971777e42c 34 wait_us(1000);
discypus 0:41971777e42c 35 count[1] = getDwtCyccnt();
discypus 0:41971777e42c 36 wait_us(1000);
discypus 0:41971777e42c 37 count[2] = getDwtCyccnt();
discypus 0:41971777e42c 38 wait_us(1000);
discypus 0:41971777e42c 39 count[3] = getDwtCyccnt();
discypus 0:41971777e42c 40 wait_us(1000);
discypus 0:41971777e42c 41 count[4] = getDwtCyccnt();
discypus 0:41971777e42c 42 wait_us(1000);
discypus 0:41971777e42c 43 count[5] = getDwtCyccnt();
discypus 0:41971777e42c 44 wait_us(1000);
discypus 0:41971777e42c 45 count[6] = getDwtCyccnt();
discypus 0:41971777e42c 46 wait_us(1000);
discypus 0:41971777e42c 47 count[7] = getDwtCyccnt();
discypus 0:41971777e42c 48 wait_us(1000);
discypus 0:41971777e42c 49 count[8] = getDwtCyccnt();
discypus 0:41971777e42c 50 wait_us(1000);
discypus 0:41971777e42c 51 count[9] = getDwtCyccnt();
discypus 0:41971777e42c 52 wait_us(1000);
discypus 0:41971777e42c 53 count[10] = getDwtCyccnt();
discypus 0:41971777e42c 54
discypus 0:41971777e42c 55 for (size_t i = 0; i <= 10; i++) {
discypus 0:41971777e42c 56 const uint32_t diff = (i >= 1)?(count[i] - count[i - 1]):0;
discypus 0:41971777e42c 57 pc.printf("%d (%d)\r\n", count[i], diff);
discypus 0:41971777e42c 58 }
discypus 0:41971777e42c 59 }
discypus 0:41971777e42c 60
discypus 0:41971777e42c 61 static void benchmark_nop() {
discypus 0:41971777e42c 62 uint32_t count[11];
discypus 0:41971777e42c 63 enableDwtCyccnt();
discypus 0:41971777e42c 64 resetDwtCyccnt();
discypus 0:41971777e42c 65 count[0] = getDwtCyccnt();
discypus 0:41971777e42c 66 __nop();
discypus 0:41971777e42c 67 count[1] = getDwtCyccnt();
discypus 0:41971777e42c 68 __nop();
discypus 0:41971777e42c 69 count[2] = getDwtCyccnt();
discypus 0:41971777e42c 70 __nop();
discypus 0:41971777e42c 71 count[3] = getDwtCyccnt();
discypus 0:41971777e42c 72 __nop();
discypus 0:41971777e42c 73 count[4] = getDwtCyccnt();
discypus 0:41971777e42c 74 __nop();
discypus 0:41971777e42c 75 count[5] = getDwtCyccnt();
discypus 0:41971777e42c 76 __nop();
discypus 0:41971777e42c 77 count[6] = getDwtCyccnt();
discypus 0:41971777e42c 78 __nop();
discypus 0:41971777e42c 79 count[7] = getDwtCyccnt();
discypus 0:41971777e42c 80 __nop();
discypus 0:41971777e42c 81 count[8] = getDwtCyccnt();
discypus 0:41971777e42c 82 __nop();
discypus 0:41971777e42c 83 count[9] = getDwtCyccnt();
discypus 0:41971777e42c 84 __nop();
discypus 0:41971777e42c 85 count[10] = getDwtCyccnt();
discypus 0:41971777e42c 86
discypus 0:41971777e42c 87 for (size_t i = 0; i <= 10; i++) {
discypus 0:41971777e42c 88 const uint32_t diff = (i >= 1)?(count[i] - count[i - 1]):0;
discypus 0:41971777e42c 89 pc.printf("%d (%d)\r\n", count[i], diff);
discypus 0:41971777e42c 90 }
discypus 0:41971777e42c 91 }
discypus 0:41971777e42c 92
discypus 0:41971777e42c 93 int main() {
discypus 0:41971777e42c 94 pc.baud(115200);
discypus 0:41971777e42c 95 pc.printf("CPU SystemCoreClock is %.2f MHz\r\n", (float)SystemCoreClock/1000.0f/1000.0f);
discypus 0:41971777e42c 96 pc.printf("Nucleo compare DWT_CYCCNT to wait_us\r\n");
discypus 0:41971777e42c 97
discypus 0:41971777e42c 98 //
discypus 0:41971777e42c 99 benchmark_wait_us();
discypus 0:41971777e42c 100 benchmark_nop();
discypus 0:41971777e42c 101 }
discypus 0:41971777e42c 102