sys.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #include "sys.h"
  2. #include "HAL_misc.h"
  3. void RemapVtorTable(void)
  4. {
  5. int i;
  6. RCC->AHB1ENR |= 1<<13;//bkp clk,enable sram
  7. //关ROM区中断
  8. for(i = 0;i<90;i++)
  9. {
  10. NVIC_DisableIRQ((IRQn_Type)i);
  11. }
  12. SCB->VTOR = 0;
  13. SCB->VTOR |= 0x1<<29;
  14. for(i = 0;i < 512;i+=4)
  15. *(u32*)(T_SRAM_BASE + i) = *(u32*)(T_SDRAM_BASE+i);
  16. }
  17. void AI_Responder_enable(void)
  18. {
  19. AI_Responder->ADDR1= 0x70807040;
  20. // AI_Responder->ADDR0 = 0x70027080;
  21. AI_Responder->ADDR1 = 0;
  22. AI_Responder->CCR &= ~(0x3<<3);
  23. AI_Responder->CCR |= 1;
  24. while((AI_Responder->SR & 0x3) != 2);
  25. }
  26. void AI_Responder_disable(void)
  27. {
  28. AI_Responder->CCR &= ~1;
  29. }
  30. //外部中断配置函数
  31. //只针对GPIOA~E
  32. //参数:
  33. //GPIOx:0~4,代表GPIOA~E
  34. //BITx:需要使能的位,例如PB12,就填 12;
  35. //TRIM:触发模式,1,下降沿;2,上升沿;3,任意电平触发
  36. //该函数一次只能配置1个IO口,多个IO口,需多次调用
  37. //该函数会自动开启对应中断,以及屏蔽线
  38. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
  39. {
  40. u8 EXTOFFSET=(BITx%4)*4;
  41. RCC->APB2ENR|=1<<14; //使能SYSCFG时钟
  42. SYSCFG->EXTICR[BITx/4]&=~(0x000F<<EXTOFFSET);//清除原来设置!!!
  43. SYSCFG->EXTICR[BITx/4]|=GPIOx<<EXTOFFSET; //EXTI.BITx映射到GPIOx.BITx
  44. //自动设置
  45. EXTI->IMR|=1<<BITx; //开启line BITx上的中断(如果要禁止中断,则反操作即可)
  46. if(TRIM&0x01)EXTI->FTSR|=1<<BITx; //line BITx事件下降沿触发
  47. if(TRIM&0x02)EXTI->RTSR|=1<<BITx; //line BITx事件上升沿触发
  48. }
  49. //THUMB指令不支持汇编内联
  50. //采用如下方法实现执行汇编指令WFI
  51. void WFI_SET(void)
  52. {
  53. __ASM volatile("wfi");
  54. }
  55. //关闭所有中断(但是不包括fault和NMI中断)
  56. void INTX_DISABLE(void)
  57. {
  58. __ASM volatile("cpsid i");
  59. }
  60. //开启所有中断
  61. void INTX_ENABLE(void)
  62. {
  63. __ASM volatile("cpsie i");
  64. }
  65. //设置栈顶地址 __set_MSP(0x70002000);
  66. //进入待机模式
  67. void Sys_Standby(void)
  68. {
  69. SCB->SCR|=1<<2; //使能SLEEPDEEP位 (SYS->CTRL)
  70. RCC->APB1ENR|=1<<28;//使能电源时钟
  71. PWR->CSR|=1<<8; //设置WKUP用于唤醒
  72. PWR->CR|=1<<2; //清除Wake-up 标志
  73. PWR->CR|=1<<1; //PDDS置位
  74. WFI_SET(); //执行WFI指令,进入待机模式
  75. }
  76. //系统软复位
  77. void Sys_Soft_Reset(void)
  78. {
  79. SCB->AIRCR =0X05FA0000|(u32)0x04;
  80. }
  81. // TK499_NVIC_Init(2,2,TK80_IRQn,2);
  82. //设置NVIC
  83. //NVIC_PreemptionPriority:抢占优先级
  84. //NVIC_SubPriority :响应优先级
  85. //NVIC_Channel :中断编号
  86. //NVIC_Group :中断分组 0~4
  87. //注意优先级不能超过设定的组的范围!否则会有意想不到的错误
  88. //组划分:
  89. //组0:0位抢占优先级,4位响应优先级
  90. //组1:1位抢占优先级,3位响应优先级
  91. //组2:2位抢占优先级,2位响应优先级
  92. //组3:3位抢占优先级,1位响应优先级
  93. //组4:4位抢占优先级,0位响应优先级
  94. //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
  95. void TK499_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
  96. {
  97. u32 temp;
  98. NVIC_SetPriorityGrouping(NVIC_Group);//设置分组
  99. temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
  100. temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
  101. temp&=0xf; //取低四位
  102. NVIC->ISER[NVIC_Channel/32]|=1<<NVIC_Channel%32;//使能中断位(要清除的话,设置ICER对应位为1即可)
  103. NVIC->IP[NVIC_Channel]|=temp<<4; //设置响应优先级和抢断优先级
  104. }
  105. void TK80_IRQHandler(void)
  106. {
  107. if(TK80->SR & 0x1)
  108. {
  109. }
  110. if(TK80->SR & 0x2)
  111. {
  112. }
  113. if(TK80->SR & 0x4)
  114. {
  115. }
  116. if(TK80->SR & 0x8)
  117. {
  118. }
  119. TK80->SR |= 0;
  120. }
  121. //备用函数
  122. //#define T_SRAM_FUN1 0x20000400
  123. //copyAtoB((u32)LCD_PutPixel&0xFFFFFFFE,T_SRAM_FUN1,800);//加载函数到SRAM
  124. //void copyAtoB(u32 srcAdd,u32 dstAdd,u16 len)
  125. //{
  126. // len = (len + 3)/4;
  127. // while(len--)
  128. // {
  129. // *(u32*)dstAdd = *(u32*)srcAdd;
  130. // dstAdd += 4 ;
  131. // srcAdd +=4 ;
  132. // }
  133. //}