| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> stm32基础知识1-参考野火、正点原子 -> 正文阅读 |
|
[嵌入式]stm32基础知识1-参考野火、正点原子 |
目录 1.2在小容量、中容量和 大容量产品中,主系统由以下部分构成: 2.5利用MDK固件库组织代码--跑马灯实验为例--GPIO初始化 1、stm芯片架构:1.1ARM内核:Cortex-M3内核1.2在小容量、中容量和 大容量产品中,主系统由以下部分构成:● 四个驱动单元:─ Cortex?-M3内核DCode总线(D-bus),和系统总线(S-bus) ICode 总线:该总线将 M3 内核指令总线和闪存指令接口相连,指令的预取在该总线上面完成。 DCode总线: ?D 表示 Data,即数据,那说明这条总线是用来取数的。我们在写程序的时候,数据有 常量和变量两种,常量就是固定不变的,用 C 语言中的 const 关键字修饰,是放到内部的 FLASH 当中的,变量是可变的,不管是全局变量还是局部变量都放在内部的 SRAM。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突,在取数的时候需要经过一个总线矩阵来 仲裁,决定哪个总线在取数。 系统总线:主要是访问外设的寄存器,我们通常说的寄存器编程,即读写寄存器都是通过这根系统 总线来完成的。 ─ 通用DMA1和通用DMA2 DMA 总线也主要是用来传输数据,这个数据可以是在某个外设的数据寄存器,可以在 SRAM, 可以在内部的 FLASH。因为数据可以被 Dcode 总线和 DMA 总线访问,所以为了避免访问冲突, 在取数的时候需要经过一个总线矩阵来仲裁,决定哪个总线在取数。 ● 四个被动单元─ 内部SRAM:即通常说的 RAM,程序的变量、堆栈等的开销都是基于内部的 SRAM。内核通过 DCode 总线来访问它。 ─ 内部闪存存储器:即FLASH,编写好的程序放在这里。内核通过ICode总线来取里面的指令。 ─ FSMC:英文全称是 Flexible static memory controller,叫灵活的静态的存储器控制器,是 STM32F10xx 中一个很有特色的外设,通过 FSMC,我们可以扩展内存,如外部的 SRAM,NAND-FLASH 和 NORFLASH。但有一点我们要注意的是,FSMC 只能扩展静态的内存,即名称里面的 S:static,不能是动态的内存,比如 SDRAM 就不能扩展。 ─ AHB到APB的桥(AHB2APBx):从 AHB 总线延伸出来的两条 APB2 和 APB1 总线,上面挂载着 STM32 各种各样的特色外设。我 们经常说的 GPIO、串口、I2C、SPI 这些外设就挂载在这两条总线上,这个是我们学习 STM32 的 重点,就是要学会编程这些外设去驱动外部的各种设备。它连接所有的APB设备 25/754 这些都是通过一个多级的AHB总线构架相互连接的,如下图图1所示: 2、外设地址与外设存储器2.1外设基地址片上外设区分为三条总线,根据外设速度的不同,不同总线挂载着不同的外设,APB1 挂载低速外设,APB2 和 AHB 挂载高速外设。相应总线的最低地址我们称为该总线的基地址,总线基地址也是挂载在该总线上的首个外设的地址。其中 APB1 总线的地址最低,片上外设从这里开始, 也叫外设基地址。 总线上挂载着各种外设,这些外设也有自己的地址范围,特定外设的首个地址称为“XX 外设基地址”,也叫 XX 外设的边界地址。以 GPIO 这个外设来讲解外设的基地址,GPIO 属于高速的外设,挂载到 APB2 总线 上,具体见表格外设 GPIO 基地址 。 2.2外设寄存器GPIO简介:在 XX 外设的地址范围内,分布着的就是该外设的寄存器。以 GPIO 外设为例,GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,基本功能是控制引脚输出高电平或者低电平。最简单的应用就是把 GPIO 的引脚连接到 LED 灯的阴极,LED 灯的阳极接电源,然后通 过 STM32 控制该引脚的电平,从而实现控制 LED 灯的亮灭。----跑马灯实验 GPIO 有很多个寄存器,每一个都有特定的功能。每个寄存器为 32bit,占四个字节,在该外设的 基地址上按照顺序排列,寄存器的位置都以相对该外设基地址的偏移地址来描述。 2.3C语言封装寄存器引入 C 语言中的结构体语法对寄存器进行封装:
更进一步,直接使用宏定义好 GPIO_TypeDef 类型的指针,而且指针指向各个 GPIO 端口的首地址,使用时我们直接用该宏访问寄存器即可。
其封装固件库已完成。 2.4 从代码角度解释寄存器地址:GPIOA 的 7 个寄存器都是 32 位的,所以每个寄存器占有 4 个地址,一共占用 28 个地址,地址偏移范围为(000h~01Bh)。这个地址偏移是相对 GPIOA 的基地址而言的。 又因为 GPIO 都是挂载在 APB2 总线 之上,所以GPIOA 的基地址是由 APB2 总线的基地+GPIOA 在 APB2 总线上的偏移地址。 打开 stm32f10x.h 定位到 GPIO_TypeDef 定义处:
定位到: #define GPIOA? ? ? ((GPIO_TypeDef *) GPIOA_BASE) GPIOA 是将 GPIOA_BASE 强制转换为 GPIO_TypeDef 指针,GPIOA 指向地址 GPIOA_BASE,GPIOA_BASE 存放的数据类型为 GPIO_TypeDef。 双击“GPIOA_BASE”选中之后右键选中“Go to definition of ”,查看 GPIOA_BASE 的宏定义: #define GPIOA_BASE (APB2PERIPH_BASE + 0x0800) 依次类推,可以找到最顶层: #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define PERIPH_BASE ((uint32_t)0x40000000) 算出 GPIOA 的基地址位:GPIOA_BASE= 0x40000000+0x10000+0x0800=0x40010800 GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相对 GPIOA 基地址的偏移值,故寄存器地址: GPIOA->BRR=0x40010800+0x14 把 GPIO_TypeDef 的定义中的成员变量的顺序和 GPIOx 寄存器地址映像对比可以发现,他们的顺序是一致的,如果不一致,就会导致地址混乱了。 这就是为什么固件库里面: GPIOA->BRR=value;就是设置地址为 0x40010800 +0x014(BRR 偏移量)=0x40010814 的寄存器 BRR 的值了。 2.5利用MDK固件库组织代码--跑马灯实验为例--GPIO初始化在头文件 stm32f10x_gpio.h 头文件中,定义 GPIO 初始化函数为:
双击 GPIO_InitTypeDef 后右键选择“Go to definition…”,定位到 stm32f10x_gpio.h 中 GPIO_InitTypeDef 的定义处:
这个结构体有 3 个成员变量,包含了初始化 GPIO 所需要的信息--引脚号、工作模式、输出速率,我们首先要定义一个结构体变量,根据需要配置 GPIO 的模式, 对这个结构体的各个成员进行赋值,然后把这个变量作为“GPIO 初始化函数”的输入参数,该函数能根据这个变量值中的内容去配置寄存器,从而实现 GPIO 的初始化。下面我们定义:
找到stm32f10x_gpio.c 文件中的 GPIO_Init 函数体:
assert_param 函数式对入口参数的有效性进行判断,我们可以从这个函数入手, 确定我们的入口参数的范围。双击 “IS_GPIO_ALL_PERIPH”右键点击“go to defition of…” 定位到了下面的定义:
GPIOx 的取值规定只允许是 GPIOA~GPIOG。 同样的办法,我们双击“IS_GPIO_MODE” 右键点击“go to defition of…”,定位到下面的定义:
GPIO_InitStruct->GPIO_Mode
成员的取值范围只能是上面定义的
8
种。这
8
中模式是通过
一个枚举类型组织在一起的。
同样的方法可以找出
GPIO_Speed
的参数限制:
同样的方法我们双击“
IS_GPIO_PIN
” 右键点击“
go to defition of…
”
,
定位到下面的定义:
GPIO_Pin
成员变量的取值范围为
0x0000
到
0xffff,MDK 会将这些数字的意思通过宏定义定义出来,这样可读性大大增强。我们可以看到在 IS_GPIO_PIN(PIN)宏定义的上面还有数行宏定义:
于是我们可以组织起来下面的代码:
初始化多个
IO
口的方式可以是如下:
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 9:53:48- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |