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.

262 lines
7.9 KiB

4 years ago
  1. #include "sys.h"
  2. //////////////////////////////////////////////////////////////////////////////////
  3. //������ֻ��ѧϰʹ�ã�δ���������ɣ��������������κ���;
  4. //ALIENTEK STM32F407������
  5. //ϵͳʱ�ӳ�ʼ��
  6. //����ʱ������/�жϹ���/GPIO���õ�
  7. //����ԭ��@ALIENTEK
  8. //������̳:www.openedv.com
  9. //��������:2014/5/2
  10. //�汾��V1.1
  11. //��Ȩ���У������ؾ���
  12. //Copyright(C) �������������ӿƼ����޹�˾ 2014-2024
  13. //All rights reserved
  14. //********************************************************************************
  15. //�޸�˵��
  16. //V1.1 20150411
  17. //1,�޸�WFI_SET/INTX_DISABLE/INTX_ENABLE�Ⱥ�����ʵ�ַ�ʽ
  18. //2,�޸�SYSTEM_SUPPORT_UCOSΪSYSTEM_SUPPORT_OS
  19. //////////////////////////////////////////////////////////////////////////////////
  20. //����������ƫ�Ƶ�ַ
  21. //NVIC_VectTab:��ַ
  22. //Offset:ƫ����
  23. void MY_NVIC_SetVectorTable(u32 NVIC_VectTab,u32 Offset)
  24. {
  25. SCB->VTOR=NVIC_VectTab|(Offset&(u32)0xFFFFFE00);//����NVIC��������ƫ�ƼĴ���,VTOR��9λ����,��[8:0]������
  26. }
  27. //����NVIC����
  28. //NVIC_Group:NVIC���� 0~4 �ܹ�5��
  29. void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group)
  30. {
  31. u32 temp,temp1;
  32. temp1=(~NVIC_Group)&0x07;//ȡ����λ
  33. temp1<<=8;
  34. temp=SCB->AIRCR; //��ȡ��ǰ������
  35. temp&=0X0000F8FF; //������ǰ����
  36. temp|=0X05FA0000; //д��Կ��
  37. temp|=temp1;
  38. SCB->AIRCR=temp; //���÷���
  39. }
  40. //����NVIC
  41. //NVIC_PreemptionPriority:��ռ���ȼ�
  42. //NVIC_SubPriority :��Ӧ���ȼ�
  43. //NVIC_Channel :�жϱ���
  44. //NVIC_Group :�жϷ��� 0~4
  45. //ע�����ȼ����ܳ����趨�����ķ�Χ!�����������벻���Ĵ���
  46. //�黮��:
  47. //��0:0λ��ռ���ȼ�,4λ��Ӧ���ȼ�
  48. //��1:1λ��ռ���ȼ�,3λ��Ӧ���ȼ�
  49. //��2:2λ��ռ���ȼ�,2λ��Ӧ���ȼ�
  50. //��3:3λ��ռ���ȼ�,1λ��Ӧ���ȼ�
  51. //��4:4λ��ռ���ȼ�,0λ��Ӧ���ȼ�
  52. //NVIC_SubPriority��NVIC_PreemptionPriority��ԭ����,��ֵԽС,Խ����
  53. void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group)
  54. {
  55. u32 temp;
  56. MY_NVIC_PriorityGroupConfig(NVIC_Group);//���÷���
  57. temp=NVIC_PreemptionPriority<<(4-NVIC_Group);
  58. temp|=NVIC_SubPriority&(0x0f>>NVIC_Group);
  59. temp&=0xf; //ȡ����λ
  60. NVIC->ISER[NVIC_Channel/32]|=1<<NVIC_Channel%32;//ʹ���ж�λ(Ҫ�����Ļ�,����ICER��ӦλΪ1����)
  61. NVIC->IP[NVIC_Channel]|=temp<<4; //������Ӧ���ȼ����������ȼ�
  62. }
  63. //�ⲿ�ж����ú���
  64. //ֻ����GPIOA~I;������PVD,RTC,USB_OTG,USB_HS,��̫�����ѵ�
  65. //����:
  66. //GPIOx:0~8,����GPIOA~I
  67. //BITx:��Ҫʹ�ܵ�λ;
  68. //TRIM:����ģʽ,1,������;2,�Ͻ���;3��������ƽ����
  69. //�ú���һ��ֻ������1��IO��,����IO��,�����ε���
  70. //�ú������Զ�������Ӧ�ж�,�Լ�������
  71. void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM)
  72. {
  73. u8 EXTOFFSET=(BITx%4)*4;
  74. RCC->APB2ENR|=1<<14; //ʹ��SYSCFGʱ��
  75. SYSCFG->EXTICR[BITx/4]&=~(0x000F<<EXTOFFSET);//����ԭ�����ã�����
  76. SYSCFG->EXTICR[BITx/4]|=GPIOx<<EXTOFFSET; //EXTI.BITxӳ�䵽GPIOx.BITx
  77. //�Զ�����
  78. EXTI->IMR|=1<<BITx; //����line BITx�ϵ��ж�(����Ҫ��ֹ�жϣ��򷴲�������)
  79. if(TRIM&0x01)EXTI->FTSR|=1<<BITx; //line BITx���¼��½��ش���
  80. if(TRIM&0x02)EXTI->RTSR|=1<<BITx; //line BITx���¼��������ش���
  81. }
  82. //GPIO��������
  83. //GPIOx:GPIOA~GPIOI.
  84. //BITx:0~15,����IO���ű���.
  85. //AFx:0~15,����AF0~AF15.
  86. //AF0~15��������(���������г����õ�,��ϸ������407�����ֲ�,56ҳTable 7):
  87. //AF0:MCO/SWD/SWCLK/RTC AF1:TIM1/TIM2; AF2:TIM3~5; AF3:TIM8~11
  88. //AF4:I2C1~I2C3; AF5:SPI1/SPI2; AF6:SPI3; AF7:USART1~3;
  89. //AF8:USART4~6; AF9;CAN1/CAN2/TIM12~14 AF10:USB_OTG/USB_HS AF11:ETH
  90. //AF12:FSMC/SDIO/OTG/HS AF13:DCIM AF14: AF15:EVENTOUT
  91. void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx)
  92. {
  93. GPIOx->AFR[BITx>>3]&=~(0X0F<<((BITx&0X07)*4));
  94. GPIOx->AFR[BITx>>3]|=(u32)AFx<<((BITx&0X07)*4);
  95. }
  96. //GPIOͨ������
  97. //GPIOx:GPIOA~GPIOI.
  98. //BITx:0X0000~0XFFFF,λ����,ÿ��λ����һ��IO,��0λ����Px0,��1λ����Px1,��������.����0X0101,����ͬʱ����Px0��Px8.
  99. //MODE:0~3;ģʽѡ��,0,����(ϵͳ��λĬ��״̬);1,��ͨ����;2,���ù���;3,ģ������.
  100. //OTYPE:0/1;��������ѡ��,0,��������;1,��©����.
  101. //OSPEED:0~3;�����ٶ�����,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh.
  102. //PUPD:0~3:����������,0,����������;1,����;2,����;3,����.
  103. //ע��:������ģʽ(��ͨ����/ģ������)��,OTYPE��OSPEED������Ч!!
  104. void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD)
  105. {
  106. u32 pinpos=0,pos=0,curpin=0;
  107. for(pinpos=0;pinpos<16;pinpos++)
  108. {
  109. pos=1<<pinpos; //һ����λ����
  110. curpin=BITx&pos;//���������Ƿ�Ҫ����
  111. if(curpin==pos) //��Ҫ����
  112. {
  113. GPIOx->MODER&=~(3<<(pinpos*2)); //������ԭ��������
  114. GPIOx->MODER|=MODE<<(pinpos*2); //�����µ�ģʽ
  115. if((MODE==0X01)||(MODE==0X02)) //����������ģʽ/���ù���ģʽ
  116. {
  117. GPIOx->OSPEEDR&=~(3<<(pinpos*2)); //����ԭ��������
  118. GPIOx->OSPEEDR|=(OSPEED<<(pinpos*2));//�����µ��ٶ�ֵ
  119. GPIOx->OTYPER&=~(1<<pinpos) ; //����ԭ��������
  120. GPIOx->OTYPER|=OTYPE<<pinpos; //�����µ�����ģʽ
  121. }
  122. GPIOx->PUPDR&=~(3<<(pinpos*2)); //������ԭ��������
  123. GPIOx->PUPDR|=PUPD<<(pinpos*2); //�����µ�������
  124. }
  125. }
  126. }
  127. //THUMBָ�֧�ֻ�������
  128. //�������·���ʵ��ִ�л���ָ��WFI
  129. void WFI_SET(void)
  130. {
  131. __ASM volatile("wfi");
  132. }
  133. //�ر������ж�(���Dz�����fault��NMI�ж�)
  134. void INTX_DISABLE(void)
  135. {
  136. __ASM volatile("cpsid i");
  137. }
  138. //���������ж�
  139. void INTX_ENABLE(void)
  140. {
  141. __ASM volatile("cpsie i");
  142. }
  143. //����ջ����ַ
  144. //addr:ջ����ַ
  145. __asm void MSR_MSP(u32 addr)
  146. {
  147. MSR MSP, r0 //set Main Stack value
  148. BX r14
  149. }
  150. //��������ģʽ
  151. void Sys_Standby(void)
  152. {
  153. SCB->SCR|=1<<2; //ʹ��SLEEPDEEPλ (SYS->CTRL)
  154. RCC->APB1ENR|=1<<28;//ʹ�ܵ�Դʱ��
  155. PWR->CSR|=1<<8; //����WKUP���ڻ���
  156. PWR->CR|=1<<2; //����Wake-up ��־
  157. PWR->CR|=1<<1; //PDDS��λ
  158. WFI_SET(); //ִ��WFIָ��,��������ģʽ
  159. }
  160. //ϵͳ����λ
  161. void Sys_Soft_Reset(void)
  162. {
  163. SCB->AIRCR =0X05FA0000|(u32)0x04;
  164. }
  165. //ʱ�����ú���
  166. //Fvco=Fs*(plln/pllm);
  167. //Fsys=Fvco/pllp=Fs*(plln/(pllm*pllp));
  168. //Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));
  169. //Fvco:VCOƵ��
  170. //Fsys:ϵͳʱ��Ƶ��
  171. //Fusb:USB,SDIO,RNG�ȵ�ʱ��Ƶ��
  172. //Fs:PLL����ʱ��Ƶ��,������HSI,HSE��.
  173. //plln:��PLL��Ƶϵ��(PLL��Ƶ),ȡֵ��Χ:64~432.
  174. //pllm:��PLL����ƵPLL��Ƶϵ��(PLL֮ǰ�ķ�Ƶ),ȡֵ��Χ:2~63.
  175. //pllp:ϵͳʱ�ӵ���PLL��Ƶϵ��(PLL֮���ķ�Ƶ),ȡֵ��Χ:2,4,6,8.(������4��ֵ!)
  176. //pllq:USB/SDIO/�������������ȵ���PLL��Ƶϵ��(PLL֮���ķ�Ƶ),ȡֵ��Χ:2~15.
  177. //�ⲿ����Ϊ8M��ʱ��,�Ƽ�ֵ:plln=336,pllm=8,pllp=2,pllq=7.
  178. //�õ�:Fvco=8*(336/8)=336Mhz
  179. // Fsys=336/2=168Mhz
  180. // Fusb=336/7=48Mhz
  181. //����ֵ:0,�ɹ�;1,ʧ�ܡ�
  182. u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq)
  183. {
  184. u16 retry=0;
  185. u8 status=0;
  186. RCC->CR|=1<<16; //HSE ����
  187. while(((RCC->CR&(1<<17))==0)&&(retry<0X1FFF))retry++;//�ȴ�HSE RDY
  188. if(retry==0X1FFF)status=1; //HSE�޷�����
  189. else
  190. {
  191. RCC->APB1ENR|=1<<28; //��Դ�ӿ�ʱ��ʹ��
  192. PWR->CR|=3<<14; //������ģʽ,ʱ�ӿɵ�168Mhz
  193. RCC->CFGR|=(0<<4)|(5<<10)|(4<<13);//HCLK ����Ƶ;APB1 4��Ƶ;APB2 2��Ƶ.
  194. RCC->CR&=~(1<<24); //�ر���PLL
  195. RCC->PLLCFGR=pllm|(plln<<6)|(((pllp>>1)-1)<<16)|(pllq<<24)|(1<<22);//������PLL,PLLʱ��Դ����HSE
  196. RCC->CR|=1<<24; //������PLL
  197. while((RCC->CR&(1<<25))==0);//�ȴ�PLL׼����
  198. FLASH->ACR|=1<<8; //ָ��Ԥȡʹ��.
  199. FLASH->ACR|=1<<9; //ָ��cacheʹ��.
  200. FLASH->ACR|=1<<10; //����cacheʹ��.
  201. FLASH->ACR|=5<<0; //5��CPU�ȴ�����.
  202. RCC->CFGR&=~(3<<0); //����
  203. RCC->CFGR|=2<<0; //ѡ����PLL��Ϊϵͳʱ��
  204. while((RCC->CFGR&(3<<2))!=(2<<2));//�ȴ���PLL��Ϊϵͳʱ�ӳɹ�.
  205. }
  206. return status;
  207. }
  208. //ϵͳʱ�ӳ�ʼ������
  209. //plln:��PLL��Ƶϵ��(PLL��Ƶ),ȡֵ��Χ:64~432.
  210. //pllm:��PLL����ƵPLL��Ƶϵ��(PLL֮ǰ�ķ�Ƶ),ȡֵ��Χ:2~63.
  211. //pllp:ϵͳʱ�ӵ���PLL��Ƶϵ��(PLL֮���ķ�Ƶ),ȡֵ��Χ:2,4,6,8.(������4��ֵ!)
  212. //pllq:USB/SDIO/�������������ȵ���PLL��Ƶϵ��(PLL֮���ķ�Ƶ),ȡֵ��Χ:2~15.
  213. void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq)
  214. {
  215. RCC->CR|=0x00000001; //����HISON,�����ڲ�����RC����
  216. RCC->CFGR=0x00000000; //CFGR����
  217. RCC->CR&=0xFEF6FFFF; //HSEON,CSSON,PLLON����
  218. RCC->PLLCFGR=0x24003010; //PLLCFGR�ָ���λֵ
  219. RCC->CR&=~(1<<18); //HSEBYP����,�ⲿ��������·
  220. RCC->CIR=0x00000000; //��ֹRCCʱ���ж�
  221. Sys_Clock_Set(plln,pllm,pllp,pllq);//����ʱ��
  222. //����������
  223. #ifdef VECT_TAB_RAM
  224. MY_NVIC_SetVectorTable(1<<29,0x0);
  225. #else
  226. MY_NVIC_SetVectorTable(0,0x0);
  227. #endif
  228. }