最近需要获得一些DSP相关的数据,所以想用STM32作为主控,获取数据,刚好有一块正点原子的mini开发板,重操旧业,再学习一下STM32的相关知识。同时以寄存器的操作方式,更深入了解相关的工作方式。
第一部分,尝试一些芯片是否损坏,及开发环境的配置,这里我使用的keil5版本是
有很多破解教程这里不赘述,同时使用的下载器是ST-Link,并且安装了STM32 ST-LINK Utility,安装教程也有很多,同时由于STM32F103芯片过老,在keil5中可能没有对应的version 5 编译器,建议再安装一下,相关安装步骤链接也有Keil 5 找不到编译器 Missing:Compiler Version 5 的解决方法_missing compiler version 5-CSDN博客h
环境没问题后我们需要创建工程,将ST公司标准库的启动文件复制到我们的文件夹路径。由于我第一次实验只是对led灯的点亮,这里使用寄存器的配置方式,所以我的工程文件夹只创建两个,一个start,一个user。
将标准库中这些文件放入start文件夹当中,user文件夹只创建主函数,main.c
之后就可以在keil5中new project,创建工程,然后点击管理项目。
与之前创建的文件保持一致。如果对创建项目和配置环境有不懂,可以参考别人的博客。
第一次实验重点 LED点灯。
首先我们要了解开发板的原理图,和芯片的原理图,如下图
这块mini 开发板上有两个LED灯,对应PA8,PD2,LED原理图表示当DS0 ,DS1为低电平是,发光二极管导通,LED点亮,所以我们配置寄存器需要将PA8,PD2的输出引脚配置为0。
在这里我以点亮PA8引脚的LED为例说明。
首先,STM32 单片机配置步骤通常包括以下几个关键环节:
- 开启时钟(如 GPIOA 时钟)。
- 配置引脚的工作模式(输入、输出、复用)。
- 设置引脚的输出电平(通过
ODR
或BSRR
)。 - 配置外设(如 USART、SPI、ADC 等)。
- 启用中断(如果需要)。
因为我们只是配置PA8的引脚输出,所以只需上面的前三步。
1.开启时钟
在stm32f10X数据手册中,我们知道系统图,GPIO是挂载在APB2上面的,而时钟是由RCC发出的。
在数据手册中6.3.7中,可以启动APB2外部时钟
我们只需要将该寄存器,第2位IOPA EN给1,其他位给0,也就是整个寄存器给0x04,就能开启时钟。而该寄存器地址为 起始地址 + 偏移地址。在数据手册 2.3中我们可以查询到各部分的起始地址,所以该寄存器地址为:0x0x40021000 + 0x18 让该寄存器里面内容为0x04即 我们用c语言指针解引用。*(uint32_t *)(0x40021000 + 0x18) = 0x04; 即可开启时钟。
2.配置引脚的工作模式
如图,我们只需配置CNF8,和它对应的MODE,这里我们只需配置成输出模式,我们可以设置为最大速度输出,MODE为11,CNF8为00。即该寄存器配置为0x03即可,对应查找它起始地址,加上偏移地址。*(uint32_t *)(0x40010800 + 0x04) = 0x03; 即可
3.设置引脚的输出电平(通过 ODR
或 BSRR
)。
这里我们设置PA8为低电平0,同样*(uint32_t *)(0x40010800 + 0x0C) = 0xfeff;
即可配置好点灯项目。
main.c 整体代码如下,while(1){}是为了让单片机一直保持循环。
#include <stdint.h>
int main(void)
{
//1.时钟配置
*(uint32_t *)(0x40021000 + 0x18) = 0x04;
//2.GPIO工作模式的配置
*(uint32_t *)(0x40010800 + 0x04) = 0x03;
//3.端口给信号
*(uint32_t *)(0x40010800 + 0x0C) = 0xfeff;
while(1){}
}