@TOC
一、關於窗口
1.建立項目文件夾
2.打開Keil->Create New Project,選擇剛剛建立的文件夾
3.在此文件夾裏建立工程模板,起個名字為Project
4.選擇器件型號,在此使用的是STM32C8T6
5.添加必要文件打開固件庫文件夾,可以看到啓動文件,全部複製下來,返回剛剛建立的工程模板文件夾
回到下圖文件夾 這個文件用來描述STM32和它對應的地址,下面2個system用來配置時鐘。複製此3個文件到Start裏面。如下圖
添加內核寄存器描述文件
複製2個文件到Start裏面。
工程必要文件添加完畢。 回到Keil工程中把剛剛複製的文件添加到工程中去。點擊選擇Source Group改成Start。右鍵,添加已存在的文件到組裏。
打開Start文件夾,將文件過濾器設置為"所有文件"
帶小鑰匙是隻讀文件,只用添加,不用修改 最後添加這個文件夾的頭文件路徑在工程選項裏點擊魔術棒,打開工程選項,在C/C++裏
點擊3個點按鈕,把Start的路徑添加進來
2.1 菜單介紹
接下來新建main函數,測試工程是否可行
打開工程文件夾,新建文件夾User,main函數就放在裏面
回到KEIL,在Target這裏右鍵,點擊添加組
改成User 添加新文件到User裏面
選中名為main.c的C文件,將其保存在User文件夾中。
首先在main.c文件中包含頭文件:
#include "stm32f10x.h"
接着編寫main函數:
int main(void)
{
// 主程序代碼
}
注意:文件末尾必須保留一個空行,否則會觸發編譯警告。
這時STM32寄存器配置完成了
下一步點擊“編譯並建立工程”建立寄存器點燈工程先調大字體
把編碼格式改為UTF-8,可以防止中文亂碼問題。點擊扳手->Editor->Encoding Tab鍵的大小選擇4
KEIL裏配置調試器,其默認為ULINK,用什麼調試器就選擇什麼調試器
然後重新編譯,點擊LOAD按鈕下載程序到32裏面。
配置寄存器點燈
1.打開STM32參考手冊,RCC寄存器,用來是能GPIOC的時鐘。GPIO都是APB2的外設
IOPCEN時鐘使能位配置説明:將該位置1(其他位保持0)。32位寄存器值為0000 0000 0000 0000 0000 0000 0001 0000,按4位一組轉換為十六進制表示為0x00000010。在KEIL開發環境中,需在while(1)死循環前添加寄存器配置語句:RCC->APB2ENR = 0x00000010。
回到KEIL,寫上GPIOC->CHR=0x00300000;
寫1的話,ODR的值是 0000 0000 0000 0000 0010 0000 0000 0000 轉化為16進制是 0x00002000。回到KEIL,寫上GPIO->ODR=0x00002000;
#include "stm32f10x.h" // Device header
int main(void)
{
RCC->APB2ENR = 0x00000010;
GPIOC->CRH = 0x00300000;
GPIOC->ODR = 0x00000000; //亮
// GPIOC->ODR = 0x00002000; //熄滅
while(1)
{
}
}
二、菜單欄
因為這個燈是低電平點亮,所以給ODR全為0就是亮。給ODR0x00002000就是滅。
此方法會影響到其他位,操作不方便。添加庫函數是一個好的選擇。添加庫函數
打開工程文件夾,新建Library存放庫函數
打開固件庫的文件夾,打開Librarues,STM32標準外設驅動,SRC
misc.c是內核的庫函數,其他都是內核外的外設庫函數。全選複製到Library文件夾裏
然後打開INC文件夾,裏面是庫函數的頭文件。全選複製
粘貼到Library
回到KEIL,右鍵Target,添加新組,改名字叫做Library然後右鍵,添加已存在的文件,打開Library,全選添加
所有庫函數文件添加完畢。
但是此庫函數還不能直接使用,還需添加文件
打開如下圖文件夾
conf是用來配置庫函數頭文件的包含關係,兩個IT文件用來存放中斷的,複製這3個文件到工程的User目錄下
再回到KEIL軟件,在User組裏,把那3個文件添加進來
最後需要一個宏定義。在頭文件右鍵,打開文件拉到最下面。可以看到一個宏定義,複製它
打開工程選項,在C/C++欄目下的Define粘貼它。這樣才能包含標準外設庫,也就是庫函數 下面還有頭文件路徑,把User和Library路徑都添加上
基於庫函數的工程建立完成。
我們需要更改的就是User組裏的文件,其他文件不用改。
庫函數點燈
1.使能時鐘函數RCC_APB2PeriphClockCmd()
有兩個參數,第一個選擇外設,第二個選擇新的狀態。可以右鍵跳打函數定義,在上面有函數的簡介和參數説明
2.1 菜單介紹
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main(void)
{
// RCC->APB2ENR = 0x00000010;
// GPIOC->CRH = 0x00300000;
// GPIOC->ODR = 0x00000000; //亮
//// GPIOC->ODR = 0x00002000; //熄滅
/*開啓時鐘*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //開啓GPIOA的時鐘
//使用各個外設前必須開啓時鐘,否則對外設的操作無效
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //GPIO模式,賦值為推輓輸出模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIO引腳,賦值為第0號引腳
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //GPIO速度,賦值為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //將賦值後的構體變量傳遞給GPIO_Init函數
//函數內部會自動根據結構體的參數配置相應寄存器
//實現GPIOA的初始化
/*主循環,循環體內的代碼會一直循環執行*/
while (1)
{
/*設置PA0引腳的高低電平,實現LED閃爍,下面展示3種方法*/
/*方法1:GPIO_ResetBits設置低電平,GPIO_SetBits設置高電平*/
GPIO_ResetBits(GPIOA, GPIO_Pin_0); //將PA0引腳設置為低電平
Delay_ms(500); //延時500ms
GPIO_SetBits(GPIOA, GPIO_Pin_0); //將PA0引腳設置為高電平
Delay_ms(500); //延時500ms
/*方法2:GPIO_WriteBit設置低/高電平,由Bit_RESET/Bit_SET指定*/
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //將PA0引腳設置為低電平
Delay_ms(500); //延時500ms
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //將PA0引腳設置為高電平
Delay_ms(500); //延時500ms
/*方法3:GPIO_WriteBit設置低/高電平,由數據0/1指定,數據需要強轉為BitAction類型*/
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)0); //將PA0引腳設置為低電平
Delay_ms(500); //延時500ms
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)1); //將PA0引腳設置為高電平
Delay_ms(500); //延時500ms
}
2.2 啓動文件的選擇
根據芯片型號
單片機的程序用於不會結束,所以最後一定有一個死循環。