STM32 HAL库开发——基础篇

news2024/11/24 23:11:28

目录

一、基础知识

1.1 Cortex--M系列介绍

1.2 什么是stm32

1.3 数据手册查看

1.4 最小系统和 IO 分配 

1.4.1 电源电路

1.4.2 复位电路

1.4.3 BOOT 启动电路

1.4.4 晶振电路

1.4.5 下载调试电路

1.4.6 串口一键下载电路 

1.4.7 IO 分配 

1.4.8 总结 

1.5 开发工具

1.6 下载

二、 代码、工程相关

2.1 文本美化

2.2 代码编辑技巧

2.3 查找&替换技巧

三、c语言基础复习 

3.1 stdint.h 

3.2 位操作

3.3 宏定义

3.4 条件编译 

3.5 exturn 声明

3.6 类型别名(typedef) 

3.7 结构体

3.8 指针

3.9 代码规范

四、STM32基础知识

4.1 Cortex M内核 & 芯片 

4.2 F1 框架

4.3 存储器映射

4.4 寄存器映射

4.4.1 使用结构体对寄存器的映射 

五、HAL 库

5.1 认识 HAL 库

5.1.1 CMSIS简介 

5.1.2 HAL库

5.1.3 STM32Cube固件包 

5.2 HAL库的框架结构 

5.3 HAL库的使用

六、新建HAL库版本MDK工程

6.1 新建工程文件夹

6.2 新建工程 

6.3 添加文件

6.4 魔术棒设置

七、STM32启动解析

八、STM32CubeMX 

8.1 新建 STM32CubeMX 工程

九、认识时钟树(F1)

9.1 认识时钟树

9.2 配置系统时钟

十、SYSTEM文件夹介绍

10.1 sys文件夹

10.2 delay文件夹 

10.3 usart文件夹


一、基础知识

1.1 Cortex--M系列介绍

Flash:存放代码

SRAM:内存

外设

1、STM32片内自带SRAM和FLASH,FLASH是用来存储程序的,SRAM是用来存储程序运行中的中间变量,通常不同型号的STM32的SRAM和FLASH大小是不相同的

       FLASH存储器又成为闪存,它与EEPROM都是掉电后数据不丢失的存储器,但是FLASH得存储容量都普遍的大于EEPROM,,在存储控制上,最主要的区别是FLASH芯片只能一大片一大片地擦除,而EEPROM可以单个字节擦除。

2、SRAM是静态随机存取存储器。它是一种具有静止存取功能的内存,不需要刷新电路即能保存它内部存储的数据。STM32F1系列可以通过FSMC外设来拓展SRAM。

       注意:SRAM和SDRAM是不相同的,SDRAM是同步动态随机存储器,同步是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准;动态是指存储阵列需要不断的刷新来保证数据不丢失;随机是指数据不是线性依次存储,而是自由指定地址进行数据读写。STM32的F1系列是不支持SDRAM的。

       

DMIPS:每秒处理多少指令

MHZ:可以产生多少的DMIPS 

MCU指的是微控制器,集合了FLASH、RAM和一些外围器件。MCU一般使用片内FLASH来存储和执行程序代码.

MPU指的是微处理器,FLASH和RAM则需要设计者自行搭建,当然MCU也可以外扩。

MPU的电路设计相对MCU较为复杂。MPU将代码存储在外部FLASH中,上电后将代码搬运至RAM中运行。

MCU的启动速度更快,MCU虽然也可以将代码运行在RAM中,但是内部RAM容量小,使用外部扩展RAM的话速度相对内部也较慢。

MCU不具备内存管理单元(MMU),不能运行Linux这种操作系统,只能运行小型操作系统,因此无法运行多进程程序。小型操作系统的RTOS多任务类似于多线程。

MCU相对MPU具有更强的实时性。

MCU相对MPU具有更低的功耗。虽然MPU也有低功耗模式,但不会像MCU那么低。

MPU的主频相对较高,外接的内存也一般是DDR3,DDR4这种速度比较快的,适用于运算比较复杂的。

根据要求也可以使用MCU和MPU配合,现在好多芯片是同时具有MCU和MPU的多核,更方便设计者使用。

MPU现在主要是linux方向的了

1.2 什么是stm32

1.3 数据手册查看

A盘,硬件资料

 

1.4 最小系统和 IO 分配 

 

1.4.1 电源电路

 0R电阻 是维修的时候把这个0欧电阻断开,快速判断是电源问题,还是mcu问题! 

1.4.2 复位电路

上电复位就是利用 104电容充电,充电时间满足时复位

1.4.3 BOOT 启动电路

       正点原子默认用跳线帽将3、5和4、6连接,采用下拉双接地的启动方式,也可上拉,变换跳线帽即可

