先来回顾一下前两篇
- Linux下开发stm32(一) | 使用gcc-arm-none-eabi工具链编译
- Linux下开发stm32(二) | 使用openocd下载与调试
前两篇我们介绍了如何创建一个空的裸机工程(只有启动文件和main文件),并编译工程生成elf文件,然后将其转为bin格式或hex格式,使用openocd下载,最后编写了一个makefile雏形,并成功点亮了一个LED~ 但是这个LED我们是通过指针直接操作寄存器地址来完成的,接下来,我们在此基础上,引入stm32头文件,其中包含了寄存器的宏定义,也就是使用寄存器进行开发~
1.创建寄存器工程
首先将上一节中创建的裸机工程00-template-reg
复制一份出来,改名为01-led-reg
:
将其中空的stm32f10x.h
文件删掉,从固件库中复制一份,然后因为头文件中使用了core_cm3.h
和system_stm32f10x.h
中的一些定义,包含了这两个头文件,所以将这两个文件也复制过来:
接下来编写main.c
文件:
#include "stm32f10x.h"
int main()
{
/* 开启GPIOB时钟 */
//*(unsigned int*)(0x40021000 0x18) |= 1<<3;
RCC->APB2ENR |= 1<<3;
/* 配置PB0为推挽输出 */
//*(unsigned int*)(0x40010c00 0x00) |= 1<<(4*0);
GPIOB->CRL |= 1<<(4*0);
/* PB0输出低电平,点亮绿色LED */
//*(unsigned int*)(0x40010c00 0x0c) &= ~(1<<0);
GPIOB->ODR &= ~(1<<0);
while(1);
}
void SystemInit(void)
{
}
至此,寄存器工程创建完毕,接下来开始编译~
2.编译&下载寄存器工程
编译寄存器工程的重点就在于C头文件和C源文件,启动文件的编译和链接都和之前一样。 头文件不用编译,但是要注意
- 在编译含有该头文件的源文件时,如果头文件和源文件不在一个文件夹里,需要用
-I
(大写i)参数声明头文件路径; - 头文件经常通过判断用户是否有宏定义来进行一些选择编译,可以使用
-D
参数进行宏定义;
接下来修改makefile,编译我们创建的工程:
- 使用命令
make
编译生成elf文件; - 使用命令
make bin
将elf文件转化生成bin文件; - 使用命令
make hex
将elf文件转化生成hex文件; - 使用命令
make clean
即可清除掉所有编译产生的文件。