STM32开发方式

news/2025/2/26 21:56:47

1.1 寄存器开发

学过51单片机的同学应该知道,51单片机教程都是讲解的寄存器开发,但是这种开发方式对于STM32就变得比较困难,因为STM32的寄存器数量是51单片机的十数倍如此多的寄存器根本无法全部记忆, 开发时需要经常的翻查芯片手册(找到对应的寄存器,在特定的比特位写入对应的值),直接操作寄存器就变得非常的费力了。但还是会有很小一部分人,喜欢去直接操作寄存器,因为这样更接近原理,知其然也知其所以然。

//基本流程 
//1.需求 通过gpio点亮LED2
//2.根据原理图-->对应的管脚 PC13
//3.根据芯片手册-->找到控制该管脚的相关寄存器 
       RCC_APB2ENR [4] = 1;  
       0x40021000+0x18
       GPIOC_CRH [23:20] = 0b 0010  //输出 2mhz 通用推挽
       0x40011000+0x4
       GPIOC_ODR [13]  = 0;   //输出低电平
       0x40011000+0xc
    
            
//4.编程实现
#define RCC_APB2ENR *(volatile unsigned int *)0x40021018
#define GPIOC_CRH   *(volatile unsigned int *)0x40011004    
#define GPIOC_ODR   *(volatile unsigned int *)0x4001100C    
int main(void)
{
    RCC_APB2ENR |= (0X1<<4);
           
    GPIOC_ODR |= (0X1<<13);   
    GPIOC_CRH &= ~(0XF<<20);
    GPIOC_CRH |= (0X2<<20);
    
    while(1){
        GPIOC_ODR &= ~(0X1<<13);  //低电平 点亮
        mydelay(1000);
        GPIOC_ODR |= (0X1<<13);   //高电平 熄灭
        mydelay(1000);
    }
}    

1.2 标准库

STM32有非常多的寄存器从而导致开发困难,所以为此ST公司就为每款芯片都编写了一份库文件,也就是工程文件里stm32f10x_xxx.c 和stm32f10x_xxx.h。开发者可以调用库里面的函数接口来配置STM32的寄存器以实现各种功能,这种方式使得开发人员不用直接去操作寄存器,提高了开发速度,代码更具可读性,方便维护。这也是目前最多人使用的方式。
//示例:
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); //使能时钟
     //管脚的初始化
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;        //pin13
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;  //低速
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出
    GPIO_Init(GPIOC,&GPIO_InitStructure);
        
     while(1){
        GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET); //低电平 点亮
        mydelay(1000);
        GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);  //高电平 熄灭
        mydelay(1000);
     }

1.3 HAL库

HAL库是ST公司目前主力推的开发方式,全称就是Hardware Abstraction Layer(抽象印象层)。它的出现比标准库要晚,但其实和标准库一样,都是为了节省程序的开发时间。HAL的集成度更高,同样的功能,标准库可能要用几句话,HAL库只需用一句话就够了。并且HAL库也很好的解决了程序移植的问题,不同型号的stm32芯片它的标准库是不一样的,例如在F3上开发的程序移植到F4上是不能通用的,而使用HAL库可以实现。而且使用ST公司研发的STMcubemx软件,可以通过图形化方式进行功能配置(更加方便),直接生成整个使用HAL库的工程文件,可以说是方便至极,但是方便的同时也造成了它执行效率的低下。

1.4 LL库

LL库,即STM32Cube Low-Layer,也叫Cube LL、Cube底层库。早在2014年,ST推出了STM32CubeMX这款工具,同步推出了对应的STM32Cube HAL库。但是,HAL存在一些问题:代码量大、执行效率低等缺点。因此,在2017年,ST推出了STM32Cube LL库,目的就是为了解决的HAL库的缺点,让开发STM32的工程师有更多的选择。

在这里插入图片描述


http://www.niftyadmin.cn/n/5869205.html

相关文章

Spring Boot 项目中,JDK 动态代理和 CGLIB 动态代理的使用

在 Spring Boot 项目中&#xff0c;JDK 动态代理和 CGLIB 动态代理都是实现 AOP (面向切面编程) 的重要技术。 它们的主要区别在于代理对象的生成方式和适用范围。 下面详细介绍它们的使用场景&#xff1a; 1. JDK 动态代理 (JDK Dynamic Proxy) 原理&#xff1a; JDK 动态代理…

labview关于计时器的使用

通过使用计时器函数&#xff0c;可以对采集和保存实现很好的控制&#xff0c;因为之前通过等待函数有出现程序卡死的情况&#xff0c;这里用到定时器函数来实现时间控制。 根据用户输入的采集频率&#xff0c;和采集的单位来确定是否上次采集的时间间隔减去这次计时器的时间是…

故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断

故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断 目录 故障诊断 | Matlab实现基于DBO-BP-Bagging多特征分类预测/故障诊断分类效果基本介绍模型描述DBO-BP-Bagging蜣螂算法优化多特征分类预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目的与方法 二…

补题A-E Codeforces Round 953 (Div. 2)

https://codeforces.com/contest/1979 A. Guess the Maximum 原题链接&#xff1a;https://codeforces.com/contest/1979/problem/A 求相邻元素的最大值的最小值。 #include <bits/stdc.h> using namespace std; #define IOS ios::sync_with_stdio(0), cin.tie(0), cout…

UE5网络通信架构解析

文章目录 前言一、客户端-服务器架构&#xff08;C/S Model&#xff09;二、对等网络架构&#xff08;P2P&#xff0c;非原生支持&#xff09;三、混合架构&#xff08;自定义扩展&#xff09;四、UE5网络核心机制 前言 UE5的网络通信主要基于客户端-服务器&#xff08;C/S&am…

《Keras 3 单眼深度估计》:此文为AI自动翻译

《Keras 3 单眼深度估计》 作者:Victor Basu 创建日期:2021/08/30 最后修改时间:2024/08/13 描述:使用卷积网络实现深度估计模型。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 介绍 深度估计是从 2D 图像推断场景几何结构的关键步骤。 单眼深度估计的目标是预…

【cuda学习日记】4.2 内存访问模式

4.2.1 缓存加载 如图&#xff0c;全局内存通过缓存来实现加载/存储。所有对全局内存的访问都会通过二级缓存&#xff0c;也有许多访问会通过一级缓存。如果这两级缓存都被用到&#xff0c;那么内存访问是由一个128字节的内存事务实现的。如果只使用了二级缓存&#xff0c;那么这…

九九乘法表 matlab

J的第一行的1分别乘以I的九列数&#xff0c;就是1的乘法表 1*11 1*22 。。。