1.4.4 晶振电路

 

1.4.5 下载调试电路

1.4.6 串口一键下载电路 

1.4.7 IO 分配 

1.4.8 总结 

 

1.5 开发工具

第3步可选,是针对后三种开发板的 

1.6 下载

没有DAP,视频未看

二、 代码、工程相关

2.1 文本美化

该文件可以帮助保存设置 

2.2 代码编辑技巧

 

2.3 查找&替换技巧

 

 

三、c语言基础复习 

3.1 stdint.h 

 

3.2 位操作

3.3 宏定义

无参数的宏定义: 

有参数的宏定义:

3.4 条件编译 

3.5 exturn 声明

3.6 类型别名(typedef) 

3.7 结构体

 

3.8 指针

       指针变量是个变量本身也有地址,就是处理器的位数,stm32就是32位的地址,所以&p_str就是取p_str变量本身的地址

未分配内存时,就是随机指向内存,可能是实际的,也可能是虚拟的内存

3.9 代码规范

四、STM32基础知识

4.1 Cortex M内核 & 芯片 

4.2 F1 框架

主动单元可以单向的向被动单元发送指令

p16 23min后面讲F4的架构

4.3 存储器映射

 

512k *2 = 1MB = 1M字节 

16bit=2*8bit=2Byte 

重点放前三个block就行

4.4 寄存器映射

通过这个表,可以找到每个外设的基地址 ,只需要再找寄存器的偏移地址就可以

 

举个例子:

4.4.1 使用结构体对寄存器的映射 

截图软件:snipaste

该结构体分了28个连续的字节,4*7 

_ IO表示静态 

UL 代表无符号长整形 

五、HAL 库

5.1 认识 HAL 库

5.1.1 CMSIS简介 

 

5.1.2 HAL库

5.1.3 STM32Cube固件包 

 

5.2 HAL库的框架结构 

 

 

主要是为了管理代码

 

5.3 HAL库的使用

ST例程:

 

 

六、新建HAL库版本MDK工程

 

6.1 新建工程文件夹

  

 

只保留 Inc 和 Src 

Middlewares文件夹暂时没有用到什么,先留空就行 

 

6.2 新建工程 

 

可以删除下面两个文件:

6.3 添加文件

 

取消只读,就可以取消keil中文件显示的小钥匙

6.4 魔术棒设置

 

定义了②的宏就说明要用这些

/**
 ******************************************************************************
 * @file     main.c
 * @author   正点原子团队(ALIENTEK)
 * @version  V1.0
 * @date     2020-08-20
 * @brief    新建工程实验-HAL库版本 实验
 * @license  Copyright (c) 2020-2032, 广州市星翼电子科技有限公司
 ******************************************************************************
 * @attention
 * 
 * 实验平台:正点原子 STM32F103 开发板
 * 在线视频:www.yuanzige.com
 * 技术论坛:www.openedv.com
 * 公司网址:www.alientek.com
 * 购买地址:openedv.taobao.com
 ******************************************************************************
 */

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"

void led_init(void);                       /* LED初始化函数声明 */

int main(void)
{
    HAL_Init();                              /* 初始化HAL库 */
    sys_stm32_clock_init(RCC_PLL_MUL9);      /* 设置时钟, 72Mhz */
    delay_init(72);                          /* 延时初始化 */
    led_init();                              /* LED初始化 */
    
    while(1)
    { 
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);    /* PB5置1 */ 
        HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);  /* PE5置0 */ 
        delay_ms(500);
        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);  /* PB5置0 */
        HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);    /* PE5置1 */
        delay_ms(500); 
    }
}

/**
 * @brief       初始化LED相关IO口, 并使能时钟
 * @param       无
 * @retval      无
 */
void led_init(void)
{
    GPIO_InitTypeDef gpio_initstruct;
    __HAL_RCC_GPIOB_CLK_ENABLE();                          /* IO口PB时钟使能 */
    __HAL_RCC_GPIOE_CLK_ENABLE();                          /* IO口PE时钟使能 */

    gpio_initstruct.Pin = GPIO_PIN_5;                      /* LED0引脚 */
    gpio_initstruct.Mode = GPIO_MODE_OUTPUT_PP;            /* 推挽输出 */
    gpio_initstruct.Pull = GPIO_PULLUP;                    /* 上拉 */
    gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;          /* 高速 */
    HAL_GPIO_Init(GPIOB, &gpio_initstruct);                /* 初始化LED0引脚 */

    gpio_initstruct.Pin = GPIO_PIN_5;                      /* LED1引脚 */
    HAL_GPIO_Init(GPIOE, &gpio_initstruct);                /* 初始化LED1引脚 */
}

