標(biāo)題: 在 Keil uVision4 MDK下配置開(kāi)發(fā)STM32F103Z完整教程 [打印本頁(yè)]
作者: liuyuxi 時(shí)間: 2015-1-10 20:03
標(biāo)題: 在 Keil uVision4 MDK下配置開(kāi)發(fā)STM32F103Z完整教程
環(huán)境搭建:
1、安裝 Keil uVision4 MDK
略
2、安裝 J-Link
安裝 Setup_JLinkARM_V4501.exe 驅(qū)動(dòng)時(shí),會(huì)彈出【SEGGER J-Link DLL Updater V4.501 】對(duì)話框,
不要選擇 Keil 直接點(diǎn)擊OK即可,因?yàn)?/font>Keil對(duì)支持M3內(nèi)核SW接口采用了JL2CM3.dll 這個(gè)文件,該文
件的版本號(hào)是和該目錄下Jlink驅(qū)動(dòng)版本號(hào)配套的,不要擅自改變他們,否則不能使用。
建立工程:
1、在桌面上建立一個(gè)文件夾【MyStm32】文件夾
2、在【MyStm32】文件夾下建立【USER】、【FWlib】、【CMSIS】、【Output】、【Listing】文件夾。
【USER】:存放用戶自定義的應(yīng)用程序
【FWlib】:存放庫(kù)文件
【CMSIS】:存放M3系列單片機(jī)通用的文件
【Output】:存放編譯器編譯后輸出的文件
【Listing】:編譯器編譯過(guò)程中產(chǎn)生的文件
3、將STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver 的【inc】跟【src】
這兩個(gè)文件夾拷貝到【FWlib】。
【inc】、【src】片上外設(shè)驅(qū)動(dòng)的源文件和頭文件。
4、\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template 下的
main.c、stm32f10x_conf.h、stm32f10x_it.h、stm32f10x_it.c 、system_stm32f10x.c 拷貝到【USER】
stm32f10x_conf.h:配置文件
stm32f10x_it.h、stm32f10x_it.c:中斷函數(shù)文件。
system_stm32f10x.c:ARM公司提供的符合CMSIS標(biāo)準(zhǔn)的庫(kù)文件
5、STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup的
【arm】文件夾的拷貝到 MyStm32\CMSIS\startup。
這些都是用匯編編寫(xiě)的驅(qū)動(dòng)文件,STM32F103ZE芯片是大容量Flash,應(yīng)選擇startup_stm32f10x_hd.s
6、STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 的 core_cm3.c 和 core_cm3.h
也拷貝到【CMSIS】文件夾下。
7、STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 的
stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h 拷貝到【CMSIS】文件夾下。
8、用keil MDK 建立工程文件到【USER】文件夾下,工程名為【STM32-DEMO】
在該工程下建立四個(gè)組:
【STARTCODE】:存放啟動(dòng)代碼 添加 startup_stm32f10x_hd.s 文件
【USER】:存放用戶自定義的應(yīng)用程序 添加main.c、stm32f10x_it.c
【FWlib】:存放庫(kù)文件 按需添加src里面的驅(qū)動(dòng)文件
【CMSIS】:存放M3系列單片機(jī)通用的文件 添加core_cm3.c、system_stm32f10x.c
添加 USE_STDPERIPH_DRIVER 是為了屏蔽編譯器的默認(rèn)搜索路徑,轉(zhuǎn)而使用我們添加
到工程中的 ST 的庫(kù),添加 STM32F10X_HD 是因?yàn)槲覀冇玫男酒谴笕萘康模砑恿?/font>
STM32F10X_HD 這個(gè)宏之后,庫(kù)文件里面為大容量定義的寄存器我們就可以用了。
芯片是小或中容量的時(shí)候宏要換成STM32F10X_LD或者STM32F10X_MD。其實(shí)不管是什么容量的,
我們只要添加上 STM32F10X_HD 這個(gè)宏即可,當(dāng)你用小或者中容量的芯
片時(shí),那些為大容量定義的寄存器我不去訪問(wèn)就是了,反正也訪問(wèn)不了。
流水燈實(shí)驗(yàn):
只用到 配置GPIO功能和配置時(shí)鐘功能,所以在 stm32f10x_conf.h
只需要包含兩個(gè)頭文件即可:
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
流水燈流程:
1、開(kāi)啟指定GPIO的外設(shè)時(shí)鐘 -> RCC_APB2PeriphClockCmd()
2、設(shè)置 GPIO_InitTypeDef 指定引腳、工作狀態(tài)、輸出頻率
3、根據(jù) 調(diào)用GPIO_Init() 初始化IO -> GPIO_Init()
4、設(shè)置IO輸出高低電平,實(shí)現(xiàn)控制LED燈的亮滅。
led.c:
#include "led.h"
void LED_GPIO_Config(void)
{
// 定義一個(gè) GPIO_InitTypeDef 類型的結(jié)構(gòu)體
GPIO_InitTypeDef GPIO_InitStructure;
// 開(kāi)啟 GPIOC 的外設(shè)時(shí)鐘
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
// 選擇要控制的 GPIOC 引腳
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
// 設(shè)置引腳模式為通用推挽輸出
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
// 設(shè)置引腳速率為 50Mhz
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
// 調(diào)用庫(kù)函數(shù),初始化GPIOC
GPIO_Init(GPIOC, &GPIO_InitStructure);
// 設(shè)置GPIOC3、GPIOC4、GPIOC5 為高電平
GPIO_SetBits(GPIOC, GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5);
}
led.h:
#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
#include "stm32f10x_rcc.h"
#define ON 0
#define OFF 1
//帶參宏,可以向聯(lián)函數(shù)一樣使用
#define LED1(a) if(a) \
GPIO_SetBits(GPIOC, GPIO_Pin_3);\
else \
GPIO_ResetBits(GPIOC, GPIO_Pin_3)
#define LED2(a) if(a) \
GPIO_SetBits(GPIOC, GPIO_Pin_4);\
else \
GPIO_ResetBits(GPIOC, GPIO_Pin_4)
#define LED3(a) if(a) \
GPIO_SetBits(GPIOC, GPIO_Pin_5);\
else \
GPIO_ResetBits(GPIOC, GPIO_Pin_5)
void LED_GPIO_Config(void);
#endif
main.c
#include "stm32f10x.h"
#include "led.c"
void Delay(__IO u32 nCount)
{
for(; nCount !=0; nCount--);
}
int main(void)
{
LED_GPIO_Config();
while (1)
{
LED1(ON);
Delay(0x0FFFEF);
LED1(OFF);
Delay(0x0FFFEF);
}
}
-----------------------------------------------------------------------
1. typedef enum
2. {
3. GPIO_Speed_10MHz = 1, //枚舉常量,值為 1,代表輸出速率最高為 10MHz
4. GPIO_Speed_2MHz, //對(duì)不賦值的枚舉變量,自動(dòng)加 1,此常量值為 2
5. GPIO_Speed_50MHz //常量值為 3
6. }GPIOSpeed_TypeDef
1. typedef enum
2. {GPIO_Mode_AIN = 0x0, //模擬輸入模式
3. GPIO_Mode_IN_FLOATING = 0x04, //浮空輸入模式
4. GPIO_Mode_IPD = 0x28, //下拉輸入模式
5. GPIO_Mode_IPU = 0x48, //上拉輸入模式
6. GPIO_Mode_Out_OD = 0x14, //開(kāi)漏輸出模式
7. GPIO_Mode_Out_PP = 0x10, //通用推挽輸出模式
8. GPIO_Mode_AF_OD = 0x1C, //復(fù)用功能開(kāi)漏輸出
9. GPIO_Mode_AF_PP = 0x18 //復(fù)用功能推挽輸出
10. }GPIOMode_TypeDef;
1. typedef struct
2. {
3. uint16_t GPIO_Pin; /*指定將要進(jìn)行配置的 GPIO 引腳*/
4. GPIOSpeed_TypeDef GPIO_Speed; /*指定 GPIO 引腳可輸出的最高頻率*/
5. GPIOMode_TypeDef GPIO_Mode; /*指定 GPIO 引腳將要配置成的工作狀態(tài)*/
6. }GPIO_InitTypeDef;
實(shí)例:
31. /*選擇要控制的 GPIOC 引腳*/
32. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
33.
34. /*設(shè)置引腳模式為通用推挽輸出*/
35. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
36.
37. /*設(shè)置引腳速率為 50MHz */
38. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
-----------------------------------------------------------------------
GPIO控制:
void GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_InitStruct);
功能:根據(jù) GPIOx 初始化GPIO
參數(shù)1:允許指為 GPIOA、GPIOB、GPIOC...GPIOG
參數(shù)2:GPIO_InitTypeDef 類型的指針,包含了指定引腳、輸出工作狀態(tài)和頻率
實(shí)例:
40. /*調(diào)用庫(kù)函數(shù),初始化 GPIOC*/
41. GPIO_Init(GPIOC, &GPIO_InitStructure);
void GPIO_SetBits ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
功能:設(shè)置GPIO引腳輸出高電平
參數(shù)1:允許指為 GPIOA、GPIOB、GPIOC...GPIOG
參數(shù)2:要控制的引腳號(hào) Pin0~Pin15
void GPIO_ResetBits ( GPIO_TypeDef * GPIOx, uint16_t GPIO_Pin)
功能:設(shè)置GPIO引腳輸出低電平
參數(shù)1:允許指為 GPIOA、GPIOB、GPIOC...GPIOG
參數(shù)2:要控制的引腳號(hào) Pin0~Pin15
-----------------------------------------------------------------------
外設(shè)時(shí)鐘控制:
void RCC_APB2PeriphResetCmd ( uint32_t RCC_APB2Periph, FunctionalState NewState)
功能:開(kāi)啟或關(guān)閉的掛接在APB2總線上的外設(shè)時(shí)鐘
參數(shù)1:
RCC_APB2Periph_AFIO,
RCC_APB2Periph_GPIOA,
RCC_APB2Periph_GPIOB,
RCC_APB2Periph_GPIOC,
RCC_APB2Periph_GPIOD,
RCC_APB2Periph_GPIOE,
RCC_APB2Periph_GPIOF,
RCC_APB2Periph_GPIOG,
RCC_APB2Periph_ADC1,
RCC_APB2Periph_ADC2,
RCC_APB2Periph_TIM1,
RCC_APB2Periph_SPI1,
RCC_APB2Periph_TIM8,
RCC_APB2Periph_USART1,
RCC_APB2Periph_ADC3,
RCC_APB2Periph_TIM15,
RCC_APB2Periph_TIM16,
RCC_APB2Periph_TIM17,
RCC_APB2Periph_TIM9,
RCC_APB2Periph_TIM10,
RCC_APB2Periph_TIM11
參數(shù)2:使能外設(shè)時(shí)鐘或關(guān)閉外設(shè)時(shí)鐘
ENABLE or DISABLE
void RCC_APB1PeriphClockCmd ( uint32_t RCC_APB1Periph, FunctionalState NewState)
功能:開(kāi)啟或關(guān)閉的掛接在APB2總線上的外設(shè)時(shí)鐘
參數(shù)1:
RCC_APB1Periph_TIM2,
RCC_APB1Periph_TIM3,
RCC_APB1Periph_TIM4,
RCC_APB1Periph_TIM5,
RCC_APB1Periph_TIM6,
RCC_APB1Periph_TIM7,
RCC_APB1Periph_WWDG,
RCC_APB1Periph_SPI2,
RCC_APB1Periph_SPI3,
RCC_APB1Periph_USART2,
RCC_APB1Periph_USART3,
RCC_APB1Periph_USART4,
RCC_APB1Periph_USART5,
RCC_APB1Periph_I2C1,
RCC_APB1Periph_I2C2,
RCC_APB1Periph_USB,
RCC_APB1Periph_CAN1,
RCC_APB1Periph_BKP,
RCC_APB1Periph_PWR,
RCC_APB1Periph_DAC,
RCC_APB1Periph_CEC,
RCC_APB1Periph_TIM12,
RCC_APB1Periph_TIM13,
RCC_APB1Periph_TIM14
參數(shù)2:使能外設(shè)時(shí)鐘或關(guān)閉外設(shè)時(shí)鐘
ENABLE or DISABLE
【注意】:如果用到了I/O引腳的復(fù)用功能,則還要開(kāi)啟其復(fù)用功能的時(shí)鐘。
如GPIOC的Pin4還可以作為ADC1的輸入引腳,我們把它作為ADC1來(lái)使用,
那么除了要開(kāi)啟GPIOC時(shí)鐘外,還需要開(kāi)啟ADC1的時(shí)鐘。
例子:
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE);
RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC1, ENABLE);
-----------------------------------------------------------------------
-----------------------------------------------------------------------
啟動(dòng)文件:startup_stm32f10x_hd.s
1. ;Reset_Handler 子程序開(kāi)始 芯片被復(fù)位的時(shí)候會(huì)執(zhí)行
2. Reset_Handler PROC
3.
4. ;輸出子程序 Reset_Handler 到外部文件
5. EXPORT Reset_Handler [WEAK]
6.
7. ;從外部文件中引入 main 函數(shù)
8. IMPORT __main
9.
10. ;從外部文件引入 SystemInit 函數(shù)
11. IMPORT SystemInit
12.
13. ;把 SystemInit 函數(shù)調(diào)用地址加載到通用寄存器 r0
14. LDR R0, =SystemInit
15.
16. ;跳轉(zhuǎn)到 r0 中保存的地址執(zhí)行程序(調(diào)用 SystemInit 函數(shù) 用于設(shè)置系統(tǒng)時(shí)鐘)
17. BLX R0
18.
19. ;把 main 函數(shù)調(diào)用地址加載到通用寄存器 r0
20. LDR R0, =__main
21.
22. ;跳轉(zhuǎn)到 r0 中保存的地址執(zhí)行程序(調(diào)用 main 函數(shù))
23. BX R0
24.
25. ;Reset_Handler 子程序結(jié)束
26. ENDP
啟動(dòng)代碼中,它會(huì)調(diào)用SystemInit(),SysteInit()會(huì)先將與配置時(shí)鐘相關(guān)的寄存器復(fù)位為默認(rèn)值。
然后它再調(diào)用SetSysClock()函數(shù):
1. static void SetSysClock(void)
2. {
3. #ifdef SYSCLK_FREQ_HSE
4. SetSysClockToHSE();
5. #elif defined SYSCLK_FREQ_24MHz
6. SetSysClockTo24();
7. #elif defined SYSCLK_FREQ_36MHz
8. SetSysClockTo36();
9. #elif defined SYSCLK_FREQ_48MHz
10. SetSysClockTo48();
11. #elif defined SYSCLK_FREQ_56MHz
12. SetSysClockTo56();
13. #elif defined SYSCLK_FREQ_72MHz
14. SetSysClockTo72(); // 配置相關(guān)寄存器
15. #endif
19. }
SetSysClock()才是真正配置系統(tǒng)時(shí)鐘函數(shù),會(huì)根據(jù)宏來(lái)進(jìn)行不同頻率的配置。
由system_stm32f10x.c文件啟用宏。
1. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
2. /* #define SYSCLK_FREQ_HSE HSE_VALUE */
3. #define SYSCLK_FREQ_24MHz 24000000
4. #else
5. /* #define SYSCLK_FREQ_HSE HSE_VALUE */
6. /* #define SYSCLK_FREQ_24MHz 24000000 */
7. /* #define SYSCLK_FREQ_36MHz 36000000 */
8. /* #define SYSCLK_FREQ_48MHz 48000000 */
9. /* #define SYSCLK_FREQ_56MHz 56000000 */
10. #define SYSCLK_FREQ_72MHz 72000000
11. #endif
-----------------------------------------------------------------------
作者: wcm_e 時(shí)間: 2015-1-12 23:04
跟著樓主教程學(xué)習(xí),謝謝!
作者: kokusan 時(shí)間: 2016-6-4 13:39
跟樓主學(xué)習(xí)
作者: kokusan 時(shí)間: 2016-6-4 13:39
跟樓主學(xué)習(xí),謝謝!
作者: jiaoshou1001 時(shí)間: 2016-12-8 19:57
樓主威武,很厲害
作者: 懶惰的魔方 時(shí)間: 2017-3-7 20:03
學(xué)習(xí)了,可惜還是沒(méi)搞好,杯具~~
作者: 1032434070 時(shí)間: 2017-3-7 21:37
謝謝樓主指導(dǎo)!
作者: ltj_0728 時(shí)間: 2017-4-13 00:02
謝謝樓主分享。
win10必須是管理員權(quán)限才能進(jìn)入仿真。。。
作者: scc2012 時(shí)間: 2018-5-3 16:37
謝謝樓主分享
作者: 吳工程師 時(shí)間: 2018-10-29 18:37
在該工程下建立四個(gè)組:
【STARTCODE】:存放啟動(dòng)代碼 添加 startup_stm32f10x_hd.s 文件
【USER】:存放用戶自定義的應(yīng)用程序 添加main.c、stm32f10x_it.c
【FWlib】:存放庫(kù)文件 按需添加src里面的驅(qū)動(dòng)文件
【CMSIS】:存放M3系列單片機(jī)通用的文件 添加core_cm3.c、system_stm32f10x.c
沒(méi)搞懂啊
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
在线亚州
|
九九免费视频
|
av中文在线
|
在线观看av中文字幕
|
国产精品视频在线观看
|
亚洲精品一
|
亚洲在线一区二区
|
欧美在线一区二区三区
|
国产成人精品a视频一区www
|
在线欧美视频
|
成人三级av
|
欧美在线视频免费
|
午夜国产
|
成人啊啊啊
|
日韩欧美中文在线
|
日韩精品激情
|
蜜桃视频一区二区三区
|
日韩中文一区二区三区
|
亚洲视频中文字幕
|
欧美久久不卡
|
在线a视频网站
|
久久99国产精品
|
国产一区二区在线视频
|
日韩国产中文字幕
|
国产成人av在线播放
|
欧美一区二区激情三区
|
91激情视频
|
在线观看成人
|
日韩无
|
日本超碰
|
爱草视频|
av网站在线播放
|
91久久精品国产91久久性色tv
|
久久久精品国产
|
视频一区二区中文字幕
|
欧美一区二区三区
|
欧美一区二区成人
|
亚洲一av|
日韩av免费在线电影
|
国产区一区二区三区
|
视频一区二区在线观看
|