STM32在Keil5上配置工程以及点亮灯
1.前期准备工作
自行安装Keil5,购买stm32,下载江科大STM32资源包等等硬件
2.Keil工程文件配置
2.1必备文件
BOOTLoader启动文文件:江科大:\Stm32\STM32\Firmware_K\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm->../Start
配置时钟文件:江科大:\\Stm32\STM32\Firmware_K\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\*.h&*.c->../Start
寄存器描述文件:江科大:\\Stm32\STM32\Firmware_K\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport\*.h&*.c->../Start
必备文件配置完成,可以使用寄存器开发
2.2标准外设库开发内核文件配置
D:\Stm32\STM32\Firmware_K\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src\和D:\Stm32\STM32\Firmware_K\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc->..\Library
2.3User自己的文件
建立Main.C文件用于主入口和标准外设库关系包含文件(
D:\Stm32\STM32\Firmware_K\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\stm32f10x_*.h&.c文件(3个)->..\User
注意:Keil5->魔术棒->C/C++->Define输入:USE_STDPERIPH_DRIVER(关联库的宏定义)
3.Keil5的设置
1.加入每组文件的头文件:Keil5->魔术棒->C/C++->Include Paths 加入新增的组文件Start User Library
“品"字按钮:设置文件的位置顺序。
4.控制寄存器方式点亮灯
参考手册:STM32F10xxx参考手册(中文).pdf
点亮PIN13引脚的灯,因为最小系统板自带的,比较方便,属于GPIOC13。
4.1.配置时钟寄存器-> APB2外设时钟使能寄存器(RCC_APB2ENR)
因为Pin13由APB2外设控制;


4.2配置端口寄存器 设置端口模式

4.3配置端口的数据输出寄存器

4.4 代码
#include "stm32f10x.h" // Device header
int main(void)
{
RCC->APB2ENR=0x00000010;
GPIOC->CRH=0x00300000;
GPIOC->ODR=0x00002000;//输出高电平
GPIOC->ODR=0x00000000;//输出低电平
while(1)
{
}
}
5.标准外设库开发点亮灯
#include "stm32f10x.h" // Device header
int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//用于控制APB2总线上的外设时钟的开启或关闭
GPIO_InitTypeDef GPIO_InitStructure;//是一个结构体类型,用于初始化GPIO(通用输入输出)端口的配置。
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);//指定端口高电平
//GPIO_ResetBits(GPIOC,GPIO_Pin_13);//指定端口低电平
while(1)
{
}
}
1.
在STM32库开发中,RCC_APB2PeriphClockCmd函数的作用是用于控制APB2总线上的外设时钟的开启或关闭。它是STM32库中用于配置系统时钟的一个重要函数,通常用于连接GPIO和外部中断等外设。
具体来说,RCC_APB2PeriphClockCmd函数的定义如下:
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
其中,RCC_APB2Periph参数表示要操作的外设时钟使能位,可以是多个外设的时钟使能位的按位或(|)操作。这些外设通常包括高速外设,如USART(串口通信外设)、SPI(串行外设接口)、TIM(高级定时器)、ADC(模数转换器)以及所有普通的IO口(如PA~PE)等。NewState参数则是一个枚举类型,用于指示要使能(ENABLE)还是禁用(DISABLE)指定的外设时钟。
例如,下面的代码将使能GPIOA、GPIOB和USART1的时钟:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_USART1, ENABLE);
在使用这些外设之前,需要先通过调用RCC_APB2PeriphClockCmd函数使能它们的时钟。另外,在不再需要使用这些外设时,也建议通过调用相应的RCC_APB2PeriphClockCmd函数,将相应的外设时钟禁用,以节省系统资源。
总的来说,RCC_APB2PeriphClockCmd函数是STM32库开发中用于管理APB2总线上外设时钟的关键函数,它使得开发者能够灵活地控制外设的时钟使能状态,从而满足不同的应用需求。
2.
在STM32的库开发中,GPIO_InitTypeDef 是一个结构体类型,用于初始化GPIO(通用输入输出)端口的配置。这个结构体通常在配置GPIO端口(如设置引脚为输入、输出、复用功能、模拟输入等)时被使用。GPIO_InitStructure 是这个结构体类型的一个变量名,但你可以根据需要命名为其他名称。
GPIO_InitTypeDef 结构体通常包含以下字段(具体字段可能根据STM32的库版本和系列有所不同):
GPIO_Pin:指定要配置的GPIO引脚。可以使用宏定义来选择单个引脚或多个引脚的组合。GPIO_Mode:设置GPIO引脚的工作模式,如输入(GPIO_Mode_IN_FLOATING、GPIO_Mode_IPU、GPIO_Mode_IPD等)、输出(GPIO_Mode_Out_PP、GPIO_Mode_Out_OD等)、复用功能(GPIO_Mode_AF_PP、GPIO_Mode_AF_OD等)或模拟输入(GPIO_Mode_AIN)。GPIO_Speed:设置GPIO引脚的输出速度,通常用于输出模式。速度等级可能包括低速、中速、高速、非常高速等。GPIO_OType:设置GPIO引脚的输出类型,通常用于开漏输出和推挽输出之间的选择。GPIO_PuPd:设置GPIO引脚的上下拉配置,可以选择上拉、下拉或无上下拉。在使用GPIO_Init函数初始化GPIO端口之前,你需要设置GPIO_InitStructure变量中的这些字段。然后,将GPIO_InitStructure的地址作为参数传递给GPIO_Init函数。
例如:
GPIO_InitTypeDef GPIO_InitStructure; |
|
// 启用GPIOA的时钟(在STM32F4系列中,可能需要先调用RCC_AHB1PeriphClockCmd) |
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); |
|
// 配置GPIOA的第5引脚(PA5)为推挽输出,速度为高速 |
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; |
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; |
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; |
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; |
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; |
|
// 初始化GPIOA端口 |
|
GPIO_Init(GPIOA, &GPIO_InitStructure); |
请注意,上述代码示例是基于STM32F4系列的库函数。对于其他STM32系列,如STM32F1、STM32F0等,时钟使能函数和GPIO初始化函数的名称可能会有所不同。此外,随着STM32库的不断更新,结构体字段和宏定义也可能会发生变化。
3.
在STM32的库开发中,GPIO_Init 函数用于根据指定的初始化结构体(通常是 GPIO_InitTypeDef 类型)来配置GPIO端口的参数。这个函数通常在设置GPIO引脚为特定的模式(如输入、输出、复用功能等)时被调用。
在你提供的代码片段中:
GPIO_Init(GPIOC, &GPIO_InitStructure); |
GPIOC 是一个指向GPIO端口C的指针或是一个代表GPIO端口C的宏定义。这取决于你所使用的STM32库的具体实现。在STM32的标准外设库或HAL库中,它通常是一个宏定义,用于指定要初始化的GPIO端口。
&GPIO_InitStructure 是指向 GPIO_InitTypeDef 结构体实例的指针,该结构体在调用 GPIO_Init 之前已经被配置好了。这个结构体包含了要应用于GPIO端口的配置参数,如引脚号、模式、速度、输出类型和上下拉配置。
在调用 GPIO_Init 函数之前,你需要确保已经完成了以下步骤:
-
启用GPIO端口的时钟:在STM32中,每个GPIO端口都有自己的时钟,必须在配置GPIO之前启用它。这通常通过调用一个时钟控制函数来完成,如
RCC_AHB1PeriphClockCmd(对于STM32F4系列中的高速APB总线上的外设)或类似的函数(取决于STM32的系列和库版本)。 -
配置
GPIO_InitStructure:设置GPIO_InitTypeDef结构体的字段以指定GPIO端口的配置。这包括选择哪些引脚将被配置、它们的模式、速度、输出类型和上下拉配置。 -
调用
GPIO_Init:将GPIO端口和指向初始化结构体的指针作为参数传递给GPIO_Init函数,以应用配置。
例如,如果你想要配置GPIOC的第13引脚(PC13)为一个推挽输出引脚,你可能会这样写代码:
GPIO_InitTypeDef GPIO_InitStructure; |
|
// 启用GPIOC的时钟(根据具体的STM32系列和库版本,这个函数可能有所不同) |
|
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); // 对于STM32F4系列 |
|
// 配置GPIOC的第13引脚为推挽输出,速度为低速(或其他速度),无上下拉 |
|
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; |
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; |
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; // 或其他速度值 |
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; |
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; |
|
// 应用配置到GPIOC |
|
GPIO_Init(GPIOC, &GPIO_InitStructure); |
请注意,上面的代码示例是基于STM32F4系列的库函数。如果你使用的是其他STM32系列,如STM32F1、STM32F0等,你需要根据相应的参考手册调整时钟使能函数和GPIO初始化函数的名称以及参数。
4.
在STM32的库开发中,GPIO_SetBits 函数用于将指定的GPIO端口上的一个或多个引脚设置为高电平(通常对应于逻辑“1”)。这个函数是STM32标准外设库(Standard Peripheral Library)中GPIO部分的一部分,用于简化GPIO引脚的控制。
函数原型通常如下:
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin); |
GPIOx 是一个指向GPIO端口的指针,其中 x 可以是 A、B、C 等,表示要操作的GPIO端口。GPIO_Pin 是一个16位的值,指定了要设置为高电平的引脚。你可以使用库中定义的宏(如 GPIO_Pin_0、GPIO_Pin_1 等)来选择单个引脚,或者使用按位或操作(|)来选择多个引脚。例如,如果你想要将GPIOC的第13引脚设置为高电平,你可以这样写代码:
GPIO_SetBits(GPIOC, GPIO_Pin_13); |
这将导致GPIOC的第13引脚输出高电平信号。
需要注意的是,GPIO_SetBits 函数只是简单地将指定引脚设置为高电平,而不关心这些引脚之前的状态或配置。因此,在调用此函数之前,你应该已经通过 GPIO_Init 或类似的函数正确配置了GPIO端口和引脚。
此外,随着STM32库的发展,特别是在HAL(硬件抽象层)库和LL(低层)库引入之后,GPIO_SetBits 函数可能不再是最推荐的方法来设置GPIO引脚的状态。在HAL库中,你通常会使用 HAL_GPIO_WritePin 函数来设置引脚状态,而在LL库中,则可能会使用 LL_GPIO_SetOutputPin 函数。这些新函数提供了更多的灵活性和一致性,同时也与STM32CubeMX工具更好地集成。
因此,如果你的项目是基于较新的STM32库或工具链,建议查阅相应的参考手册或文档,以了解如何以最佳方式控制GPIO引脚。
6.细节
Keil写代码时,最后一行代码完了还得留一行空行,不然会报警告。
作者:大杰#