【正点原子STM32连载】第五章 APM32基础知识入门摘自【正点原子】APM32F407最小系统板使用指南

news2024/11/26 8:41:15

1)实验平台:正点原子stm32f103战舰开发板V4
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html#

第五章 APM32基础知识入门

本章着重介绍APM32的一些基础知识,令读者对APM32有一个初步的了解,为后面的章节学习做铺垫。对于本章的内容,读者可以先只看一个大概,在后面需要使用到这部分知识点的时候,再回过头来仔细看。
本章分为如下几个小节:
5.1 C语言基础知识复习
5.2 寄存器基础知识
5.3 APM32F407系统架构

5.1 C语言基础知识复习
本节介绍C语言的基础知识,对C语言比较熟练的读者,可以跳过本节,对于基础比较薄弱的读者,建议好好学习一下本节的内容。
由于C语言博大精深,不可能由一小节的内容就全讲明白,所以本节知识回顾在进行APM32开发时常用的几个C语言知识点,以便读者的更好的学习本书后续的内容,并编写相关的代码。
5.1.1 位操作
C语言的位操作就是对基本类型变量进行位级别的操作。本节的内容比较简单,这里也就点到为止,不深入探讨。下面先讲解几种位操作运算符,然后介绍其相关的使用技巧。C语言支持如下6种位操作的运算符:
在这里插入图片描述

下面介绍这些位操作运算符的使用技巧。
①:在不改变其他位的状况下,对某几个位进行设值
这个场景在单片机开发中经常使用,方法就是先对需要设置的位用&运算符进行清零操作,然后用|运算符设值。例如要设置GPIOA的ODATA寄存器Bit6(第6位)为1,则可以先使用&运算符对该寄存器的Bit6进行清零操作:
GPIOA->ODATA &= 0xFFFFFFBF; /* 将Bit6清0 /
然后再使用|运算符对该寄存器的Bit6进行置1操作:
GPIOA->ODATA |= 0x00000040; /
将Bit6置1 /
②:移位操作提高代码的可读性
例如①中|操作使用到的0x00000040,虽然通过换算,可以知道是将Bit6置1,但是这样的表达可读性比较差,可以通过移位操作对其进行改进:
GPIOA->ODATA |= (1 << 6); /
将Bit6置1 /
这么一来,就可以非常直观地看出是将Bit6置1了。
③:按位取反操作使用技巧
②中使用移位操作改进①中仅使用|运算将Bit6置1的可读性,但要改进①中使用&运算将Bit6清0的可读性还需借助按位取反操作:
GPIOA->ODATA &= ~(1 << 6); /
将Bit6清0 /
这么一来,就可以非常直观地看出是将Bit6清0了。
④:按位异或操作使用技巧
按位异或可以很方便地对Bit位进行翻转,例如不考虑LED当前是何种状态,只要求控制LED翻转状态等情况(假设LED的亮灭状态由PA6输出的高低电平控制):
GPIOA->ODATA ^= (1 << 6); /
Bit6的值取反 */
这么一来,就可以很方便地操作PA6引脚输出相反的电平,而不用先读取PA6输出的电平状态然后才输出相反的电平。
5.1.2 define宏定义
define是C语言中的预处理命令,它用于宏定义,可以提高源代码的可读性,为编程提供方便,其常见的格式如下:
#define 标识符 字符串
“标识符”为所定义宏的名称;“字符串”可以是常数、表达式、格式串等。例如:
#define HSE_VALUE 8000000U
定义标识符HSE_VALUE的值为8000000U,数字后的U是unsigned(无符号)的意思,随后便可在程序代码中使用HSE_VALUE来代替8000000U。
至于define宏定义的一些其他高级用法,例如宏定义带参数等,本章不过多介绍。
5.1.3 ifdef条件编译
在单片机程序开发过程中,经常会遇到需要在满足某些条件时对一段代码进行编译,而当条件不满足或满足另一条件时编译另一段代码,这就可以使用条件编译,条件编译最常见的形式如下:
#ifdef 标识符
代码段1
#else
代码段2
#endif
如上的条件编译,当标识符被定义过(一般使用define进行定义),则代码段1会被编译,否则会编译代码段2。
5.1.4 extern外部申明
C语言中extern关键字用于修饰变量或函数,以表示变量或函数定义在别的文件中,提示编译器遇到此变量或函数时,需在其他文件中寻找其定义。这里要注意的是,可以使用extern多次在不同文件中修饰同一个变量或函数,但该变量或函数只能被定义一次
5.1.5 typedef类型别名
typedef用于为现有类型创建一个新的名字,或称为类型别名,用来简化变量的定义。例如在编写程序时经常使用到的uint8_t、uint16_t和uint32_t等都是由typedef定义的类型别名,其定义如下:
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
这么一来就可以在编写程序代码的时候使用uint8_t等代替unsigned char等,极大地提高的代码的可读性可编写代码的效率。
5.1.6 struct结构体
struct用于定义结构体,结构体就是一堆变量的集合,结构体中的成员变量的作用一般都是相互关联的,定义结构体的形式如下:

