STM32 学习笔记_3 程序编写基础;arm 内核架构

news2024/10/5 17:21:01

程序编写基础

Keil 编辑器设置

image-20230413000523924

抛开 tab 和空格哪个好看不谈,不同编译器设置格式不同,空格比较保险。

用户关键字:打出来的时候会高亮。

image-20230413001147591

代码提示:(symbols after 是几个字符后开始提示关键字的意思)

image-20230413001314821

以上的四个配置会保存在 global.prop 文件里,以后重装保存这个文件就可以保存配置。

常用操作

shift tab 整体左移,直接 tab 右移。

函数变量快速定位:魔术棒-output-browse information。右键 goto definition 即可跳转。

快速注释:有一个 // 的符号,选中代码段后点击一下即可快速注释。

快速打开头文件:右键头文件名-open document xxx.h

查找:image-20230413011326761

replace 是替换。

build output 窗口里双击 error 是可以快速定位过去的。

窗口视图恢复默认状态的方法:window à Reset View to Defaults + Reset

C语言基础

stdint.h

c99中的标准库文件。

image-20230413020428445

image-20230413020443388

位操作

& | ~ ^ << >> 没啥多说的。

给某一位赋值:1. 先&把其他位保留,该位置0,再|把其他位保留,该位置1. temp &= 0xFFFFFFBF; temp |= 0x00000040;

  1. temp &= ~(1<<6); temp |= 1<<6;

宏定义

#define PI 3.14159

image-20230413131117716

#define __set_task_state(tsk, state_value)   \
  do { (tsk)->state = (state_value); }  while (0)

一定要用 do while(0) ,这样程序才会按照我们期望的方式执行。

宏定义为什么要使用do{……}while(0)形式_土豆爸爸的博客-CSDN博客

宏定义避免影响控制流程,比如宏定义的函数里面可以 return 就比较危险。

image-20230413131450340

宏定义传参避免参数变化,如 (SQUARE(a++))

image-20230413131533236

image-20230413022443594

extern

用 extern 声明的函数或变量代表是在其他文件定义的。

image-20230413022918348

typedef

typedef unsigned char uint8_t;

struct

image-20230413023046175

image-20230413023139081

指针

char *ptr="234";

代码规范

tab 设置为4个字符。

80列后的字符分行。

image-20230413033058738

image-20230413033117662

相对独立的代码块,变量之间加空行。

多行语句不要写在一行里。if 语句也是,而且 if 语句后面哪怕只有一个语句也不要偷懒,加大括号。while 后面没有执行语句的话可以不用大括号。

左括号另起一行。

if、swich、case、for、do、while 后加空格。

sizeof、typedof、alignof 后面不加空格。

指针的*靠近变量名,而不是数据类型。

= + - < > * / % | & ^ <= >= == != ? : 左右加空格。

一元操作符后不加空格, & * + - ~ ! sizeof typeof alignof __attribute__ defined。

++ – . -> 前后都不加空格。

逗号和分号只在后面加空格。

注释 /* 内容 */ 和内容之间加空格。

注释规范

image-20230413034927343

image-20230413034952309

image-20230413035001669

星数必须100个。和代码开始隔一行。

函数注释:

image-20230413035526319

image-20230413035535796

image-20230413035938271

image-20230413035945902

代码注释:

image-20230413040034734

过长放在代码前。

标识符命名:小写,下划线分割,这是 unix 风格。

常用反义词:

image-20230413120036503

循环变量允许 ijk。可以用 g_ p_ 开头表示是全局变量或指针。

不用 u8 u16 u32,使用:

image-20230413120241744

函数命名同变量。

宏命名全大写,单词间用下划线分隔。

函数:一个函数只实现一个功能。

函数之间空行分隔,export 紧跟着函数。

image-20230413120402318

嵌入式开发 linux 常用 goto,清理操作之类很方便。

函数嵌套不建议>4层。

函数要处理好输入参数的合理性,出现错误也能准确返回错误信息。

只在本文件范围内定义的函数变量 static 修饰。

一个变量最好不要多用途。

image-20230413122654031

少用全局变量,避免全局变量和局部变量重名。

