STM32工程配置(寄存器和库函数)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

建立STM32的工程文件,详述其过程。
STM32的开发方式主要有基于寄存器的方式(与51单片机开发方式相同)、基于标准库(库函数)、基于HAL库的方式

提示:以下是本篇文章正文内容,下面案例可供参考

一、STM32库函数

1.基于寄存器的工程

打开Keil5。
打开Keil5软件
在这里插入图片描述
Project->New Project->再次新建文件夹->文件名Project
芯片选择
固件库
1)打开固件库文件夹
2)打开Libraries
3)打开CMSIS->DeviceSupport->ST->STM32F10x->startup->arm
库函数文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
STM32启动文件
STM32的程序就是从启动文件开始执行的,其就在arm中。复制其中全部文件,回到起初建立的工程模板文件夹,在其中新建一个文件夹Start,将刚刚复制的启动文件粘贴到里面。
在这里插入图片描述
再次回到固件库的STM32F10x文件夹,复制如图所示的三个文件,也粘贴到刚刚新建工程的Start文件夹下。
在这里插入图片描述
在这里插入图片描述
接着打开CM3->CoreSuport,复制其中文件,同样粘贴到Start文件夹下。
在这里插入图片描述
在这里插入图片描述
到此为止,工程的必要文件复制完成。然后回到Keil软件,把刚才复制的文件添加到工程里面。首先选择Source Group1修改其名称为Start,右键选择已经存在的文件到组里来。
在这里插入图片描述
在这里插入图片描述
最后要在工程文件中添加头文件路径,否则软件是找不到.h文件的。点击魔术棒按钮,打开工程选项,在C/C++里,找到Include Paths栏,然后点击右边三个点的按钮,之后在此处新建路径,把Start的路径添加到其中。
在这里插入图片描述
在这里插入图片描述
接下来新建main函数,看工程是否可行。打开刚开始建的工程文件夹,在其中新建文件夹User,将main函数放在其中。
在这里插入图片描述
Keil中,Target中右键添加组,修改名称为User,在User上右键,点击添加新文件,选择C文件,名字为main,下面路径注意要修改成User文件夹,点击ADD。
在这里插入图片描述
在mian.c中右键插入头文件。然后写一个main函数。之后点击Build,编译并建立工程
在这里插入图片描述
在这里插入图片描述
如果想用寄存器开发,工程建立到此处就完成了。

2.配置寄存器点灯

示例:配置寄存器点灯
在Keil中配置调试器,点击魔术棒按钮,选择Debug,此处调试器默认是ULINK,修改成ST-Link Debugger(用什么选择什么),再点击右边的设置按钮,选择flash下载项,勾选Reset and Run(勾选此项,在下载程序后会立刻复位并执行)
在这里插入图片描述
在这里插入图片描述
打开STM32参考手册,首先是RCC的寄存器,来使能GPIO的时钟。GPIO都是APB2的外设,故可根据文档直接定位到(RCC_APB2ENR内)。可以看到有IOPC的时钟,此位就是使能GPIOC的时钟。
在这里插入图片描述
根据位解释可以看出,此位写1就是打开GPIOC的时钟;那么此位写1,其余无关项都先给0,整个寄存器的二进制换成16进制为0x00000010,。
在这里插入图片描述
回到Keil,在while死循环之前,写如下代码:

RCC->APB2ENR = 0x00000010;

此时就可打开GPIOC的时钟了。
第二个寄存器,需要配置一下PC13口的模式,可以在使用手册中找到端口配置高寄存器GPIOx_CRH,x可以是A到E的任意一个字母,CNF13和MODE13就是用来配置13号口的。
在这里插入图片描述
CNF需要配置为通用推挽输出模式,也就是这两位为00;MODE要配置为输出模式,最大速度为50MHz;,这两位为11;其余无关项全给0;则可得寄存器的16进制为:0x00300000
在这里插入图片描述
回到Keil,写如下代码:

GPIOC->CRH = 0x00300000;

接下来给PC13口输出数据,可以找到端口输出寄存器GPIOx_ODR,中间有一位ODR13,这一位写1,13口就输出高电平,写0就输出低电平;此位给1,ODR的值为0x00002000。因为此处灯是低电平点亮(最小系统版上13口处的测试灯),所以给ODR全为0就是量,给ODR 0x00002000就是灭。

GPIOC->ODR = 0x00002000;

全部代码如下:

#include "stm32f10x.h"                  // Device header

int main(void)
{
	RCC->APB2ENR = 0x00000010;
	GPIOC->CRH = 0x00300000;
	GPIOC->ODR = 0x00002000;	//此时灯灭
	GPIOC->ODR = 0x00002000;	//此时灯亮
	while(1)
	{
		
	}
}

这就是配置寄存器的方式进行点灯的操作,可以看出此方式需要不断的查手册来了解每个寄存器的每一位的作用;此操作方式也有弊端,在我们将除PC13之外的位都配置成了0,这样就会影响到其他端口的原有配置,如果压要只配置PC13而不影响其他位,还与要 &=和 |=的操作。