下载成功后,led1和led2交替闪烁

若结果与预期不同,检查:是否是8Mhz,有无勾选 reset and run

七、STM32启动解析

p30 - p33 讲

八、STM32CubeMX 

8.1 新建 STM32CubeMX 工程

       本讲为第 35 讲,建议先去学习始终和GPIO相关知识后再来

九、认识时钟树(F1)

9.1 认识时钟树

       

       系统时钟为72MHz,可以超频,但两个高速时钟是无法得到72MHz的,所以中间需要一个锁相环,分频后再乘以锁相环的2~16,这里就用高速外部的1分频后乘9=72了,用高速内部的话,2分频后乘最大的16也只是64,所以用高速外部时钟

       HCLK就是AHB高性能总线,SYSCLK到HCLK有一个分频器,一般是不分频

IWDG是独立看门狗

外部石英晶振精确度和稳定性更好,但也需要成本 

 

 

 

这里72M经过8分频到达系统的滴答定时器就是9MHz 

 

 

 

       实际两部分定时器都是72MHz,当APB1是1分频是不满足最大36MHz,会自动2分频,但此时频率×2,所以定时器2-7就是72MHz 

 

 

RTC是实时时钟:时间啊、日历啊 ,优先选择 LSE 

通过PA8往外输出时钟 

 

9.2 配置系统时钟

 

十、SYSTEM文件夹介绍

 

10.1 sys文件夹

10.2 delay文件夹 

 

       72MHz经过8分频后,变成9MHz,函数传入的形参就是72,所以除以8后得到9,给g_fac_us这个全局变量, 1/1MHz=1us,现在是1/9MHz,所以要乘9,就是g_fac_us

 

下面可以参考《CM3技术参考手册》74页图8-2页

微秒计时函数一共可以计时:1/9000000*2^24≈1.864s 

超频到128MHz时可以计时:1/(128000000/8)*2^24 = 1.048576s 

       而毫秒延时函数是通过微秒延时函数实现的,所以当传入的值>1000即>1s时,就要调用多次的微秒延时函数 

因为下面的那种情况是正常频率,正常情况的延时时间范围比超频情况的要大,所以范围大的可以兼容小的,所以选择超频情况的时间范围(小的) 

 

10.3 usart文件夹

 

usart.c 文件中已经配置了代码法的代码 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring:Spring框架中的核心类 ③

一、解读思想 1、用轮廓解读体系。 2、关注细节,不执着细节。 二、核心类设计 1、 容器接口和实现类 ApplicationContext 接口(容器) ①.读取配置文件 ②.注解形成bean 哪种形式的bean统一核心管理使用中心类。 2、 ApplicationCont…

MySQL 子查询

文章目录 子查询单行子查询多行子查询相关子查询 exists 子查询 所谓子查询就是 select 查询语句中还有 select 查询语句,里面的称为子查询或内查询,外面的称为主查询或外查询。 根据查询结果记录数量,子查询可以分为两类: 单行…

机器学习 | 分类问题

目录 一、K近邻算法 二、决策树 1.一些原理介绍 2.决策树案例与实践 三、距离 一、K近邻算法 我们引入accuracy_score,利用score()的方法评估准确性。k近邻算法中的k是一个超参数,需要事先进行定义。 k值得选取经验做法是一般低于训练样本得平方根…

排书 dfs 迭代加深 IDA* 剪枝 java

🍑 算法题解专栏 🍑 排书 给定 n n n 本书,编号为 1 ∼ n 1 \sim n 1∼n。 在初始状态下,书是任意排列的。 在每一次操作中,可以抽取其中连续的一段,再把这段插入到其他某个位置。 我们的目标状态是把…

【云原生-K8s】k8s可视化管理界面安装配置及比较【Kuboard篇】

总览 安装了k8s控制面板,方便日常的问题处理,查看资源状态信息,也可以增加子账号进行开放给其他人员使用,减少命令操作,提升工作效率 前置条件 须有一个正常使用的k8s集群附k8s v1.23版本搭建:https://…

amis框架实现sdk中使用tsx

1.开发过程中,由于自己和同事用的不同方式使用,本人使用react搭建的amis框架,同事用sdk使用方式搭建 2.开发过程中遇到问题,如果需求中出现amis无法满足的组件,需要自己进行自定义组件,而不同使用方式的am…

JVM内存变化分析实战

最近在一次项目压力测试时,监测到JVM内存明显的变化,由于之前开发工作中没有涉及到JVM相关的问题分析,所以特此借这个机会学习和记录。项目使用的JDK版本为 OpenJdk 1.8,虚拟机为 HotSpot。 1. 内存变化情况 在压力测试进行2H48…

Java008——Java关键字和标识符的简单认识

