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.

264 lines
7.5 KiB

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