Advertisement
petrdynin

CH32V003_nesting_priority_interrupt

Jan 22nd, 2025 (edited)
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.07 KB | Source Code | 0 0
  1. #include "ch32v00x.h"
  2.  
  3. volatile uint32_t cnt = 0;
  4. uint32_t result;
  5.  
  6. //#define  NESTING
  7.  
  8. #ifdef NESTING
  9.  
  10. void __attribute__((interrupt("WCH-Interrupt-fast"))) SW_Handler(void){  // #14
  11.  
  12.     cnt++;
  13.  
  14.     EXTI->INTENR |= EXTI_INTENR_MR0;
  15.     EXTI->SWIEVR |= EXTI_SWIEVR_SWIEVR0;
  16.     while(1){
  17.          if(!(EXTI->SWIEVR & EXTI_SWIEVR_SWIEVR0))
  18.              EXTI->SWIEVR |= EXTI_SWIEVR_SWIEVR0;
  19.       }
  20. }
  21.  
  22. void __attribute__((interrupt("WCH-Interrupt-fast"))) EXTI7_0_IRQHandler(void){ // #20
  23.  
  24.    EXTI->INTFR = EXTI_INTF_INTF0;
  25.  
  26. }
  27.  
  28. void main(void){
  29.  
  30.   __asm volatile("csrr %0,0x804" : "=r"(result)); // что в настройках стартапа?
  31.  
  32.   NVIC_SetPriority(Software_IRQn, 0b10 << 6); //#14  IPRIOR14 [7:6] <- 0x10
  33.   NVIC_SetPriority(EXTI7_0_IRQn,  0b00 << 6); //#20  IPRIOR20 [7:6] <- 0x01
  34.  
  35.   NVIC_EnableIRQ(Software_IRQn);
  36.   NVIC_EnableIRQ(EXTI7_0_IRQn);
  37.  
  38.   SysTick->CTLR |= (uint32_t)(1 << 0);    // вкл SysTick
  39.   SysTick->CTLR |= (uint32_t)(1 << 31);   // вкл SWI
  40.  
  41.   while(1);
  42. }
  43.  
  44. #else
  45.  
  46. void __attribute__((interrupt("WCH-Interrupt-fast"))) SW_Handler(void){  // #14
  47.  
  48.     cnt++;
  49.  
  50. }
  51.  
  52. void __attribute__((interrupt("WCH-Interrupt-fast"))) EXTI7_0_IRQHandler(void){ // #20
  53.  
  54.    EXTI->INTFR = EXTI_INTF_INTF0;
  55.  
  56. }
  57.  
  58. void main(void){
  59.  
  60.   __asm volatile("csrr %0,0x804" : "=r"(result));                 // чтение
  61.   __asm volatile("fence");
  62.   __asm volatile("csrrw %0, 0x804, %1" : "=r"(result) :"r"(0x1)); //чтение - запись
  63.   __asm volatile("csrr %0,0x804" : "=r"(result));                 // что теперь в настройках?
  64.  
  65.   __disable_irq();
  66.  
  67.  
  68.   EXTI->INTENR |= EXTI_INTENR_MR0;
  69.   EXTI->SWIEVR |= EXTI_SWIEVR_SWIEVR0;
  70.  
  71.   SysTick->CTLR |= (uint32_t)(1 << 0);    // вкл SysTick
  72.   SysTick->CTLR |= (uint32_t)(1 << 31);   // вкл SWI
  73.  
  74.   NVIC_SetPriority(Software_IRQn, 0b10 << 6); //#14  IPRIOR14 [7:6] <- 0x10
  75.   NVIC_SetPriority(EXTI7_0_IRQn,  0b01 << 6); //#20  IPRIOR20 [7:6] <- 0x01
  76.  
  77.   NVIC_EnableIRQ(Software_IRQn);
  78.   NVIC_EnableIRQ(EXTI7_0_IRQn);
  79.  
  80.   __enable_irq();
  81.  
  82.   while(1);
  83. }
  84.  
  85. #endif
  86.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement