main.c 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // See LICENSE for license details.
  2. #include <stdio.h>
  3. #include "nuclei_sdk_soc.h"
  4. #if defined(__ECLIC_PRESENT) && (__ECLIC_PRESENT == 1)
  5. #else
  6. #error "This example require CPU ECLIC feature"
  7. #endif
  8. #if defined(__SYSTIMER_PRESENT) && (__SYSTIMER_PRESENT == 1)
  9. #else
  10. #error "This example require CPU System Timer feature"
  11. #endif
  12. /* Define the interrupt handler name same as vector table in case download mode is flashxip. */
  13. #define mtimer_irq_handler eclic_mtip_handler
  14. #define mtimer_sw_irq_handler eclic_msip_handler
  15. static volatile uint32_t int0_cnt = 0; /* mtip timer interrupt test counter */
  16. static volatile uint32_t int1_cnt = 0; /* msip timer interrupt test counter */
  17. volatile unsigned int msip_trig_flag = 1; /* sw trigger mtimer sw interrupt flag */
  18. #ifdef CFG_SIMULATION
  19. #define LOOP_COUNT 2
  20. #else
  21. #define LOOP_COUNT 5
  22. #endif
  23. void mtimer_irq_handler(void)
  24. {
  25. int0_cnt++;
  26. printf("MTimer IRQ handler %d\n\r", int0_cnt);
  27. uint64_t now = SysTimer_GetLoadValue();
  28. SysTimer_SetCompareValue(now + SOC_TIMER_FREQ / 10);
  29. }
  30. void mtimer_sw_irq_handler(void)
  31. {
  32. SysTimer_ClearSWIRQ();
  33. int1_cnt++;
  34. printf("MTimer SW IRQ handler %d\n\r", int1_cnt);
  35. msip_trig_flag = 1;
  36. }
  37. void setup_timer()
  38. {
  39. printf("init timer and start\n\r");
  40. uint64_t now = SysTimer_GetLoadValue();
  41. uint64_t then = now + SOC_TIMER_FREQ / 10;
  42. SysTimer_SetCompareValue(then);
  43. }
  44. int main(void)
  45. {
  46. uint32_t returnCode;
  47. returnCode = ECLIC_Register_IRQ(
  48. SysTimer_IRQn, ECLIC_NON_VECTOR_INTERRUPT, ECLIC_LEVEL_TRIGGER, 1, 0,
  49. (void *)mtimer_irq_handler); /* register system timer interrupt */
  50. __enable_irq(); /* enable global interrupt */
  51. setup_timer(); /* initialize timer */
  52. while (int0_cnt < LOOP_COUNT);
  53. ECLIC_DisableIRQ(SysTimer_IRQn); /* Disable MTIP iterrupt */
  54. returnCode = ECLIC_Register_IRQ(
  55. SysTimerSW_IRQn, ECLIC_NON_VECTOR_INTERRUPT,
  56. ECLIC_POSTIVE_EDGE_TRIGGER, 2, 0,
  57. (void *)mtimer_sw_irq_handler); /* register system timer SW interrupt */
  58. do {
  59. if (msip_trig_flag == 1) {
  60. msip_trig_flag = 0;
  61. SysTimer_SetSWIRQ(); /* trigger timer sw interrupt */
  62. delay_1ms(10);
  63. }
  64. } while (int1_cnt < LOOP_COUNT); /* check test end condition */
  65. printf("MTimer msip and mtip interrupt test finish and pass\r\n");
  66. if (returnCode != 0) { /* Check return code for errors */
  67. return -1;
  68. }
  69. return 0;
  70. }