STM32利用寄存器的直接地址点亮LED灯
新建工程项目 选择合适的路径,用来存放工程文件 选择自己手中STM32的型号,如果没有需要安装对应的包。 点击取消按钮,不适用软件自带的包 导入main.c文件 在工程目录下面新建main.c文件 在工程中导入新建的main.c文件,双击Soure Group 1 在弹出的对话框中选择main.c文件的路径,选择main.c文件。 在main.c文件中编写,main()函数 运行编译程序会出现.\Objects\Address_Yinshe_LED.sct(7): error: L6236E: No section matches selector - no section to be FIRST/LAST.的错误 这是因为缺乏启动文件造成的。所以需要添加一个启动文件,步骤和添加main.c文件一样,但是启动文件是STM32公司编写完成的,所以我们只需要复制过来就可以啦,不需要新建,在官方的固件库文件中就包含启动文件。 接着编译,会继续报错,如下图所示: 这是因为缺少系统时钟的函数,我们自己写一个SystemInit()的函数用来骗过编译器。 引入头文件stm32f10x.h,这个和之前新建main.c文件的操作步骤一致,新建一个stm32fa0x.h的文件,编译之后软件会自动加到main.c的文件下面,如图所示: 这时编译便没有错了,到这一步已经把文件模型编写完成。 编写程序 从下面的图上可以看到LED是连接到PB0、PB1、PB5上并且是低电平驱动LED灯,所以我们以PB0为例来点亮LED1。 从图中我们可以看到,GPIOB是挂载到APB2总线上,而APB2是挂载到AHB总线上,所以要想知道GPIOB_CRL寄存器的地址就必须知道上面总线的地址。 通过查找STM32的帮助手册,我们能看到下图所示的GPIOB的地址 通过查找手册,我们可以发现GPIOB_CRL寄存器的偏移地址是0x00 通过这样一步一步的查找相关的地址,我们可以写下下面的代码:
int main ( void )
{
* ( unsigned int * ) 0x40021018 |= ( 1 << 3 ) ;
* ( unsigned int * ) 0x40010C00 |= ( 1 << 0 ) ;
* ( unsigned int * ) 0x40010C0C &= ~ ( 1 << 0 ) ;
}
配置相应的下载选项。 选择相应的下载器,我这里用的是高速DAP下载器进行下载。 勾选 做如下的配置 下载完成,灯亮。