初始化尽量使用初值。直接赋值或者 ?: 赋值。

明确全局变量的初始化位置,且减少不必要的数据类型转化。

内核架构

内核 ARM 厂商授权,外设其他公司添加。板子上黑色的 STM32 一整个就是 arm 公司架构和已发半导体公司合作的结果。

image-20230413193540763

F1 架构

image-20230413194651347

image-20230413194954346

主动单元可以给被动单元发起通信。

以总线矩阵为分界线,左边是主动单元,右边是被动单元。

ICode 直接连接到 FLASH 而不需要总线矩阵做中介,里面存储的是程序,这样访问程序速度很快。

image-20230413195408442

ICode 总线对应图中的 IBus。

image-20230413195859793

外设分为不同频率满足不同外设的需求。

cortex-M3 内核:

左上和右上是跟踪调试,左下是下载。

image-20230413200045162

SDIO 和时钟:

image-20230413200248009

APB 外设:

image-20230413200426202

ICode:

image-20230413200506259

以及一些正点课件里没有详细展开说明的内容:从上到下依次是电源,电源管理,外部晶振,看门狗计时器。

image-20230413200708790

此外,互联型的开发板还会添加网络模块的主动单元,不过我们的不是。

F4 架构

image-20230413201012608

在 ARM Cortex-M4 中,FSMC 是一种嵌入式外设,它代表外部存储器接口。FSMC 支持连接到存储器、LCD 显示器和其他外部设备,可以实现高速数据传输和存储器扩展,以满足大多数嵌入式系统的要求。——ChatGPT

image-20230413201237816

CCM 存数据,访问速度快,但是不支持 DMA。

总线时钟频率:

AHB1/2:168/180MHz (Max)

APB1:42/45MHz (Max)

APB2:84/90MHz (Max)

系统原理图基本和 F1 差不多。

F7 架构

image-20230413202136751

image-20230413202154993

image-20230413203743899

寻址范围

32位单片机,32位地址总线。

存储单元按字节编址。就是说有2^32个按字节编址的存储单元。

每个存储单元的寻址范围:0x0000_0000~0xFFFF_FFFF。

存储器映射

存储器自己是没有地址的,是我们给他映射过去的。

image-20230413204709800

前三个是学习的重点。

image-20230413204927606 image-20230413204937494

image-20230413204946174

寄存器映射

寄存器是单片机内部的控制结构,我们的目的归根结底就是控制寄存器,进而控制单片机。

image-20230413210100271 我们主要学习外设寄存器。

给寄存器地址命名的过程叫寄存器映射。如 0x4001080c -> GPIOA_ODR。

stm32 GPIO 每组16个 IO 口,比51多一倍。

image-20230413210802320

名字:GPIOx_ODR。

地址偏移:基于 00 最小的地址加一个偏移值。

寄存器复位值:0x0000_0000.

寄存器位表:查看每个位的偏移量,名称,权限。

image-20230413211248709

位功能描述:比如1亮灯,0灭灯。

操作寄存器:比较逆天的方式是直接操作寄存器地址。

*(unsigned int *)(0x4001_080c)=0xFFFF;

寄存器映射:

#define GPIOA_ODR *(unsigned int *)(0x4001_080c)

GPIOA_ODR=0XFFFF;

但是上百上千个寄存器,怎么计算地址和映射?

寄存器地址计算

  1. 总线基地址/外设基地址,BUS_BASE_ADDR.
  2. 外设基于总线基地址的偏移量 PERIPH_OFFSET.
  3. 寄存器相对于外设地址的偏移量 REG_OFFSET,即上图中每个寄存器的偏移量(0C)。

三者求和计算总线基地址。

总线基地址:APB1 0X4000_0000,APB2 0X4001_0000,AHB 0X4001_8000.

image-20230413212938834

image-20230413212950580

在存储器映像图里可以看到:

image-20230413213233899

比如 GPIOA,外设基地址 0X4001_0000,偏移量 0X800. = 0X4001_0800.

其中的一个寄存器 GPIOA CRH 基于 GPIOA 外设基地址的偏移地址 0X04. = 0X4001_0804.

