目录
目录
2、对实物STM32进行连接电路(利用了PB9、PC15、PA4这三个GPIO口):
1.问题的提出
1、了解STM32最小系统核心板(STM32F103C8T6,国际上又统称 STM32 Blue Bill开发板)的电路原理图,用Proteus 设计一个STM32最小系统板+LED流水灯实验原理图,仿真运行。
2、以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只_(或更多)红绿蓝LED 搭建电路,使用GPIOA、GPIOB、GPIOC这3个端口控制LED灯,轮流闪烁,间隔时长1秒。
1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数;
2)用C语言寄存器方式编程实现,代码须有详细注解。
3)STM32最小系统核心板子出厂时已经焊接好了1个led灯(标注了PC13处),一般可通过此灯的点亮让编程者验证自己烧录的代码是否正常运行了。请查阅最小版电路原理图和相关资料,将这个灯也用在流水灯中,重编新程序。
2、STM32F103系列芯片的地址映射和寄存器映射原理
寄存器的作用
寄存器是计算机内部用来存储数据的一种高速缓存。它们通常被设计成非常快速,因为它们直接嵌入到CPU中,不需要经过长时间的读写操作来访问它们。寄存器在CPU内部扮演着重要的角色,因为它们存储着经常使用的数据,例如计算过程中需要进行的临时存储、整数和浮点数的数据、基地址、指针等等。寄存器的作用主要有以下几个:
1. 存储计算过程中需要频繁访问的数据,提高计算速度。
2. 作为参数传递给函数,使函数调用更加高效。
3. 存储程序计数器的值,以便于程序跳转到指定的地址。
4. 存储程序状态的标志位,例如是否发生了溢出、是否进行了位移操作等等。
5. 存储CPU控制单元的指令,以便于CPU执行指令。
总的来说,寄存器在计算机系统中扮演着至关重要的角色,它们直接影响到计算机的运行速度和效率。
存储器映射
存储器映射(Memory Mapping)是一种让应用程序能够直接访问硬件设备或文件的技术。它将硬件设备或文件映射到应用程序的内存空间中,使得应用程序可以像访问内存一样访问这些设备或文件,从而提高了访问的效率和速度。
在存储器映射中,应用程序通过对内存地址的读写,实际上是在读写映射到的硬件设备或文件,而无需进行复杂的输入输出操作。这种技术在操作系统中得到了广泛应用,尤其是在驱动程序中,可以大大提高驱动程序的性能和效率。
存储器映射可以分为两种类型:文件映射和设备映射。文件映射将磁盘文件映射到内存中,应用程序可以直接读写内存中的数据,从而实现对文件的访问和操作。设备映射则将硬件设备映射到内存中,应用程序可以直接访问设备的寄存器和内存,从而实现对硬件设备的控制和操作。
寄存器映射
寄存器映射是将计算机内部设备或组件的寄存器按照一定规则映射到计算机内存地址空间的过程。这样,当CPU需要访问设备或组件的寄存器时,可以通过访问对应内存地址来实现。寄存器映射通常由操作系统或驱动程序来实现,它们会根据设备或组件的特性和硬件架构,将寄存器映射到合适的内存地址上。这样,程序就可以使用内存读写命令来访问寄存器,实现与设备或组件的通信。而寄存器映射的具体实现方式因不同的操作系统和硬件而异。
3、GPIO端口的初始化设置
GPIO 是通用输入输出端口的简称,简单来说就是 STM32 可控制的引脚,STM32 芯片的 GPIO 引脚与外部设备连接起来,从而实现与外部通讯、控制以及数据采集的功能。STM32 芯片的 GPIO 被分成很多组,每组有 16 个引脚,如型号为 STM32F103VET6 型号芯片有 GPIOA、GPIOB、GPIOC至 GPIOE共 5组 GPIO,芯片一共 100个引脚,其中 GPIO就占了一大部分,所有的 GPIO 引脚都有基本的输入输出功能。
GPIO初始化步骤
第一步:使能GPIOx口的时钟
第二步:指明GPIOx口的哪一位,这一位的速度大小以及模式。
第三步:调用GPIOx口初始化函数,进行初始化。
第四步:调用GPIO-SetBits函数,进行相应为的置位。
点亮LED灯,实现流水灯效果需要用到GPIO端口。为了点亮LED灯,进行以下三个步骤:
1.打开GPIO口的时钟
2.初始化GPIO口(选择推挽输出)
3.设置低电平
1.打开GPIO口的时钟
根据操作手册
2、初始化GPIO口:
GPIO口有八种模式:
- 输入浮空
- 输入上拉
- 输入下拉
- 模拟输入
- 开漏输出
- 推挽式输出
- 推挽式复用功能
- 开漏复用功能
本次实验使用推挽输出:
端口1-7为低,端口8-15为高。每个引脚由四个位控制。
以GPIOB
和0号引脚(B0)为例,将其设置为推挽输出
,并设置最大速度为10MHz
,则将控制B0
的四个位设置为0001
:
#define GPIOA_CRL (*(unsigned int *)0x40010800)
// 最后四位变为0001
GPIOA_CRL |= (1<<0); // 最后一位变1
GPIOA_CRL &= ~(0xE<<0); // 倒数2、3、4位变0
对于GPIOB的B9、GPIOC的C15、GPIOA的A4,设置如下:
#define GPIOB_CRH (*(unsigned int *)0x40010C04)
#define GPIOC_CRH (*(unsigned int *)0x40011004)
#define GPIOA_CRL (*(unsigned int *)0x40010800)
GPIOB_CRH&= 0xffffff0f;
GPIOB_CRH|=0x00000020;
GPIOC_CRH &= 0x0fffffff;
GPIOC_CRH|=0x30000000;
GPIOA_CRL &= 0xfff0ffff;
GPIOA_CRL|=0x00010000;
3、设置高电平:
输出高电平则为1,低电平则为0
以GPIOB和0号引脚(B0)为例,将其设置为低电平:
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
GPIOB_ODR &= ~(1<<0); // 最后一位变0
对于GPIOB的B9、GPIOC的C15、GPIOA的A4,设置如下:
#define GPIOB_ODR (*(unsigned int *)0x40010C0C)
#define GPIOC_ODR (*(unsigned int *)0x4001100C)
#define GPIOA_ODR (*(unsigned int *)0x4001080C)
GPIOB_ODR &= ~(1<<9);
GPIOC_ODR &= ~(1<<15);
GPIOA_ODR &= ~(1<<4);
STM32的建立:
1.STM32(keil)项目创建,执行和烧录:
参考我之前这篇
基于Proteus,keil的实验1_the_Mercury的博客-CSDN博客
4、对实物STM32进行连接电路(利用了PB9、PC15、PA4这三个GPIO口):
(1)总电路:
红——B9
绿——C15
黄——A4
(2)代码
实物如下:
5.总结
在这上次的基础上增加新的功能对于stm32的理解加深了,对于文档的阅读能力也在提升。