3.基于标准库的工程

打开建立的工程文件夹,新建一个Library,来存放库函数。
在这里插入图片描述
接着打开固件库文件夹,打开其中的Libraries,STM32标准外设驱动,src,全选复制这些文件到我们建立的Library文件夹中。
在这里插入图片描述
在这里插入图片描述
再打开固件库的inc文件夹,此处为库函数头文件,全选复制到Library文件夹下。
在这里插入图片描述
在这里插入图片描述
接着回到Keil软件,在Target处添加组,修改名称为Library;再右键Library选择已经存在的文件,找到Library,全选添加进来。
在这里插入图片描述
此时就把所有的库函数文件都添加进来了。
但是此时对于这个库函数来讲,还不能直接使用,还需要添加一个文件。打开固件库,打开Project,STM32Template,找到其中stm32f10x_conf.h(用来配置库函数头文件包含关系的,还有个用来参数检查的函数定义,是所有库函数都需要的)和两个it结尾(用来存放中断函数的)的文件,复制下来,粘贴到工程的User目录下,
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来回到Keil软件,在User组内,把刚才的三个文件添加进来。
在这里插入图片描述
最后还需要宏定义。可以在头文件右键,打开文件。滑至底部,找到以下语句:

#ifdef USE_STDPERIPH_DRIVER
  #include "stm32f10x_conf.h"
#endif

为条件编译语句,定义了USE_STDPERIPH_DRIVER,下面的语句才有效,所以复制此字符串。
在这里插入图片描述
在这里插入图片描述

打开魔术棒按钮在C/C++中的Define栏添加此字符串。这样才能包含标准外设库,也就是库函数。下面的头文件路径也需要添加。
在这里插入图片描述
在这里插入图片描述
此时基于库函数的工程建立完成。

4.基于标准库实现点灯

库函数也是间接的配置寄存器,步骤也是一样的,首先是使能时钟。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

其中参数配置,在函数处右键,打开其定义,可以根据上面的解释选择参数,此时使能GPIOC,参数2使能。本质还是配置RCC->APB2ENR这个函数。
在这里插入图片描述
步骤2配置GPIO端口函数,需要用到GPIO_Init函数,按照上述相同步骤配置参数(根据函数定义内的参数提示)
在这里插入图片描述
结构体参数的配置和前文相同,右键转到定义,在右边的介绍找到其选择。
按照图中所示,选中字符,Ctrl+F搜索字符。
在这里插入图片描述
选择通用推挽输出。
在这里插入图片描述
Pin和Speed的配置方式完全一样。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
GPIO模式配置,代码如下:

	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,可以设置指定端口的高低电平。参数配置同上。

GPIO_SetBits(GPIOC,GPIO_Pin_13);	//将PC13口置为高电平
GPIO_ResetBits(GPIOC,GPIO_Pin_13);	//将PC13口置为低电平

分别测试,编译下载可以得到点灯的现象。整个代码如下:

#include "stm32f10x.h"                  // Device header

int main(void)
{
	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)
	{
		
	}
}

此处补充一下启动文件的选择,要根据所用芯片来,根据下表可以对照选择。
在这里插入图片描述
所用的STM32F103C8T6(Flash为64K)可以看出选择_md.s的。
在这里插入图片描述

总结

提示:这里对文章进行总结:
步骤
工程架构:
在这里插入图片描述

  • 16
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32的TIM定时器模块可以用来生成脉冲输出,并且可以通过PWM模式调节脉冲的占空比。这里将分别介绍使用操作寄存器库函数的方法来实现pwm脉冲输出。 1. 使用操作寄存器: 首先,需要对TIM定时器的相关寄存器进行配置。具体步骤如下: a) 配置GPIO引脚作为TIM通道的输出引脚。 b) 使能TIM定时器和相关外设时钟。 c) 配置TIM定时器的基本参数,如计数器的预分频值和自动重装载值。 d) 配置TIM定时器的PWM模式。选择PWM模式并设置相应的输出模式和极性。 e) 配置占空比。设置只要在捕获/比较寄存器中设置适当的值即可。 2. 使用库函数: 在使用库函数的方法中,需要先初始化相关的定时器和引脚,然后进行配置。以下是具体步骤: a) 初始化TIM定时器。通过使用库函数进行初始化,可以供选择不同的模式,例如PWM模式等。 b) 配置输出通道相关参数,如输出模式、引脚和极性等。 c) 配置占空比。通过库函数提供的接口,设置不同的占空比值。 无论是使用操作寄存器还是库函数,最后需要启动定时器以开始产生脉冲输出。可以使用库函数提供的启动定时器的接口,也可以通过设置定时器的控制寄存器来实现。 总结而言,实现STM32的TIM定时器PWM脉冲输出可以通过配置寄存器或使用库函数来完成。具体步骤包括配置定时器和引脚,设置PWM模式和占空比,并启动定时器以产生脉冲输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值