新手入门 keil MDK5 建立STM32工程
keil uvison 是用来开发 单片机的,Keil mdk 是用来开发 ARM 的。
芯片型号是:STM32F103RB6
1,新建工程
配置属性
晶振为8M 根据实际晶振选择
生成 HEX 文件,选中
2,复制启动文件,头文件,这里为了简单,全部放在了项目文件夹中,不像有的教程,要建这个,配置那个,新手容易头大。
启动文件在,STM32F10x_StdPeriph_Lib_V3.5.0.rar 里面,解压LIB库文件。
复制 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport 里面的 core_cm3.h core_cm3.c 到项目文件夹中。
复制 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x 里面的 3个文件 stm32f10x.h system_stm32f10x.c system_stm32f10x.h 到项目文件夹中。
复制启动文件 STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 里面的 startup_stm32f10x_md.s
md hd ld 根据芯片FLASH 容量决定用哪个。
16K < FLASH < 32K ld
64K < FLASH < 128K md
256K < FLASH < 512K hd
文件复制好以后就是这个样子。
双击,添加文件到项目中。
新建一个 main.c 文件,并添加到项目中。
1 #include "stm32f10x.h" 2 #include "bitband.h" 3 4 void delay() 5 { 6 int i=30000; 7 while(i--); 8 } 9 10 int main(void) 11 { 12 //初始化引脚 13 //PA2 接 BEEP 14 //初始化 PA 时钟 15 RCC->APB2ENR |= RCC_APB2ENR_IOPAEN; 16 //配置引脚模式 17 GPIOA->CRL &= ~(0x3<<(4*2+2)); 18 GPIOA->CRL |= 0x3<<(4*2); 19 20 while(1) 21 { 22 GPA_ODR(2) = 1; 23 delay(); 24 GPA_ODR(2) = 0; 25 delay(); 26 } 27 return 0; 28 }
bitband.h 是一个 bit 位映射功能 操作时简单,不用比较位,节省时间。
1 /** 2 * (*(volatile unsigned long *) 是 先把一个 long 数字转为指针 在加 * 就是取它的内容 3 * volatile 是告诉编译器不要优化 4 */ 5 #define BITBAND(addr, bitnum) ((addr&0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 6 #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) 7 #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) 8 9 #define GPA_IDR(n) BIT_ADDR(GPIOA_BASE+0x8, n) 10 #define GPB_IDR(n) BIT_ADDR(GPIOB_BASE+0x8, n) 11 #define GPC_IDR(n) BIT_ADDR(GPIOC_BASE+0x8, n) 12 #define GPD_IDR(n) BIT_ADDR(GPIOD_BASE+0x8, n) 13 #define GPE_IDR(n) BIT_ADDR(GPIOE_BASE+0x8, n) 14 15 #define GPA_ODR(n) BIT_ADDR(GPIOA_BASE+0xc, n) 16 #define GPB_ODR(n) BIT_ADDR(GPIOB_BASE+0xc, n) 17 #define GPC_ODR(n) BIT_ADDR(GPIOC_BASE+0xc, n) 18 #define GPD_ODR(n) BIT_ADDR(GPIOD_BASE+0xc, n) 19 #define GPE_ODR(n) BIT_ADDR(GPIOE_BASE+0xc, n) 20 #define GPF_ODR(n) BIT_ADDR(GPIOF_BASE+0xc, n) 21 22 #define GPA_BSRR(n) BIT_ADDR(GPIOA_BASE+0x10, n) 23 #define GPB_BSRR(n) BIT_ADDR(GPIOB_BASE+0x10, n) 24 #define GPC_BSRR(n) BIT_ADDR(GPIOC_BASE+0x10, n) 25 #define GPD_BSRR(n) BIT_ADDR(GPIOD_BASE+0x10, n) 26 #define GPE_BSRR(n) BIT_ADDR(GPIOE_BASE+0x10, n) 27 #define GPF_BSRR(n) BIT_ADDR(GPIOF_BASE+0x10, n) 28 29 #define GPA_BRR(n) BIT_ADDR(GPIOA_BASE+0x14, n) 30 #define GPB_BRR(n) BIT_ADDR(GPIOB_BASE+0x14, n) 31 #define GPC_BRR(n) BIT_ADDR(GPIOC_BASE+0x14, n) 32 #define GPD_BRR(n) BIT_ADDR(GPIOD_BASE+0x14, n) 33 #define GPE_BRR(n) BIT_ADDR(GPIOE_BASE+0x14, n) 34 #define GPF_BRR(n) BIT_ADDR(GPIOF_BASE+0x14, n)
这里的 0xc 0x8 0x10 就是根据 寄存器的位置来决定的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异