建立寄存器的項目模闆相對比較簡單,這裡是基于庫檔案的模闆進行更改的,有不明白的小夥伴可以浏覽STM32建立模闆之庫檔案。
一、項目檔案
- 拷貝庫檔案的工程模闆重命名為“stm32f10x_register”
STM32建立模闆之寄存器 - 删除STM32F10x_FWLib檔案
STM32建立模闆之寄存器 - 删除CMSIS中不要的檔案,保留startup、core_cm3.h、stm32f10x.h檔案
STM32建立模闆之寄存器 - 删除USER中不要的檔案,保留main.c檔案,其餘的全部删除,并建立sys.c和sys.h檔案
STM32建立模闆之寄存器
二、建立工程項目
- 打開Keil軟體,建立項目,項目名為STM32F10x_Temp
STM32建立模闆之寄存器 STM32建立模闆之寄存器 STM32建立模闆之寄存器 - 添加GROUP,添加兩個個GROUP,并改名為startup、USER
STM32建立模闆之寄存器 STM32建立模闆之寄存器 STM32建立模闆之寄存器 - 為每個GROUP添加檔案
- startup,将檔案startup_stm32f10x_hd.s添加到startup下
STM32建立模闆之寄存器 - USER,将檔案main.c、sys.c檔案添加到USER下
STM32建立模闆之寄存器 - 添加完成後如下圖所示:
STM32建立模闆之寄存器
- 設定編譯檔案的輸出路徑
STM32建立模闆之寄存器 STM32建立模闆之寄存器 STM32建立模闆之寄存器 - 設定預設編譯版本
STM32建立模闆之寄存器 - 設定頭檔案路徑
STM32建立模闆之寄存器
三、程式修改
- 修改startup_stm32f10x_hd.s 将圖中的内容更改後如下圖所示:
STM32建立模闆之寄存器 STM32建立模闆之寄存器 - sys.c檔案
#include "stm32f10x.h"
#define uint unsigned int
#define uchar unsigned char
#define CLOCK 72/8 //時鐘=72M
/*------------------------------------------------------------
us延時函數
------------------------------------------------------------*/
void delay_us(unsigned int us)
{
u8 n;
while(us--)for(n=0;n<CLOCK;n++);
}
/*------------------------------------------------------------
ms延時函數
------------------------------------------------------------*/
void delay_ms(unsigned int ms)
{
while(ms--)delay_us(1000);
}
/*------------------------------------------------------------
把所有時鐘寄存器複位
------------------------------------------------------------*/
void RCC_DeInit(void)
{
RCC->APB2RSTR = 0x00000000;//外設複位
RCC->APB1RSTR = 0x00000000;
RCC->AHBENR = 0x00000014; //flash時鐘,閃存時鐘使能.DMA時鐘關閉
RCC->APB2ENR = 0x00000000; //外設時鐘關閉.
RCC->APB1ENR = 0x00000000;
RCC->CR |= 0x00000001; //使能内部高速時鐘HSION
RCC->CFGR &= 0xF8FF0000; //複位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]
RCC->CR &= 0xFEF6FFFF; //複位HSEON,CSSON,PLLON
RCC->CR &= 0xFFFBFFFF; //複位HSEBYP
RCC->CFGR &= 0xFF80FFFF; //複位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE
RCC->CIR = 0x00000000; //關閉所有中斷
}
/*------------------------------------------------------------
外部8M,則得到72M的系統時鐘
------------------------------------------------------------*/
void Stm32_Clock_Init(void)
{
unsigned char temp=0;
u8 timeout=0;
RCC_DeInit();
RCC->CR|=0x00010000; //外部高速時鐘使能HSEON
timeout=0;
while(!(RCC->CR>>17)&&timeout<200)timeout++;//等待外部時鐘就緒
//0-24M 等待0;24-48M 等待1;48-72M等待2;(非常重要!)
FLASH->ACR|=0x32;//FLASH 2個延時周期
RCC->CFGR|=0X001D2400;//APB1/2=DIV2;AHB=DIV1;PLL=9*CLK;HSE作為PLL時鐘源
RCC->CR|=0x01000000; //PLLON
timeout=0;
while(!(RCC->CR>>25)&&timeout<200)timeout++;//等待PLL鎖定
RCC->CFGR|=0x00000002;//PLL作為系統時鐘
while(temp!=0x02&&timeout<200) //等待PLL作為系統時鐘設定成功
{
temp=RCC->CFGR>>2;
timeout++;
temp&=0x03;
}
}
- sys.h檔案
#ifndef __SYS_H
#define __SYS_H
//us延時函數
void delay_us(unsigned int us);
//ms延時函數
void delay_ms(unsigned int ms);
//把所有時鐘寄存器複位
void RCC_DeInit(void);
//外部8M,則得到72M的系統時鐘
void Stm32_Clock_Init(void);
#endif
- main.c檔案
#include "stm32f10x.h"
#include "sys.h"
/*------------------------------------------------------------
主函數
------------------------------------------------------------*/
int main()
{
Stm32_Clock_Init();//系統時鐘設定
RCC->APB2ENR |= 0x00000001; //開啟afio時鐘
//AFIO->MAPR = (0x00FFFFFF & AFIO->MAPR)|0x04000000; //關閉JTAG
RCC->APB2ENR|=0X0000001c;//先使能外設IO PORTa,b,c時鐘
GPIOB->CRH=0X33333333; //推挽輸出
GPIOB->CRL=0X33333333; //推挽輸出
while (1)
{
delay_ms(1000);
GPIOB->ODR=0; //全部輸出0
delay_ms(1000);
GPIOB->ODR=0xffffffff; //全部輸出1
}
}
四、編譯下載下傳
- 編譯程式
STM32建立模闆之寄存器 - 通過isp下載下傳程式
STM32建立模闆之寄存器 - 下載下傳完成後,可以看到LED燈會進行閃爍則說明項目建立成功,到此寄存器闆的工程模闆比庫檔案的建立簡單。
如本部落格的内容侵犯了你的權益,請與以下位址聯系,本人獲知後,馬上删除。同時本人深表歉意,并緻以崇高的謝意!