P100脱机下载器
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

261 lines
7.2 KiB

4 years ago
  1. #include "delay.h"
  2. #include "sys.h"
  3. //////////////////////////////////////////////////////////////////////////////////
  4. //����ʹ��OS,������������ͷ�ļ�����ucosΪ��������.
  5. #if SYSTEM_SUPPORT_OS
  6. #include "includes.h" //֧��OSʱ��ʹ��
  7. #endif
  8. //////////////////////////////////////////////////////////////////////////////////
  9. //������ֻ��ѧϰʹ�ã�δ���������ɣ��������������κ���;
  10. //ALIENTEK STM32F407������
  11. //ʹ��SysTick����ͨ����ģʽ���ӳٽ��й���(֧��OS)
  12. //����delay_us,delay_ms
  13. //����ԭ��@ALIENTEK
  14. //������̳:www.openedv.com
  15. //��������:2014/5/2
  16. //�汾��V1.3
  17. //��Ȩ���У������ؾ���
  18. //Copyright(C) �������������ӿƼ����޹�˾ 2014-2024
  19. //All rights reserved
  20. //********************************************************************************
  21. //�޸�˵��
  22. //V1.1 20140803
  23. //1,delay_us,���Ӳ�������0�ж�,������������0,��ֱ���˳�.
  24. //2,�޸�ucosii��,delay_ms����,����OSLockNesting���ж�,�ڽ����жϺ�,Ҳ����׼ȷ��ʱ.
  25. //V1.2 20150411
  26. //�޸�OS֧�ַ�ʽ,��֧������OS(������UCOSII��UCOSIII,����������OS������֧��)
  27. //����:delay_osrunning/delay_ostickspersec/delay_osintnesting�����궨��
  28. //����:delay_osschedlock/delay_osschedunlock/delay_ostimedly��������
  29. //V1.3 20150521
  30. //����UCOSIII֧��ʱ��2��bug��
  31. //delay_tickspersec����delay_ostickspersec
  32. //delay_intnesting����delay_osintnesting
  33. //////////////////////////////////////////////////////////////////////////////////
  34. static u8 fac_us=0; //us��ʱ������
  35. static u16 fac_ms=0; //ms��ʱ������,��os��,����ÿ�����ĵ�ms��
  36. #if SYSTEM_SUPPORT_OS //����SYSTEM_SUPPORT_OS������,˵��Ҫ֧��OS��(������UCOS).
  37. //��delay_us/delay_ms��Ҫ֧��OS��ʱ����Ҫ������OS���صĺ궨���ͺ�����֧��
  38. //������3���궨��:
  39. // delay_osrunning:���ڱ�ʾOS��ǰ�Ƿ���������,�Ծ����Ƿ�����ʹ�����غ���
  40. //delay_ostickspersec:���ڱ�ʾOS�趨��ʱ�ӽ���,delay_init������������������ʼ��systick
  41. // delay_osintnesting:���ڱ�ʾOS�ж�Ƕ�׼���,��Ϊ�ж����治���Ե���,delay_msʹ�øò�����������������
  42. //Ȼ����3������:
  43. // delay_osschedlock:��������OS��������,��ֹ����
  44. //delay_osschedunlock:���ڽ���OS��������,���¿�������
  45. // delay_ostimedly:����OS��ʱ,����������������.
  46. //�����̽���UCOSII��UCOSIII��֧��,����OS,�����вο�����ֲ
  47. //֧��UCOSII
  48. #ifdef OS_CRITICAL_METHOD //OS_CRITICAL_METHOD������,˵��Ҫ֧��UCOSII
  49. #define delay_osrunning OSRunning //OS�Ƿ����б���,0,������;1,������
  50. #define delay_ostickspersec OS_TICKS_PER_SEC //OSʱ�ӽ���,��ÿ�����ȴ���
  51. #define delay_osintnesting OSIntNesting //�ж�Ƕ�׼���,���ж�Ƕ�״���
  52. #endif
  53. //֧��UCOSIII
  54. #ifdef CPU_CFG_CRITICAL_METHOD //CPU_CFG_CRITICAL_METHOD������,˵��Ҫ֧��UCOSIII
  55. #define delay_osrunning OSRunning //OS�Ƿ����б���,0,������;1,������
  56. #define delay_ostickspersec OSCfg_TickRate_Hz //OSʱ�ӽ���,��ÿ�����ȴ���
  57. #define delay_osintnesting OSIntNestingCtr //�ж�Ƕ�׼���,���ж�Ƕ�״���
  58. #endif
  59. //us����ʱʱ,�ر���������(��ֹ����us���ӳ�)
  60. void delay_osschedlock(void)
  61. {
  62. #ifdef CPU_CFG_CRITICAL_METHOD //ʹ��UCOSIII
  63. OS_ERR err;
  64. OSSchedLock(&err); //UCOSIII�ķ�ʽ,��ֹ���ȣ���ֹ����us��ʱ
  65. #else //����UCOSII
  66. OSSchedLock(); //UCOSII�ķ�ʽ,��ֹ���ȣ���ֹ����us��ʱ
  67. #endif
  68. }
  69. //us����ʱʱ,�ָ���������
  70. void delay_osschedunlock(void)
  71. {
  72. #ifdef CPU_CFG_CRITICAL_METHOD //ʹ��UCOSIII
  73. OS_ERR err;
  74. OSSchedUnlock(&err); //UCOSIII�ķ�ʽ,�ָ�����
  75. #else //����UCOSII
  76. OSSchedUnlock(); //UCOSII�ķ�ʽ,�ָ�����
  77. #endif
  78. }
  79. //����OS�Դ�����ʱ������ʱ
  80. //ticks:��ʱ�Ľ�����
  81. void delay_ostimedly(u32 ticks)
  82. {
  83. #ifdef CPU_CFG_CRITICAL_METHOD
  84. OS_ERR err;
  85. OSTimeDly(ticks,OS_OPT_TIME_PERIODIC,&err);//UCOSIII��ʱ��������ģʽ
  86. #else
  87. OSTimeDly(ticks); //UCOSII��ʱ
  88. #endif
  89. }
  90. //systick�жϷ�������,ʹ��OSʱ�õ�
  91. void SysTick_Handler(void)
  92. {
  93. if(delay_osrunning==1) //OS��ʼ����,��ִ�������ĵ��ȴ���
  94. {
  95. OSIntEnter(); //�����ж�
  96. OSTimeTick(); //����ucos��ʱ�ӷ�������
  97. OSIntExit(); //���������л����ж�
  98. }
  99. }
  100. #endif
  101. //��ʼ���ӳٺ���
  102. //��ʹ��OS��ʱ��,�˺�������ʼ��OS��ʱ�ӽ���
  103. //SYSTICK��ʱ�ӹ̶�ΪAHBʱ�ӵ�1/8
  104. //SYSCLK:ϵͳʱ��Ƶ��
  105. void delay_init(u8 SYSCLK)
  106. {
  107. #if SYSTEM_SUPPORT_OS //������Ҫ֧��OS.
  108. u32 reload;
  109. #endif
  110. SysTick->CTRL&=~(1<<2); //SYSTICKʹ���ⲿʱ��Դ
  111. fac_us=SYSCLK/8; //�����Ƿ�ʹ��OS,fac_us����Ҫʹ��
  112. #if SYSTEM_SUPPORT_OS //������Ҫ֧��OS.
  113. reload=SYSCLK/8; //ÿ���ӵļ������� ��λΪM
  114. reload*=1000000/delay_ostickspersec; //����delay_ostickspersec�趨����ʱ��
  115. //reloadΪ24λ�Ĵ���,����ֵ:16777216,��168M��,Լ��0.7989s����
  116. fac_ms=1000/delay_ostickspersec; //����OS������ʱ�����ٵ�λ
  117. SysTick->CTRL|=1<<1; //����SYSTICK�ж�
  118. SysTick->LOAD=reload; //ÿ1/delay_ostickspersec���ж�һ��
  119. SysTick->CTRL|=1<<0; //����SYSTICK
  120. #else
  121. fac_ms=(u16)fac_us*1000; //��OS��,����ÿ��ms��Ҫ��systickʱ����
  122. #endif
  123. }
  124. #if SYSTEM_SUPPORT_OS //������Ҫ֧��OS.
  125. //��ʱnus
  126. //nus:Ҫ��ʱ��us��.
  127. //nus:0~204522252(����ֵ��2^32/fac_us@fac_us=21)
  128. void delay_us(u32 nus)
  129. {
  130. u32 ticks;
  131. u32 told,tnow,tcnt=0;
  132. u32 reload=SysTick->LOAD; //LOAD��ֵ
  133. ticks=nus*fac_us; //��Ҫ�Ľ�����
  134. delay_osschedlock(); //��ֹOS���ȣ���ֹ����us��ʱ
  135. told=SysTick->VAL; //�ս���ʱ�ļ�����ֵ
  136. while(1)
  137. {
  138. tnow=SysTick->VAL;
  139. if(tnow!=told)
  140. {
  141. if(tnow<told)tcnt+=told-tnow; //����ע��һ��SYSTICK��һ���ݼ��ļ������Ϳ�����.
  142. else tcnt+=reload-tnow+told;
  143. told=tnow;
  144. if(tcnt>=ticks)break; //ʱ�䳬��/����Ҫ�ӳٵ�ʱ��,���˳�.
  145. }
  146. };
  147. delay_osschedunlock(); //�ָ�OS����
  148. }
  149. //��ʱnms
  150. //nms:Ҫ��ʱ��ms��
  151. //nms:0~65535
  152. void delay_ms(u16 nms)
  153. {
  154. if(delay_osrunning&&delay_osintnesting==0)//����OS�Ѿ�������,���Ҳ������ж�����(�ж����治����������)
  155. {
  156. if(nms>=fac_ms) //��ʱ��ʱ������OS������ʱ������
  157. {
  158. delay_ostimedly(nms/fac_ms); //OS��ʱ
  159. }
  160. nms%=fac_ms; //OS�Ѿ��޷��ṩ��ôС����ʱ��,������ͨ��ʽ��ʱ
  161. }
  162. delay_us((u32)(nms*1000)); //��ͨ��ʽ��ʱ
  163. }
  164. #else //����ucosʱ
  165. //��ʱnus
  166. //nusΪҪ��ʱ��us��.
  167. //ע��:nus��ֵ,��Ҫ����798915us(����ֵ��2^24/fac_us@fac_us=21)
  168. void delay_us(u32 nus)
  169. {
  170. u32 temp;
  171. SysTick->LOAD=nus*fac_us; //ʱ������
  172. SysTick->VAL=0x00; //���ռ�����
  173. SysTick->CTRL=0x01 ; //��ʼ����
  174. do
  175. {
  176. temp=SysTick->CTRL;
  177. }while((temp&0x01)&&!(temp&(1<<16))); //�ȴ�ʱ�䵽��
  178. SysTick->CTRL=0x00; //�رռ�����
  179. SysTick->VAL =0X00; //���ռ�����
  180. }
  181. //��ʱnms
  182. //ע��nms�ķ�Χ
  183. //SysTick->LOADΪ24λ�Ĵ���,����,������ʱΪ:
  184. //nms<=0xffffff*8*1000/SYSCLK
  185. //SYSCLK��λΪHz,nms��λΪms
  186. //��168M������,nms<=798ms
  187. void delay_xms(u16 nms)
  188. {
  189. u32 temp;
  190. SysTick->LOAD=(u32)nms*fac_ms; //ʱ������(SysTick->LOADΪ24bit)
  191. SysTick->VAL =0x00; //���ռ�����
  192. SysTick->CTRL=0x01 ; //��ʼ����
  193. do
  194. {
  195. temp=SysTick->CTRL;
  196. }while((temp&0x01)&&!(temp&(1<<16))); //�ȴ�ʱ�䵽��
  197. SysTick->CTRL=0x00; //�رռ�����
  198. SysTick->VAL =0X00; //���ռ�����
  199. }
  200. //��ʱnms
  201. //nms:0~65535
  202. void delay_ms(u16 nms)
  203. {
  204. u8 repeat=nms/540; //������540,�ǿ��ǵ�ijЩ�ͻ����ܳ�Ƶʹ��,
  205. //���糬Ƶ��248M��ʱ��,delay_xms����ֻ����ʱ541ms������
  206. u16 remain=nms%540;
  207. while(repeat)
  208. {
  209. delay_xms(540);
  210. repeat--;
  211. }
  212. if(remain)delay_xms(remain);
  213. }
  214. #endif