struct 结构体名
{
    成员变量1的定义;
    成员变量2的定义;
    ......
};
例如:
struct lcd_device_struct
{
    uint16_t width;
    uint16_t height;
};

如上举例的结构体定义,一堆描述LCD屏幕的变量的集合,其中包含了LCD屏幕的宽度和高度。
结构体变量的定义如下:
struct lcd_device_struct lcd_device;
如上,就定义了一个名为lcd_device的结构体变量,那么怎么访问这个结构体变量中的成员变量呢?如下:
lcd_device.width = 240;
printf(“LCD Height: %d\n”, lcd_device.height);
如上就展示了结构体变量中成员变量的访问操作。
5.1.7 指针
指针是另一个变量的变量,指针变量在内存中保存的是另一个变量在内存中的地址,通过指针可以访问到另一个变量所在内存地址中的数据。
举一个定义指针的例子,如下:
char p_str = “This is a string!”;
如上,就定义一个名为p_str的指针变量,并将p_str指针指向了字符串“This is a string!”保存在内存中首地址,对于APM32来说,此时p_str的值就是一个32位的数,这个数就是一个内存地址,这个内存地址就是上述字符串保存在内存中的首地址。
通过p_str指针就可以访问到字符串“This is a string!”,那具体是如何访问的呢?前面说p_str保存的是一个内存地址,那么就可以通过这个内存地址去内存中读取数据,通过
p_str就可以访问地址为p_str的内存数据,(p_str + 1)可以访问下一个内存地址中的数据。
知道了如何访问内存中的数据,但是读取到的数据要如何解析呢?这就有p_str指针的类型决定了。在这个例子中p_str是一个char类型的指针,那么访问
p_str就是访问地址为p_str,大小为sizeof(char)(一般为一个字节)的一段内存数据,在这个例子中就可以读取到字符“T”, 读取*(p_str + 1)就是“h”,以此类推。
指针是C语言的精髓,但也是初学者望而生畏的一个知识点,若读者一时半会无法理解指针的用法也没关系,善用搜索引擎,网上有很多参考的学习资料。
5.2 寄存器基础知识
寄存器(Register)是一种特殊的内存,它主要用于实现控制和访问MCU的内核和各个片上外设。
对于APM32来说,寄存器一般都是32位的,但由于MCU上的内存资源十分宝贵,因此在一个32位寄存器中,会使用其中的1位或多位来控制或访问MCU的内核或各个片上外设的一种功能,但即使如此,APM32上也还是有上百个寄存器,这实际上是因为APM32有很多的片上外设导致的,只要将这些寄存器按照功能分好类,学起来就不难了。
从大方向来区分,APM32中的寄存器可分为两大类,分别为内核寄存器和外设寄存器,大类下还可以分出许多小类,如下表所示:
在这里插入图片描述

表5.2.1 APM32寄存器分类
对于初学者来说仅需在学习MCU的各个片上外设时,再去学习该片上外设相关的寄存器即可。
5.3 APM32F407系统架构
APM32F407是Geehy公司基于ARM授权Cortex-M4内核设计的一款芯片,而Cortex-M内核采用了ARM v7-M架构,具有低成本、低功耗、实时性好、中断响应快、处理效率高等特点。
5.3.1 Cortex-M4内核&芯片
ARM公司提供内核(例如Cortex-M4内核)授权,完成的MCU芯片还需要很多其他的组件。芯片公司(例如Geehy)在获取Cortex-M4内核授权后,就可以将其用于自己的芯片设计中,并添加存储器、外设、I/O等其他组件。同于型号的芯片也会有不同的规格,实际当大多数就是存储器容量、外设资源等的差异。
5.3.2 APM32F407系统框图
APM32F407的系统框图,如下图所示:
在这里插入图片描述

