写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做!
本文写于:2025.04.01
STM32开发板学习——第一节: [1-1]课程简介
- 前言
- 开发板说明
- 引用
- 解答和科普
- 一、软件安装
- 二、新建工程
- 回顾
- 总结
前言
本次笔记是用来记录我的学习过程,同时把我需要的困难和思考记下来,有助于我的学习,同时也作为一种习惯,可以督促我学习,是一个激励自己的过程,让我们开始32单片机的学习之路。
欢迎大家给我提意见,能给我的嵌入式之旅提供方向和路线,现在作为小白,我就先学习32单片机了,就跟着B站上的江协科技开始学习了.
在这里会记录下江协科技32单片机开发板的配套视频教程所作的实验和学习笔记内容,因为我之前有一个开发板,我大概率会用我的板子模仿着来做.让我们一起加油!
另外为了增强我的学习效果:每次笔记把我不知道或者问题在后面提出来,再下一篇开头作为解答!
开发板说明
本人采用的是慧净的开发板,因为这个板子是我N年前就买的板子,索性就拿来用了。另外我也购买了江科大的学习套间。
原理图如下
1、开发板原理图
2、STM32F103C6和51对比
3、STM32F103C6核心板
视频中的都用这个开发板来实现,如果有资源就利用起来。另外也计划实现江协科技的套件。
下图是实物图
引用
【STM32入门教程-2023版 细致讲解 中文字幕】
还参考了下图中的书籍:
STM32库开发实战指南:基于STM32F103(第2版)
数据手册
解答和科普
一、软件安装
在线安装
ST-link驱动安装
CH340驱动安装
二、新建工程
1、 开发STM32的形式为:基于寄存器的方式(太多太麻烦);基于标准库(库函数)和基于HAL库方式。
基于HAL库的方式可以用图形化界面快速配置STM32方便但不是底层。
固件库的文件
Libraries里面就是库函数的文件,建工程要用;
Project是官方提供的工程示例和模版,可以参考;
Utilities是STM32官方评估板的相关例程;
库函数的发布文档和使用手册。
新建工程
自动生成的文件夹
1、创立Start文件夹:
1.1文件从Libaries-CMSIS-CM3-DeviceSupport-ST-STM32F10x-startup-arm,这些就是STM32的启动文件,STM32的程序就是从启动文件开始执行的。
1.2
然后startup文件夹同级的stm32f10x.h(STM32外设寄存器描述文件和51单片机RGEX52.H一样);这两个system文件是用来配置时钟的,STM32主频72MHz,就是system文件里的函数配置的。
1.3
STM32是内核和内核外围的设备组成的,所以还要加入一个内核寄存器的描述文件:DeviceSupport同级的Libaries-CMSIS-CM3-CoreSupport中的两个cm3就是内核的寄存器描述
这样工程的必要文件就复制完成了。
我们回到keil把刚才复制的文件添加到工程里面,把名字改为Start,添加现存的文件,首先添加一下启动文件,这个启动文件有很多分类,我们只能添加其中一个,我们所用的型号需要选择后缀为md.s的启动文件,剩下的C文件和H文件都要添加进来。
这样,我们Start文件夹里面的文件就添加好了,这里的文件都是STM32里最基本的文件,是不需要我们修改的,我们添加进来即可。小钥匙代表是只读文件。
最后还需呀添加上这个文件夹的头文件路径
这是保证放在User文件夹下。
写main函数看是否成功
最后一行必须为空行,不然会报错。
这就完成一个基于寄存器开发的工程。
改变字体大小
字体格式UTF-8
配置调试器:
勾选后,我们下载程序后会立马复位并执行,这样方便一些,否则每次下载,还需要按一下板子上的复位键才能执行程序。
点击load就可以下载了。
完成基于寄存器完成点灯:
接下来配置寄存器,来点亮这个灯,打开STM32的参考手册,首先是RCC的一个寄存器,来使能GPIO的时钟,GPIO都是APB2的外设,所以在这个APB2外设时钟使能寄存器RCC_APB2ENR里面配置,
这一位写1,其他无关项都给0,那整个寄存器的二进制数据转化为十六进制,4位为一个数字,总共32也就是8位十六进制数:00000010。
配置时钟使能:
配置PC13口的模式:
无关为0;所以值为0x0030 0000
配置数据:
这个操作非常不好,就是除了PC13之外的位都配置成了0,这样就会影响到其他端口的原有配置,如果要做到只配置PC13而不影响其他位,就需要进行&=和|=操作。
HJ开发板寄存器点亮LED灯
#include "stm32f10x.h" // Device header
int main(void)
{
RCC->APB2ENR=0x00000004; //使能GPIOA
GPIOA->CRL=0x00000003; //调试GPIOA0
GPIOA->ODR=0x00000000; //亮
while(1)
{
}
}
生成HEX文件,串口下载
STM32点灯
在寄存器版本上完成库创建
在工程文件夹下创建Library文件夹,
2、Library存放库函数:打开固件库Libaries-STM32F10x_StdPeriph_Driver(标准外设驱动)-src中的文件,其中misc是内核的库文件,其他的就是内核外的外设库函数
打开固件库的inc文件夹,这些是库函数的头文件,继续ctrl+A全选
然后放到Library文件夹下,和添加Start一样,在Keil软件中加入。
3、User文件夹: 打开固件库文件夹,打开Project-STM32Template,选择main、stm32f10x_conf.h和两个it结尾的文件,conf文件是用来配置库函数头文件的包含关系的,还有用来参数检查的函数定义,这是所有库函数都需要的
两个it文件是用来存放中断函数的。
最后还需要一个宏定义:
如果你定义了USE_STDPERIPH_DRIVER这个字符串,下面这个 #include "stm32f10x_conf.h"语句才有效
这样才能包含标准外设库,也就是库函数。
下面的头文件路径也不要忘了
这样基于库函数的工程就建好了
Library里面的库函数也都是只读文件不需要更改,需要更改的是User组里面的文件。
文件创建成功,库函数也是间接的配置寄存器,所以他们的步骤也是一样的,首先是使能时钟,
#include "stm32f10x.h" // Device header
int main(void)
{
// RCC->APB2ENR=0x00000004;
// GPIOA->CRL=0x00000003;
// GPIOA->ODR=0x00000000; //灭
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIOA的时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //通用推挽输出
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0; //配置那个端口
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; //速度时钟
GPIO_Init(GPIOA, &GPIO_InitStructure); //整体配置GPIO
GPIO_SetBits(GPIOA,GPIO_Pin_0); //GPIOA0高电平
// GPIO_ResetBits(GPIOA,GPIO_Pin_0); //GPIOA0低电平
while(1)
{
}
}
控制灯的亮灭
回顾
首先是新建工程里面的启动文件,我们新建工程的第一个加的就是启动文件,要根据芯片型号来选择,分为以下的内容。
小结
1、创立Start文件夹:文件从Libaries-CMSIS-CM3-DeviceSupport-ST-STM32F10x-startup-arm,这些就是STM32的启动文件,STM32的程序就是从启动文件开始执行的。
然后startup文件夹同级的stm32f10x.h(STM32外设寄存器描述文件和51单片机RGEX52.H一样);这两个system文件是用来配置时钟的,STM32主频72MHz,就是system文件里的函数配置的。
STM32是内核和内核外围的设备组成的,所以还要加入一个内核寄存器的描述文件:DeviceSupport同级的Libaries-CMSIS-CM3-CoreSupport中的两个cm3就是内核的寄存器描述
然后回到keil添加:
2、Library存放库函数:打开固件库Libaries-STM32F10x_StdPeriph_Driver(标准外设驱动)-src中的文件,其中misc是内核的库文件,其他的就是内核外的外设库函数
打开固件库的inc文件夹,这些是库函数的头文件,继续ctrl+A全选
3、User文件夹: 打开固件库文件夹,打开Project-STM32Template,选择main、stm32f10x_conf.h和两个it结尾的文件,conf文件是用来配置库函数头文件的包含关系的,还有用来参数检查的函数定义,这是所有库函数都需要的
两个it文件是用来存放中断函数的。
工程文件复制完成
在keil创建三个组:Start、Library、User、添加文件;
Start文件添加带md.s,然后选择其他的.c.h文件,选择并添加
Library是all files Ctrl+A全选
User也是一样all files Ctrl+A全选
文件添加完成
打开魔术棒按钮,打开工程选项,选择C/C++,在Include Paths栏,把我们自己建的文件夹路径都添加进来:Start、Library、User
在Define一栏中写下:USE_STDPERIPH_DRIVER
USE使用_STD标准_PERIP外设_DRVER驱动
最后选择Debug,调试器选择ST-LINK,设置Flash Download 勾选上Rest and Run,这样工程就配置好了。
把main文件删除写上自己的main函数,加上头文件,写上main函数。
注意最后一行要是空行,不然会警告。
首先是Startup启动文件:这个是程序执行最基本的文件,是用汇编写的,这个复位中断是整个程序的入口,当STM32上电复位或者按下复位键之后,程序就会进入复位中断函数执行,复位中断函数主要就做了两件事情,第一个是调用Systemlnit函数,第二个是调用main函数,不会结束所以在main函数的最后,一定是一个死循环。
设置微控制器的启动,初始化嵌入式闪存接口,锁相环,更新系统内核的时钟变量,下面的note写的是这个函数仅在复位后需要调用,下面就是配置的,帮我们配置好,还启动了其他的中断,达到条件就会自动执行。
中断函数的定义就是在STM32fx_it里面,自定义的中断建议写在这,不过我们在那用,写在哪里。
当然我们可以自己封装函数。
到此为止。这个工程结构主动执行的部分就介绍完了。
右边是被动执行的东西了,相当于STM32的资源,我们在主函数或者中断函数就可以调用这些资源,
库函数调用
conf.h是包含了所有的库文件的头文件,又因为stm31f10.h包含了conf.h,所以只需要包含一个stm31f10.h文件就行了,就可以调用库函数了。
总结
本节课主要是学习了如何安装所需的软件和创建一个工程,基于寄存器和标准库的不同,其本质都是操作寄存器,要经过配置,start可以满足启动就可以寄存器配置,但是不方便,要查寄存器手册还要计算,&=和|=。所以又学习了如何创建库。
1、创立Start文件夹:文件从Libaries-CMSIS-CM3-DeviceSupport-ST-STM32F10x-startup-arm,这些就是STM32的启动文件,STM32的程序就是从启动文件开始执行的。
然后startup文件夹同级的stm32f10x.h(STM32外设寄存器描述文件和51单片机RGEX52.H一样);这两个system文件是用来配置时钟的,STM32主频72MHz,就是system文件里的函数配置的。
STM32是内核和内核外围的设备组成的,所以还要加入一个内核寄存器的描述文件:DeviceSupport同级的Libaries-CMSIS-CM3-CoreSupport中的两个cm3就是内核的寄存器描述
然后回到keil添加:
2、Library存放库函数:打开固件库Libaries-STM32F10x_StdPeriph_Driver(标准外设驱动)-src中的文件,其中misc是内核的库文件,其他的就是内核外的外设库函数
打开固件库的inc文件夹,这些是库函数的头文件,继续ctrl+A全选
3、User文件夹: 打开固件库文件夹,打开Project-STM32Template,选择main、stm32f10x_conf.h和两个it结尾的文件,conf文件是用来配置库函数头文件的包含关系的,还有用来参数检查的函数定义,这是所有库函数都需要的
两个it文件是用来存放中断函数的。
工程文件复制完成
在keil创建三个组:Start、Library、User、添加文件;
Start文件添加带md.s,然后选择其他的.c.h文件,选择并添加
Library是all files Ctrl+A全选
User也是一样all files Ctrl+A全选
文件添加完成
打开魔术棒按钮,打开工程选项,选择C/C++,在Include Paths栏,把我们自己建的文件夹路径都添加进来:Start、Library、User
在Define一栏中写下:USE_STDPERIPH_DRIVER
USE使用_STD标准_PERIP外设_DRVER驱动
最后选择Debug,调试器选择ST-LINK,设置Flash Download 勾选上Rest and Run,这样工程就配置好了。
把main文件删除写上自己的main函数,加上头文件,写上main函数。
注意最后一行要是空行,不然会警告。
最后实现了点灯。
我是使用的串口下载,要这样选择同事下载前按一下复位按钮。