|
|
#include "sys.h"
//////////////////////////////////////////////////////////////////////////////////
//������ֻ��ѧϰʹ�ã�δ���������ɣ��������������κ���;
//ALIENTEK STM32F407������
//ϵͳʱ�ӳ�ʼ��
//����ʱ������/�жϹ���/GPIO���õ�
//����ԭ��@ALIENTEK
//������̳:www.openedv.com
//��������:2014/5/2
//�汾��V1.1
//��Ȩ���У������ؾ���
//Copyright(C) �������������ӿƼ�����˾ 2014-2024
//All rights reserved
//********************************************************************************
//��˵��
//V1.1 20150411
//1,��WFI_SET/INTX_DISABLE/INTX_ENABLE�Ⱥ�����ʵ�ַ�ʽ
//2,��SYSTEM_SUPPORT_UCOSΪSYSTEM_SUPPORT_OS
//////////////////////////////////////////////////////////////////////////////////
//����������ƫ�Ƶ�ַ
//NVIC_VectTab:��ַ
//Offset:ƫ����
void MY_NVIC_SetVectorTable(u32 NVIC_VectTab,u32 Offset) { SCB->VTOR=NVIC_VectTab|(Offset&(u32)0xFFFFFE00);//����NVIC��������ƫ�ƼĴ���,VTOR��9λ����,��[8:0]������
} //����NVIC����
//NVIC_Group:NVIC���� 0~4 �ܹ�5��
void MY_NVIC_PriorityGroupConfig(u8 NVIC_Group) { u32 temp,temp1; temp1=(~NVIC_Group)&0x07;//ȡ����λ
temp1<<=8; temp=SCB->AIRCR; //��ȡ��ǰ������
temp&=0X0000F8FF; //������ǰ����
temp|=0X05FA0000; //д��Կ��
temp|=temp1; SCB->AIRCR=temp; //���÷���
} //����NVIC
//NVIC_PreemptionPriority:��ռ���ȼ�
//NVIC_SubPriority :��Ӧ���ȼ�
//NVIC_Channel :�жϱ���
//NVIC_Group :�жϷ��� 0~4
//ע�����ȼ����ܳ����趨�����ķ�Χ!�����������벻���Ĵ���
//�黮��:
//��0:0λ��ռ���ȼ�,4λ��Ӧ���ȼ�
//��1:1λ��ռ���ȼ�,3λ��Ӧ���ȼ�
//��2:2λ��ռ���ȼ�,2λ��Ӧ���ȼ�
//��3:3λ��ռ���ȼ�,1λ��Ӧ���ȼ�
//��4:4λ��ռ���ȼ�,0λ��Ӧ���ȼ�
//NVIC_SubPriority��NVIC_PreemptionPriority��ԭ����,��ֵԽС,Խ����
void MY_NVIC_Init(u8 NVIC_PreemptionPriority,u8 NVIC_SubPriority,u8 NVIC_Channel,u8 NVIC_Group) { u32 temp; MY_NVIC_PriorityGroupConfig(NVIC_Group);//���÷���
temp=NVIC_PreemptionPriority<<(4-NVIC_Group); temp|=NVIC_SubPriority&(0x0f>>NVIC_Group); temp&=0xf; //ȡ����λ
NVIC->ISER[NVIC_Channel/32]|=1<<NVIC_Channel%32;//ʹ���ж�λ(Ҫ�����Ļ�,����ICER��ӦλΪ1����)
NVIC->IP[NVIC_Channel]|=temp<<4; //������Ӧ���ȼ����������ȼ�
} //�ⲿ�ж����ú���
//ֻ����GPIOA~I;������PVD,RTC,USB_OTG,USB_HS,��̫�����ѵ�
//����:
//GPIOx:0~8,����GPIOA~I
//BITx:��Ҫʹ�ܵ�λ;
//TRIM:����ģʽ,1,������;2,�Ͻ���;3��������ƽ����
//�ú���һ��ֻ������1��IO��,����IO��,�����ε���
//�ú������Զ�������Ӧ�ж�,�Լ�������
void Ex_NVIC_Config(u8 GPIOx,u8 BITx,u8 TRIM) { u8 EXTOFFSET=(BITx%4)*4; RCC->APB2ENR|=1<<14; //ʹ��SYSCFGʱ��
SYSCFG->EXTICR[BITx/4]&=~(0x000F<<EXTOFFSET);//����ԭ�����ã�����
SYSCFG->EXTICR[BITx/4]|=GPIOx<<EXTOFFSET; //EXTI.BITxӳ�䵽GPIOx.BITx
//�Զ�����
EXTI->IMR|=1<<BITx; //����line BITx�ϵ��ж�(����Ҫ��ֹ�жϣ���������)
if(TRIM&0x01)EXTI->FTSR|=1<<BITx; //line BITx���¼��½��ش���
if(TRIM&0x02)EXTI->RTSR|=1<<BITx; //line BITx���¼��������ش���
} //GPIO��������
//GPIOx:GPIOA~GPIOI.
//BITx:0~15,����IO���ű���.
//AFx:0~15,����AF0~AF15.
//AF0~15��������(���������г����õ�,��ϸ������407�����ֲ�,56ҳTable 7):
//AF0:MCO/SWD/SWCLK/RTC AF1:TIM1/TIM2; AF2:TIM3~5; AF3:TIM8~11
//AF4:I2C1~I2C3; AF5:SPI1/SPI2; AF6:SPI3; AF7:USART1~3;
//AF8:USART4~6; AF9;CAN1/CAN2/TIM12~14 AF10:USB_OTG/USB_HS AF11:ETH
//AF12:FSMC/SDIO/OTG/HS AF13:DCIM AF14: AF15:EVENTOUT
void GPIO_AF_Set(GPIO_TypeDef* GPIOx,u8 BITx,u8 AFx) { GPIOx->AFR[BITx>>3]&=~(0X0F<<((BITx&0X07)*4)); GPIOx->AFR[BITx>>3]|=(u32)AFx<<((BITx&0X07)*4); } //GPIOͨ������
//GPIOx:GPIOA~GPIOI.
//BITx:0X0000~0XFFFF,λ����,ÿ��λ����һ��IO,��0λ����Px0,��1λ����Px1,��������.����0X0101,����ͬʱ����Px0��Px8.
//MODE:0~3;ģʽѡ��,0,����(ϵͳ��λĬ��״̬);1,��ͨ����;2,���ù���;3,ģ������.
//OTYPE:0/1;��������ѡ��,0,��������;1,��©����.
//OSPEED:0~3;�����ٶ�����,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh.
//PUPD:0~3:����������,0,����������;1,����;2,����;3,����.
//ע��:������ģʽ(��ͨ����/ģ������)��,OTYPE��OSPEED������Ч!!
void GPIO_Set(GPIO_TypeDef* GPIOx,u32 BITx,u32 MODE,u32 OTYPE,u32 OSPEED,u32 PUPD) { u32 pinpos=0,pos=0,curpin=0; for(pinpos=0;pinpos<16;pinpos++) { pos=1<<pinpos; //һ����λ����
curpin=BITx&pos;//���������Ƿ�Ҫ����
if(curpin==pos) //��Ҫ����
{ GPIOx->MODER&=~(3<<(pinpos*2)); //������ԭ��������
GPIOx->MODER|=MODE<<(pinpos*2); //�����µ�ģʽ
if((MODE==0X01)||(MODE==0X02)) //����������ģʽ/���ù���ģʽ
{ GPIOx->OSPEEDR&=~(3<<(pinpos*2)); //����ԭ��������
GPIOx->OSPEEDR|=(OSPEED<<(pinpos*2));//�����µ��ٶ�ֵ
GPIOx->OTYPER&=~(1<<pinpos) ; //����ԭ��������
GPIOx->OTYPER|=OTYPE<<pinpos; //�����µ�����ģʽ
} GPIOx->PUPDR&=~(3<<(pinpos*2)); //������ԭ��������
GPIOx->PUPDR|=PUPD<<(pinpos*2); //�����µ�������
} } }
//THUMBָ�֧�ֻ�������
//�������·���ʵ��ִ�л���ָ��WFI
void WFI_SET(void) { __ASM volatile("wfi"); } //�ر������ж�(���Dz�����fault��NMI�ж�)
void INTX_DISABLE(void) { __ASM volatile("cpsid i"); } //���������ж�
void INTX_ENABLE(void) { __ASM volatile("cpsie i"); } //����ջ����ַ
//addr:ջ����ַ
__asm void MSR_MSP(u32 addr) { MSR MSP, r0 //set Main Stack value
BX r14 } //��������ģʽ
void Sys_Standby(void) { SCB->SCR|=1<<2; //ʹ��SLEEPDEEPλ (SYS->CTRL)
RCC->APB1ENR|=1<<28;//ʹ�ܵ�Դʱ��
PWR->CSR|=1<<8; //����WKUP���ڻ���
PWR->CR|=1<<2; //����Wake-up ��־
PWR->CR|=1<<1; //PDDS��λ
WFI_SET(); //ִ��WFIָ��,��������ģʽ
} //ϵͳ����λ
void Sys_Soft_Reset(void) { SCB->AIRCR =0X05FA0000|(u32)0x04; } //ʱ�����ú���
//Fvco=Fs*(plln/pllm);
//Fsys=Fvco/pllp=Fs*(plln/(pllm*pllp));
//Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));
//Fvco:VCOƵ��
//Fsys:ϵͳʱ��Ƶ��
//Fusb:USB,SDIO,RNG�ȵ�ʱ��Ƶ��
//Fs:PLL����ʱ��Ƶ��,������HSI,HSE��.
//plln:��PLL��Ƶϵ��(PLL��Ƶ),ȡֵ��Χ:64~432.
//pllm:��PLL����ƵPLL��Ƶϵ��(PLL֮ǰ�ķ�Ƶ),ȡֵ��Χ:2~63.
//pllp:ϵͳʱ�ӵ���PLL��Ƶϵ��(PLL֮���ķ�Ƶ),ȡֵ��Χ:2,4,6,8.(������4��ֵ!)
//pllq:USB/SDIO/�������������ȵ���PLL��Ƶϵ��(PLL֮���ķ�Ƶ),ȡֵ��Χ:2~15.
//�ⲿ����Ϊ8M��ʱ��,�Ƽ�ֵ:plln=336,pllm=8,pllp=2,pllq=7.
//�õ�:Fvco=8*(336/8)=336Mhz
// Fsys=336/2=168Mhz
// Fusb=336/7=48Mhz
//����ֵ:0,�ɹ�;1,ʧ�ܡ�
u8 Sys_Clock_Set(u32 plln,u32 pllm,u32 pllp,u32 pllq) { u16 retry=0; u8 status=0; RCC->CR|=1<<16; //HSE ����
while(((RCC->CR&(1<<17))==0)&&(retry<0X1FFF))retry++;//�ȴ�HSE RDY
if(retry==0X1FFF)status=1; //HSE������
else { RCC->APB1ENR|=1<<28; //��Դ�ӿ�ʱ��ʹ��
PWR->CR|=3<<14; //������ģʽ,ʱ�ӿɵ�168Mhz
RCC->CFGR|=(0<<4)|(5<<10)|(4<<13);//HCLK ����Ƶ;APB1 4��Ƶ;APB2 2��Ƶ.
RCC->CR&=~(1<<24); //�ر���PLL
RCC->PLLCFGR=pllm|(plln<<6)|(((pllp>>1)-1)<<16)|(pllq<<24)|(1<<22);//������PLL,PLLʱ��Դ����HSE
RCC->CR|=1<<24; //������PLL
while((RCC->CR&(1<<25))==0);//�ȴ�PLL����
FLASH->ACR|=1<<8; //ָ��Ԥȡʹ��.
FLASH->ACR|=1<<9; //ָ��cacheʹ��.
FLASH->ACR|=1<<10; //����cacheʹ��.
FLASH->ACR|=5<<0; //5��CPU�ȴ�����.
RCC->CFGR&=~(3<<0); //����
RCC->CFGR|=2<<0; //ѡ����PLL��Ϊϵͳʱ��
while((RCC->CFGR&(3<<2))!=(2<<2));//�ȴ���PLL��Ϊϵͳʱ�ӳɹ�.
} return status; }
//ϵͳʱ�ӳ�ʼ������
//plln:��PLL��Ƶϵ��(PLL��Ƶ),ȡֵ��Χ:64~432.
//pllm:��PLL����ƵPLL��Ƶϵ��(PLL֮ǰ�ķ�Ƶ),ȡֵ��Χ:2~63.
//pllp:ϵͳʱ�ӵ���PLL��Ƶϵ��(PLL֮���ķ�Ƶ),ȡֵ��Χ:2,4,6,8.(������4��ֵ!)
//pllq:USB/SDIO/�������������ȵ���PLL��Ƶϵ��(PLL֮���ķ�Ƶ),ȡֵ��Χ:2~15.
void Stm32_Clock_Init(u32 plln,u32 pllm,u32 pllp,u32 pllq) { RCC->CR|=0x00000001; //����HISON,�����ڲ�����RC����
RCC->CFGR=0x00000000; //CFGR����
RCC->CR&=0xFEF6FFFF; //HSEON,CSSON,PLLON����
RCC->PLLCFGR=0x24003010; //PLLCFGR�ָ���λֵ
RCC->CR&=~(1<<18); //HSEBYP����,�ⲿ��������·
RCC->CIR=0x00000000; //��ֹRCCʱ���ж�
Sys_Clock_Set(plln,pllm,pllp,pllq);//����ʱ��
//����������
#ifdef VECT_TAB_RAM
MY_NVIC_SetVectorTable(1<<29,0x0); #else
MY_NVIC_SetVectorTable(0,0x0); #endif
}
|