图5.3.2.1 APM32F407系统框图
从上图可以看出,APM32F407就是在ARM提供的Cortex-M4内核上通过各种总线,挂载了各种各样的外设和存储器。
5.3.3 地址映射
APM32是32位的MCU,因此其地址总线的宽度也是32位,因此最大可访问的内存空间为4GB(2^32=4GB),APM32就将这4GB的空间映射给各种寄存器和存储器。
APM32F407地址映射图,如下图所示:
在这里插入图片描述

图5.3.3.1 APM32F407地址映射图

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

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

相关文章

电脑提示数据错误循环冗余检查怎么办?

有些时候&#xff0c;我们尝试在磁盘上创建分区或清理硬盘时&#xff0c;还可能会遇到这个问题&#xff1a;数据错误循环冗余检查。这是如何导致的呢&#xff1f;我们又该如何解决这个问题呢&#xff1f;下面我们就来了解一下。 导致冗余检查错误的原因有哪些&#xff1f; 数据…

使用AT命令操作Modem 3G/4G模块

1. 引言 AT命令是一种通信协议&#xff0c;用于控制和配置各种设备&#xff0c;尤其在通信领域中具有重要性。它的名称来源于"ATtention"&#xff08;注意&#xff09;&#xff0c;因为命令通常以"AT"开头。AT命令最早被用于调制解调器&#xff0c;用于与…

驱动阿托斯DLHZO-T伺服比例阀放大器定制

DLHZO-T型伺服比例换向阀&#xff0c;直动式&#xff0c;带LVDT位置传感器和阀芯零遮盖&#xff0c;可应用于各种位置闭环控制实现最佳的性能。 比例阀和模块式数字放大器配合使用。 LVDT传感器和阀套结构可确保非常高的调节精度和响应灵敏度。 失电保护位可实现在电源中断的…

一文读懂3D开发工具HOOPS SDK

近年来&#xff0c;随着对定制软件开发需求的增加&#xff0c;我们也目睹了新的软件开发工具和技术的加入。 大部分企业在移动和Web应用程序开发上投入了大量的精力&#xff0c;这表明市场对技术软件解决方案的需求在增加。然而&#xff0c;在开发软件的过程中&#xff0c;是可…

基于 SIFT 和 RANSAC 算法对高分辨率图像进行图像伪造检测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

kafka基本概念及操作

kafka介绍 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的 &#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各…

技术解析丨主轴自动换刀系统是如何工作的?有哪些优点?

一、主轴气动自动换刀系统原理 1.当加工过程中需要更换主轴上的刀具时&#xff0c;操作人员通过控制系统发出换刀指令。 2.控制系统根据指令向气动系统发送动作信号&#xff0c;驱动气动马达带动换刀机构运动。 3.换刀机构中的刀具夹持器将现有刀具从主轴上取下&#xff0c;…

FreeRTOS(事件组)

资料来源于硬件家园&#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、事件的概念与应用 1、事件的概念 2、事件的应用 二、事件的运作机制 1、FreeRTOS中事件组的句柄 2、FreeRTOS 任务间事件标志组的实现 3、FreeRTOS 中断方式事件标志组的实现…

vue2学习:reduce方法和computed计算属性用法

reduce reduce可以遍历集合并将集合所有的值汇总为一个。 第一个参数是一个回调函数&#xff0c;函数第一个参数是汇总起来的最终值&#xff0c;默认是集合的第一项&#xff0c;函数第二个参数是集合遍历出来的集合元素&#xff1b; 第二个参数可以指定回调函数中第一个参数汇…

62、华为昇腾开发板Atlas 200I DK A2配置mmpose的hrnet模型推理python/c++