批量定义寄存器用结构体会很方便。

image-20230414003813622

左边,我们定义了一个7*4的连续空间,因为结构体也是连续存储。

然后通过右边的方式定义了开头指针,则从上到下地址逐渐变大存储。

image-20230414004250651 详细内容可以看 stm32f103xe.h 文件中。

image-20230414004919334

可见前几行的内容对应 block0 block1.

image-20230414005711476

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

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

相关文章

6、索引的数据结构

3.3 常见的索引概念 索引按照物理实现方式&#xff0c;索引可以分为 2 种&#xff1a;聚簇和非聚簇索引 1、聚簇索引 5、索引的代价 空间上的代价 每建立一个索引都要为它建立一棵B树&#xff0c;每一棵B树的每一个节点都是一个数据页&#xff0c;一个页默认会占用 16KB 的存…

jsp827+java心理测评管理系统dzkfB4程序j2EE+mysql

现代社会的大学生是21世纪的主人&#xff0c;他们不仅需要具有为社会做贡献的真才实学&#xff0c;更需要健康的心理。大学生的身心健康&#xff0c;人格健全和谐发展是他们学习的需要&#xff0c;是社会对未来参与者素质的要求。 1&#xff0e;系统登录&#xff1a;系统登录是…

thinkphp:插入数据到数组

一、插入数据到数组首位&#xff08;array_unshift&#xff09;&#xff0c;这里全用空值进行插入 $array [a,b,c]; //在首位加入一个空值 array_unshift($array ,); //将数组输出 print_r($array); 输出结果&#xff1a; 二、插入数据到数组末尾&#xff08;array_push&…

docker安装kafka,并集成springboot进行测试

大家好&#xff0c;今天我们开始学习kafka中间件&#xff0c;今天我们改变一下策略&#xff0c;不刷视频学习&#xff0c;改为实践学习&#xff0c;在网上找一些案例功能去做&#xff0c;来达到学习实践的目的。 首先&#xff0c;是安装相关组件。 1. docker安装安装 1.1 yu…

深度学习中的各种不变性

不变性 平移不变性&#xff08;Translation Invariance&#xff09;旋转不变性&#xff08;Ratation Invariance&#xff09;尺度不变性&#xff08;Size Invariance&#xff09;光照不变性&#xff08;Illumination Invariance&#xff09;仿射不变性&#xff08;Affine Invar…

PS学习记录-图像【像素】与【分辨率】的说明

我们经常能在图片的属性中看到 1920像素x1080像素 &#xff08;老司机在视频文件中也经常看到~&#xff09; 这就是我们常说的图片分辨率&#xff0c;以下是我学习整理的关于像素、分辨率的资料。 注意&#xff1a; 图像分辨率是针对【位图】的&#xff0c;图片分辨率决定了…

记录-JS简单实现购物车图片局部放大预览效果

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 一、实现效果 二、代码实现 代码不多&#xff0c;先看一下 HTML 里面结构很简单&#xff0c;初始化 MagnifyingGlass 对象来关联一个 IMG 标签来实现放大。 <!DOCTYPE html> <html> <h…

做一个网站需要多少个技术人员?

作为互联网从业者&#xff0c;这么多年来经常会碰到一个灵魂拷问&#xff0c;那就是“为什么一个网站需要那么多技术人员&#xff1f;”&#xff0c;尤其是提问者如果再追问一下“听说几个相关专业的学生一个课程的作业就是开发一个网站或者app&#xff0c;那为什么现在主流的网…

C++ | 认识标准库string和vector

本文概要 本篇文章主要介绍C的标准库类型string和vector&#xff0c;文中描述和代码示例很详细&#xff0c;看完即可掌握&#xff0c;感兴趣的小伙伴快来一起学习吧。 &#x1f31f;&#x1f31f;&#x1f31f;个人简介 &#x1f31f;&#x1f31f;&#x1f31f; ☀️大家好&a…

stable diffusion安装从0到1总结:包括遇到的坑和步骤

