一、给工程添加必要的文件
1.选择好对应的STM32F103C8,选择目录为E:\江协科技自学\STM32Project\2-1 STM32工程模版。工程命名为Project。
①keil生成如图界面
②该目录下生成的文件有
观察到该工程的文件夹里其实什么也没有,是空的。
所以我们需要给添加给该工程一些必要的启动文件(startup文件)
2.给工程添加启动文件(startup文件)
E:\江协科技资料\STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm
如图
回到E盘中建的工程文件夹目录
3.添加外设寄存器描述文件和时钟配置文件(外围文件)
配置好start文件,打开E:\江协科技资料\STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x
start文件如下
4.还需要添加内核寄存器描述文件(内核文件)
由于STM32是内核和内核外围的设备组成的,内核的寄存器和外围设备的描述文件不是在一起的。所以我们还需要添加内核寄存器的描述文件。
打开E:\江协科技资料\STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport
start文件如下
5.到此为止工程必要文件就配置完了。
6.总结一下
二、对寄存器的操作方式(不常用,了解即可)
1. 在keil的工程中添加必要文件(即start文件夹中的部分文件)
回到keil
点击选中Source Group文件,再点击一下。(两次点击间隔时间较长)。将其重命名为Start。
接着右键,选择添加已存在的文件到start。(该文件已在工程的同一目录下。已存在的文件是指在电脑上已存在的都可以添加。)
2.给工程添加头文件
让keil软件找到.h文件
3.新建一个main()函数,检验工程是否可行。
将ST-LINK及芯片连接到电脑。
看下板子,有个灯已经不闪了。因为目前的程序啥都没有。
4.配置一下寄存器,点亮这个不亮的灯。
不断查手册,写代码,看不懂,且麻烦。
观察到小灯再次被点亮。
若将第七行代码改为
GPIOC->ODR =0x00002000;
编译、写入后,那个灯又会熄灭。
5.总结一下
(1)先贴入通义千问的解释
在STM32微控制器中,这些代码行是用来配置和控制GPIO(General Purpose Input/Output)端口以实现特定功能的。下面分别解释每行代码的作用:
RCC->APB2ENR = 0x00000010;
RCC 是 STM32 的 Reset and Clock Control(复位与时钟控制)寄存器组的别名,它用于管理和配置系统时钟。
APB2ENR 是 APB2(Advanced Peripheral Bus 2)Peripheral Clock Enable Register(外设时钟使能寄存器)的一部分,这个寄存器用于控制APB2总线上连接的外设时钟是否使能。
将 APB2ENR 寄存器赋值为 0x00000010,通常意味着设置该寄存器的某一位(在这个例子中可能是第4位),使得连接到APB2总线上的某个外设(在这里是GPIOC)的时钟被使能。对于GPIOC,这一步是为了开启其内部电路的工作时钟,使其能够正常工作。
GPIOC->CRH = 0x00300000;
GPIOC 表示STM32中的GPIO端口C,CRH是GPIO端口配置高寄存器(Port Configuration Register High)。
通过写入 0x00300000 到 GPIOC->CRH,是在配置GPIO端口C的高四位引脚(PC10至PC15)的模式和速度。
具体到这里的数值,0x00300000 指定的是PC13引脚的配置,其中具体的位分配依赖于STM32的数据手册。这个值通常会设置该引脚为推挽输出模式,并且可能设定一个特定的速度级别(例如50MHz或其它速度等级,视具体型号而定)。
GPIOC->ODR = 0x00002000;
GPIOC->ODR ODR是GPIO端口C的数据输出寄存器(Output Data Register)。
写入 0x00002000 到此寄存器意味着设置GPIO端口C上的一些引脚的输出状态。
在二进制中,0x00002000 对应着 0b00000000000000000010000000000000,其中从右往左数第13位(即倒数第4位)为1,表示PC13引脚被设置为逻辑高电平(High)。这意味着如果PC13已经被配置为输出模式,则LED灯或者其他连接到该引脚的外部设备将会因为高电平而导通或关闭(具体取决于LED的正负极性以及电路设计)。如果LED是低电平触发点亮,则此操作会使LED熄灭;如果是高电平触发点亮,则LED会被点亮。
认识到:RCC是寄存器组;APB2ENR、CRH、ODR是寄存器。
(2)寄存器的操作方式
缺点:
①需要不断查手册,来了解每个寄存器的每一位具体是什么用。
②把PC13之外的位都配置成了0,这样会影响到其他端口的原有配置。若要做到只配置PC13而不影响其他位,那还需要&=和|=操作。
优点:
代码简洁。
三、对库函数(C语言函数)的操作方式(重点掌握)
1.先进行一和二中的1、2步骤
2.添加库函数
打开E:\江协科技资料\STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src
来到库函数的源文件夹
将库函数的源文件全部粘贴复制到Library文件夹中。
然后来到E:\江协科技资料\STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc,这是库函数的头文件夹。我们同样将它们全部粘贴复制到新建的Liabrary文件夹中。
回到keil
这些添加进来的库函数还不能直接使用,还需要再添加一个文件。
3.为库函数添加配置文件和中断文件
打开E:\江协科技资料\STM32入门教程资料\固件库\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template
到此,基于库函数的工程就建好了。
4.写入代码
输入如下代码
int main()
{
//开启使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//配置端口模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
//GPIO_SetBits(GPIOC,GPIO_Pin_13); //高电平,使PC13的小灯灭
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //低电平,使PC13的小灯亮
while(1)
{
}
}
编译、加载(下载)到芯片。
观察到PC13小灯亮暗情况如预期。
5.总结一下
(1)新建工程步骤
(2)keil三个文件夹中的内容
①Start文件夹
里面添加的是启动文件。
②Library文件夹
里面是库函数
③User文件夹
里面是main文件(写代码的文件)和为库函数准备的配置文件、中断文件。
④概览
6.注意
start文件添加到keil中的start文件中时,startup开头的启动文件根据芯片选择对应型号的一个,而其他5个外围和内核文件都要添加。
7.整理这三个文件夹到一个目录下
在路径:E:\江协科技资料\三大准备文件(main.c文件自己在keil手动添加)