基本思想&#xff1a;适配mmpose模型&#xff0c;记录一下流水帐&#xff0c;环境配置和模型来自&#xff0c;请查看参考链接。 链接: https://pan.baidu.com/s/1IkiwuZf1anyKX1sZkYmD1g?pwdi51s 提取码: i51s 一、转模型 (base) rootdavinci-mini:~/sxj731533730# atc --mo…

优测云服务平台|【压力测试功能升级】轻松完成压测任务

一、本次升级主要功能如下&#xff1a; 1.多份报告对比查看测试结果 2.报告新增多种下载格式 Word格式Excel格式 3.新增多种编排复杂场景的控制器 漏斗控制器并行控制器事务控制器仅一次控制器分组控制器集合点 4.新增概览页面&#xff0c;包含多种统计维度 二、报告对比…

智慧工地源码,互联网+建筑工地,基于微服务+Java+Spring Cloud +Vue+UniApp开发

基于微服务JavaSpring Cloud VueUniApp MySql开发的智慧工地云平台源码 智慧工地概念&#xff1a; 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;然后以物联网、移动互联网技术为基础&#xff0c;充分应用BIM、大数据、人工智能、移…

DoorGym:开源的可拓展的开门仿真环境,用于域随机化的强化学习、深度强化学习

0.概述 目的&#xff1a;创建一个可以改变门把手形状、类型、位置、环境颜色、照明条件、机械臂结构的仿真环境&#xff0c;以训练出鲁棒性更高、更能关注到任务本质特征、容易迁移到现实的模型 网址&#xff1a;环境下载&#xff0c; 1.领域随机化DR 假设很难对目标域进…

在Visual Studio上,使用OpenCV实现人脸识别

1. 环境与说明 本文介绍了如何在Visual Studio上&#xff0c;使用OpenCV来实现人脸识别的功能 环境说明 : 操作系统 : windows 10 64位Visual Studio版本 : Visual Studio Community 2022 (社区版)OpenCV版本 : OpenCV-4.8.0 (2023年7月最新版) 实现效果如图所示&#xff0…

SAP SM30 自动带出描述实现

需求&#xff1a; 在SM30中维护销售订单类型的时候&#xff0c;根据维护的销售订单类型自动带出订单类型描述 事务码&#xff1a; SE11 进入表维护生成器中 创建事件 选择【维护事件】: 05 自定义子例程&#xff1a; SET_DESCRIPTION 点击编辑器按钮进行代码编辑 具体代码…

浅学实战:探索PySpark实践,解锁大数据魔法!

文章目录 Spark和PySpark概述1.1 Spark简介1.2 PySpark简介 二 基础准备2.1 PySpark库的安装2.2 构建SparkContext对象2.3 SparkContext和SparkSession2.4 构建SparkSession对象2.5 PySpark的编程模型 三 数据输入3.1 RDD对象3.2 Python数据容器转RDD对象3.3 读取文件转RDD对象…

【力扣每日一题】1572. 矩阵对角线元素的和 8.11打卡

文章目录 题目思路代码 题目 1572. 矩阵对角线元素的和 难度&#xff1a; 简单 描述&#xff1a; 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 返回合并后的二叉树。 注意…

(leecode)密码检查

有点感觉&#xff0c;试试看~ 先贴解法&#xff0c;再说题目和思路 题解 #include <stdio.h> #include <string.h> #include <ctype.h>int main() {int N 0;scanf("%d",&N);getchar();while(N--) {char str[101] {0};scanf("%s&…

Android性能优化——内存优化

一、内存问题 内存抖动&#xff0c;锯齿状&#xff0c;GC导致卡顿内存泄漏&#xff0c;可用内存减少&#xff0c;频繁GC 内存溢出&#xff0c;OOM&#xff0c;程序异常 二、内存分析工具 Memory ProfilerMemory Analyzer LeakCanary Memory Profiler 实时图表展示应用内存使…

10分钟极速入门dash应用开发

大家好我是费老师&#xff0c;几天前我发布了由我开源维护的dash通用网页组件库fac的0.2.x全新版本&#xff0c;为大家介绍了其具有的诸多实用特性功能&#xff0c;也吸引了很多对基于dash的Python全栈应用开发感兴趣的朋友&#xff0c;为了方便更多对dash应用开发不甚了解的朋…