注&#xff1a;最低电脑配置&#xff1a;8G Vram16G RAM30G磁盘空间以上&#xff0c;20系列显卡及以上&#xff0c;windows>linux>macos。 文件可以不放在系统盘。举个例子&#xff1a;安装在D盘&#xff0c;在D盘创建一个StableDiffusion文件夹。下载下面文件: 1.下载…

为什么实现 API 最佳实践需要重新考虑安全性

随着应用程序编程接口 (API) 的使用与日俱增&#xff0c;实现和维护有效安全性的挑战从未像现在这样大。 由于缺乏管理 API 的单一标准&#xff0c;这意味着团队不能仅依靠工具来解决安全问题&#xff0c;因此这一挑战变得更加严峻。没有任何一种产品可以解决 API 环境的每种…

pg编码相关问题梳理

Lightdb/PG 编码相关问题梳理 之前在通过SQL文件导入数据时&#xff0c;报&#xff1a;ERROR: invalid byte sequence for encoding "EUC_CN"错误。然后就梳理了一下编码相关问题&#xff0c;这边记录一下。涉及到如下两种类型的报错&#xff1a; ERROR: invalid b…

电脑如何还原系统?这样做可以快速解决!

案例&#xff1a;我的电脑系统出问题了&#xff0c;怎么还原&#xff1f; 【我的电脑用了好几年了&#xff0c;最近它的系统出现了一些问题&#xff0c;我想还原电脑系统。有没有知道电脑系统如何还原&#xff1f;蹲一个简单的解决方法&#xff01;】 随着电脑使用时间的增加…

面试华为,花了2个月才上岸,真的难呀····

花2个月时间面试一家公司&#xff0c;你们觉得值吗&#xff1f; 背景介绍 美本计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比…

Linux中的git命令行

Linux中的git命令行 目录 Linux中的git命令行引入1、Linux下的git工具起源2、gitee的使用.gitignore.git 3、git三板斧3.1 git add3.2 git commit3.3 git push 4、git操作4.1 查看提交日志4.2 查看状态4.3 远端同步4.4 删除文件4.5 修改文件名 引入 当多个开发者同时参与同一个…

(一)Jhipster的基本介绍及入门安装

目录 1、为什么要使用 Jhipster &#xff1f; 2、安装配置 3、安装Jhipster 4、基本使用 5、介绍一下JDL Studio 6、启动 Jhipster 搭建项目 1、为什么要使用 Jhipster &#xff1f; JHipster是一个开发平台&#xff0c;可以快速生成、开发和部署现代Web应用程序和微服务…

分享几个自动化测试的练手项目

学习自动化测试最难的是没有合适的项目练习。 测试本身既要讲究科学&#xff0c;又有艺术成分&#xff0c;单单学几个 api 的调用很难应付工作中具体的问题。 你得知道什么场景下需要添加显性等待&#xff0c;什么时候元素定位需要写得更加优雅&#xff0c;为什么需要断言这个…

CANoe使用记录(四):CANoe Graphics图形窗口

目录 1、概述 2、Graphics图形窗口 2.1、打开测量窗口&#xff08;回放Log&#xff09; 2.2、输出Log 2.3、添加解析DBC文件 2.4、窗口排列 2.5、添加Graphics窗口 2.6、 信号栏选择 2.7、添加信号 2.8、波形样式 2.9、单Y轴测量尺 2.10、多Y轴测量尺 2.11、数据隐…

10行Python代码,助你整理杂乱无章的文件

朋友们好&#xff0c;今天是周五&#xff0c;又到了快放假的时间&#xff0c;激不激动&#xff1f;高不高兴&#xff1f;但是我还是要继续分享 Python 小工具给大家&#xff0c;嘻嘻~~ 今天的小程序&#xff0c;可以一键完成文件整理&#xff0c;一起来看看吧&#xff01; 按…

API 接口主流协议有哪些? 如何创建不同协议?

API 接口协议繁多&#xff0c;不同的协议有着不同的使用场景。70% 互联网应用开发者日常仅会接触到最通用的 HTTP 协议&#xff0c;相信大家希望了解更多其他协议的信息。我们今天会给大家介绍各种 API 接口主流协议和他们之间的关系。 1、API 接口主流协议有哪些? 接口协议分…