【自学嵌入式:stm32单片机】开发点灯测试

寄存器开发点灯测试

STM32单片机基本结构图

image

打开寄存器点灯的流程

image

image

image

利用RCC寄存器,APB2外设时钟使能寄存器
只给时钟使能端IOPCEN置1
image

端口配置高寄存器CNF13和MODE13配置13号口,CNF设置为00,推挽输出,MODE设置为11,50Hz,其他都配置为0
,二进制就是00 00 00 00 00 11 00 00 00 00 00 00 00 00 00 00,换算成16进制就是0030 0000

然后操纵端口输出数据寄存器GPIOx_ODR
image

ODR13设置为1,13号口就是高电平,写0,13号口就是低电平
如果写1的话, 那就是0000 0000 0000 0000(保留), 0010 0000 0000 0000,写成16进制就是0x00002000,灯是低电平点亮,给ODR调为全0就是量,调为0x00002000就是灭

main.c

#include "stm32f10x.h"                  // Device header

int main(void)
{
	RCC->APB2ENR = 0x00000010; //打开RCC寄存器时钟
	GPIOC->CRH = 0x00300000;
	GPIOC->ODR = 0x00000000;
	while(1)
	{
		
	}
}

现在给ODR全0,观察GPIO 13口的灯是不是亮起来了
image
然后将ODR设置为0x00002000关掉LED灯

#include "stm32f10x.h"                  // Device header

int main(void)
{
	RCC->APB2ENR = 0x00000010; //打开RCC寄存器时钟
	GPIOC->CRH = 0x00300000;
	GPIOC->ODR = 0x00002000;
	while(1)
	{
		
	}
}

可以看到灯灭了
image
但是这种配置寄存器的方式,还要看手册,而且只配置13端口,还要&=和|=操作,这个在51单片机中经常遇到,这种寄存器配置方式虽然代码简洁,但是不太方便,接下来用库函数方式实现

使用标准库函数的方式点灯

image
把固件中的库函数源文件和头文件复制过来
image
把配置中断和设置的头文件和源文件复制到User目录
image

打开stm32f10x.h,找到这里
这里是如果你定义了USE_STDPERIPH_DRIVER这个字符串,下面这个#include "stm32f10x_conf.h"才有效,所以复制这个字符串,打开工程选项,在C/C++的Define栏目粘贴这个字符串
image
这样才能包含标准外设库,也就是库函数
然后还要设置下面的头文件路径
把User和Library目录也都添加上
image
这样我们基于库函数的工程就建好了

然后编译看一下,第一次编译比较慢,以后就快了
image

然后我们用库函数实现电灯操作

#include "stm32f10x.h"                  // Device header

int main(void)
{
	//使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	//结构体填入GPIO_Init参数
	GPIO_InitTypeDef GPIO_InitStructure;
	//结构体三个参数,分别是GPIO模式、GPIO端口、GPIO速度
	//GPIO_Mode是一个枚举类型,GPIO_Mode_Out_PP是推挽输出
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //宏定义
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置频率
	//配置端口模式,配置GP 13口,第一个参数是GPIOC
	//第二个参数是指向结构体的指针
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	//设置端口高低电平进行点灯
	//GPIO_SetBits(GPIOC, GPIO_Pin_13); //设置13号口高电平
	GPIO_ResetBits(GPIOC, GPIO_Pin_13); //设置13号口低电平
	//
	while(1)
	{
		
	}
}

然后灭灯

#include "stm32f10x.h"                  // Device header

int main(void)
{
	//使能时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	//结构体填入GPIO_Init参数
	GPIO_InitTypeDef GPIO_InitStructure;
	//结构体三个参数,分别是GPIO模式、GPIO端口、GPIO速度
	//GPIO_Mode是一个枚举类型,GPIO_Mode_Out_PP是推挽输出
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //宏定义
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //设置频率
	//配置端口模式,配置GP 13口,第一个参数是GPIOC
	//第二个参数是指向结构体的指针
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	//设置端口高低电平进行点灯
	GPIO_SetBits(GPIOC, GPIO_Pin_13); //设置13号口高电平
	//GPIO_ResetBits(GPIOC, GPIO_Pin_13); //设置13号口低电平
	//
	while(1)
	{
		
	}
}

stm32库函数和GPIO口下节再详细分析

选择启动文件

image

新建工程步骤

image
【注】建目录是为了方便管理,这个目录的名称和数量没有限制

工程架构

image
STM32启动程序是汇编写的,当STM32进入复位中断后,程序开始执行

用HAL库实现电灯并闪烁

HAL 库(Hardware Abstraction Layer,硬件抽象层)是 ST 公司为 STM32 系列单片机推出的官方库函数,旨在简化开发流程,让开发者无需深入了解底层硬件细节即可操作芯片外设。HAL 库虽会增加少量代码体积,但大幅提升开发效率。

  • 跨芯片兼容性:同一套 API 可在不同型号 STM32 上使用

  • 降低入门门槛:无需精通寄存器操作即可开发

  • 官方持续维护:随新芯片发布同步更新

posted @ 2025-08-08 07:31  秦瑞迁  阅读(122)  评论(0)    收藏  举报