|
關(guān)于STM32寄存器工程入門之點(diǎn)亮一顆LED
以下為自己學(xué)習(xí)寄存器版本STM3整理后的工程,使用位段方法方法實(shí)現(xiàn)。帶詳細(xì)注釋備注,可供學(xué)習(xí)參考。
單片機(jī)源程序如下:
- #include "sys.h"
- #include "stm32f407xx.h"
- //////////////////////////////////////////////////////////////////////////////////
- //ALIENTEK STM32F407開發(fā)板
- //系統(tǒng)時(shí)鐘初始化
- //包括時(shí)鐘設(shè)置/中斷管理/GPIO設(shè)置等
- //創(chuàng)建日期:2017.9.12
- //********************************************************************************
- //GPIOF設(shè)置
- //MODE:0~3;模式選擇,0,輸入(系統(tǒng)復(fù)位默認(rèn)狀態(tài));1,普通輸出;2,復(fù)用功能;3,模擬輸入.
- //OTYPE:0/1;輸出類型選擇,0,推挽輸出;1,開漏輸出.
- //OSPEED:0~3;輸出速度設(shè)置,0,2Mhz;1,25Mhz;2,50Mhz;3,100Mh.
- //PUPD:0~3:上下拉設(shè)置,0,不帶上下拉;1,上拉;2,下拉;3,保留.
- //注意:在輸入模式(普通輸入/模擬輸入)下,OTYPE和OSPEED參數(shù)無效!!
- void GPIOF_Set(u8 pin,u8 mode, u8 otype,u8 ospeed,u8 updow)
- {
- //配置為輸出
- GPIOF_MODER &=~(3<<(pin*2)); //先清除原來的設(shè)置 1111 01 1111
- GPIOF_MODER |=(mode<<(pin*2); //設(shè)置新的模式
- //配置2M響應(yīng)速度
- GPIOF_OSPEEDR &=~(3<<(pin*2)); //清除原來的設(shè)置
- GPIOF_OSPEEDR |=(ospeed<<(pin*2));//設(shè)置新的速度值
- //配置推挽還是開漏
- GPIOF_OTYPER &=~(1<<pin) ; //清除原來的設(shè)置
- GPIOF_OTYPER|=otype<<pin; //設(shè)置新的輸出模式
- //配置是否采用上下拉
- GPIOF_PUPD &=~(3<<(pin*2)); //先清除原來的設(shè)置
- GPIOF_PUPD |=updow<<(pin*2); //設(shè)置新的上下拉
- }
- //時(shí)鐘設(shè)置函數(shù)
- //Fvco=Fs*(plln/pllm);
- //Fsys=Fvco/pllp=Fs*(plln/(pllm*pllp));
- //Fusb=Fvco/pllq=Fs*(plln/(pllm*pllq));
- //Fvco:VCO頻率
- //Fsys:系統(tǒng)時(shí)鐘頻率
- //Fusb:USB,SDIO,RNG等的時(shí)鐘頻率
- //Fs:PLL輸入時(shí)鐘頻率,可以是HSI,HSE等.
- //plln:主PLL倍頻系數(shù)(PLL倍頻),取值范圍:64~432.
- //pllm:主PLL和音頻PLL分頻系數(shù)(PLL之前的分頻),取值范圍:2~63.
- //pllp:系統(tǒng)時(shí)鐘的主PLL分頻系數(shù)(PLL之后的分頻),取值范圍:2,4,6,8.(僅限這4個值!)
- //pllq:USB/SDIO/隨機(jī)數(shù)產(chǎn)生器等的主PLL分頻系數(shù)(PLL之后的分頻),取值范圍:2~15.
- //外部晶振為8M的時(shí)候,推薦值: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 開啟,開啟外部高速時(shí)鐘
- while(((RCC_CR&(1<<17))==0)&&(retry<0X1FFF))retry++;//等待HSE RDY
- if(retry==0X1FFF)status=1; //HSE無法就緒
- else
- {
- RCC_APB1ENR | =1<<28; //電源接口時(shí)鐘使能
- PWR_CR | =3<<14; //高性能模式,時(shí)鐘可到168Mhz
- RCC_CFGR | =(0<<4)|(5<<10)|(4<<13);//HCLK 不分頻;APB1 4分頻,42M;APB2 2分頻.84M
- RCC_CR & =~(1<<24); //關(guān)閉主PLL
- RCC_PLLCFGR=pllm|(plln<<6)|(((pllp>>1)-1)<<16)|(pllq<<24)|(1<<22);//配置主PLL,PLL時(shí)鐘源來自HSE
- RCC_CR | =1<<24; //打開主PLL
- while((RCC_CR &(1<<25))==0);//等待PLL準(zhǔn)備好
- FLASH_ACR | =1<<8; //指令預(yù)取使能.
- FLASH_ACR | =1<<9; //指令cache使能.
- FLASH_ACR | =1<<10; //數(shù)據(jù)cache使能.
- FLASH_ACR | =5<<0; //5個CPU等待周期.
- RCC_CFGR & =~(3<<0); //清零
- RCC_CFGR | =2<<0; //選擇主PLL作為系統(tǒng)時(shí)鐘
- while((RCC_CFGR & (3<<2))!=(2<<2));//等待主PLL作為系統(tǒng)時(shí)鐘成功.
- }
- return status;
- }
- //系統(tǒng)時(shí)鐘初始化函數(shù)
- //plln:主PLL倍頻系數(shù)(PLL倍頻),取值范圍:64~432.
- //pllm:主PLL和音頻PLL分頻系數(shù)(PLL之前的分頻),取值范圍:2~63.
- //pllp:系統(tǒng)時(shí)鐘的主PLL分頻系數(shù)(PLL之后的分頻),取值范圍:2,4,6,8.(僅限這4個值!)
- //pllq:USB/SDIO/隨機(jī)數(shù)產(chǎn)生器等的主PLL分頻系數(shù)(PLL之后的分頻),取值范圍:2~15.
- void STM32_Glock_Init(u32 plln,u32 pllm,u32 pllp,u32pllq)
- {
- RCC_CR | =0x00000001; //設(shè)置HISON,開啟內(nèi)部高速RC振蕩。開啟內(nèi)部高速時(shí)鐘
- RCC_CFGR=0x00000000; //CFGR清零
- RCC_CR & =0xFEF6FFFF; //HSEON,CSSON,PLLON清零 ,F(xiàn)1110F0110FFFF
- RCC_PLLCFGR=0x24003010; //PLLCFGR恢復(fù)復(fù)位值
- RCC_CR & =~(1<<18); //HSEBYP清零,外部晶振不旁路
- RCC_CIR=0x00000000; //禁止RCC時(shí)鐘中斷 。C:時(shí)鐘。I:中斷
- Sys_Clock_Set(plln,pllm,pllp,pllq);//設(shè)置時(shí)鐘 ,啟動外部時(shí)鐘,配置
- }
復(fù)制代碼
所有資料51hei提供下載:
點(diǎn)亮一顆LED燈.rar
(118.58 KB, 下載次數(shù): 36)
2017-12-25 20:38 上傳
點(diǎn)擊文件名下載附件
|
評分
-
查看全部評分
|