一、Java关键字 围绕以下3点介绍: 1、什么是Java关键字? 2、Java有哪些关键字? 3、Java关键字的作用? 4、Java关键字的使用?后面文章再做介绍 1.1、什么是Java关键字? 定义:被Java语言赋予了…

github开源化课程体系推荐 浙江大学 计算机考研必备408资料汇总 北京大学计算机系资料整理

github漫游指南 github漫游指南 *所有开源课程资料网站整理在文末 什么是GitHub Wiki 百科上是这么说的 GitHub 是一个共享虚拟主机服务,用于存放使用Git版本控制的软件代码和内容项目。它由GitHub公司(曾称Logical Awesome)的开发者Chr…

【手撕Spring源码】深度理解SpringMVC【下】

文章目录 控制器方法执行流程ControllerAdvice 之 ModelAttribute返回值处理器MessageConverterControllerAdvice 之 ResponseBodyAdviceBeanNameUrlHandlerMapping 与 SimpleControllerHandlerAdapterRouterFunctionMapping 与 HandlerFunctionAdapterSimpleUrlHandlerMapping…

Elasticsearch:节点角色 - node roles

你可能已经知道 Elasticsearch 集群由一个或多个节点组成。 每个节点将数据存储在分片上,每个分片存储在一个节点上。 到目前为止,你看到的每个节点都至少存储了一个分片,但值得注意的是,节点并不总是必须存储分片。 这是因为每个…

【Unity3D】运动模糊特效

1 运动模糊原理 开启混合(Blend)后,通过 Alpha 通道控制当前屏幕纹理与历史屏幕纹理进行混合,当有物体运动时,就会将当前位置的物体影像与历史位置的物体影像进行混合,从而实现运动模糊效果,即模…

javascript基础二十二:举例说明你对尾递归的理解,有哪些应用场景

一、递归 递归(英语:Recursion) 在数学与计算机科学中,是指在函数的定义中使用函数自身的方法 在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数 其核心思想是把一个大型…

Redis高级数据结构之GEO

GEO的介绍 Redis3.2版本提供了GEO地址位置信息定位的功能。支持存储地理位置信息来实现诸如摇一摇,附近位置这类地理位置信息的功能。 Redis也是使用业界比较通用的地理位置距离排序算法GeoHash算法。将二维的经纬度坐标数据映射到一维的整数,将所有元素…

1.项目环境部署操作

第一步 将资料中提供虚拟机压缩包, 解压到一个没有中文没有空格, 以及磁盘空间相对充足的磁盘中(大于100GB) 第二步 修改VMware的网卡设置: 统一修改为 88网段, 网关为192.168.88.2 vm虚拟机 windows系统 第三步 将两台项目虚拟机挂载到VMware上

Kubernetes学习笔记-开发应用的最佳实践(2)20230604

三、确保所有的客户端请求都得到了妥善处理 如何在pod启动的时候,确保所有的连接都被妥善处理了 1、在pod启动时避免客户端连接断开 当个pod启动的时候,他以服务端点的方式提供给所有的服务,这些服务的标签选择器和pod的标签匹配。pod需要…

【简单实用框架】【读Excel表】【可移植】

☀️博客主页:CSDN博客主页 💨本文由 我是小狼君 原创,首发于 CSDN💢 🔥学习专栏推荐:面试汇总 ❗️游戏框架专栏推荐:游戏实用框架专栏 ⛅️点赞 👍 收藏 ⭐留言 📝&…

【算法思维】-- 贪心算法

OJ须知: 一般而言,OJ在1s内能接受的算法时间复杂度:10e8 ~ 10e9之间(中值5*10e8)。在竞赛中,一般认为计算机1秒能执行 5*10e8 次计算。 时间复杂度取值范围o(log2n)大的离谱O(n)10e8O(nlog(n))10e6O(nsqrt(…

LinuxC编程——标准IO

目录 标准I/O一、概念二、特点⭐⭐⭐三、缓冲区⭐⭐⭐3.1 全缓冲3.1 行缓冲3.3 不缓冲 四、函数接口⭐⭐⭐⭐4.1 打开4.1.1 fopen4.1.2 freopen4.1.2 容错机制perror 4.2 关闭4.2.1 fclose4.3 读写操作4.3.1 字符I/O4.3.2 行I/O4.3.3 块I/O 4.4 定位操作4.5 文件结束和错误 脑图…

Redis高级数据结构之HyperLogLog

HyperLogLog的介绍 这并不是一种全新的数据结构、实际类型是一种字符串类型。通过一种基数(不重复的元素数量就是基数)算法,便可以使用很小的内存空间完成独立总数的统计。数据集可以是IP、Email、ID等官方给出的统计误差是0.81%&#xff0c…