STM32F103寄存器方式点亮LED流水灯
嵌入式系统第六周作业
1、学习和理解STM32F103系列芯片的地址映射和寄存器映射原理;了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)。 2、以 STM32最小系统核心板(STM32F103C8T6)+面板板+3只红绿蓝LED 搭建电路,使用GPIOB、GPIOC、GPIOD这3个端口控制LED灯(最高时钟2Mhz),轮流闪烁,间隔时长1秒。 1)写出程序设计思路,包括GPIOx端口的各寄存器地址和详细参数; 2)分别用汇编语言,C语言编程实现。
目录
一、原理
STM32F103系列芯片的地址映射和寄存器映射原理
STM32寄存器简介
- 什么是寄存器
寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。
按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。 1
- 如何找到某个寄存器的地址
不同的寄存器有不同的地址。- 找到GPIOB的基地址:所有GPIOB相关的寄存器,都住在0x4001 0C00到0x4001 0FFF范围内。
- 找到端口输入寄存器的地址偏移
- 找到知道数据的那个人
地址映射和寄存器映射原理
-
映射:两个非空集合A与B间存在着对应关系f,而且对于A中的每一个元素a,B中总有唯一的一个元素b与它对应,就这种对应为从A到B的映射,记作f:A→B。其中,b称为元素a在映射f下的像 [1] ,记作:b=f(a)。a称为b关于映射f的原像 [1] 。集合A中所有元素的像的集合称为映射f的值域,记作f(A)。2
- 外围设备的内存映射原理是一样的,只不过A集合变成了CPU,B集合变成了外围设备,对应关系就是连接CPU和外设地址引脚的地址总线。
- 存储器本身不具有地址信息,它的地址是由芯片厂商或用户分配,给存储器分配地址的过程就称为存储器映射。
- 内存映射:外设为了加快处理速度都有自己的片内RAM,分出去的地址空间也就与片内RAM物理连接起来,这样CPU就能像访问内存一样去访问外设的片内RAM。
- 在存储器的区域单元中,每一个单元对应不同的功能,控制这些单元时可以驱动外设工作。首先找到每个单元的起始地址,然后通过 C 语言指针的操作方式来访问这些单元,但是每次都通过这种地址的方式来访问,耗费更多时间。所以根据每个单元功能的不同,以功能为名给这个内存单元取一个别名,这个别名就是寄存器,给已经分配好地址的有特定功能的内存单元取别名的过程就叫寄存器映射。
GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)
1.GPIO简介
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。
既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。
- STM32的时钟是什么?
stm32的时钟是由内部或外部振荡器产生的“频率”,而被人们形象的称为“系统时钟”。最大为72MHz换成周期T为:1/72MHz≈13.9ns
- 为什么要用时钟?
使用哪个外设就给哪个外设时钟(频率),不使用的就关掉(不震荡)。此做法大大降低了功耗,续航持久。
2.GPIO模式
- GPIO_Mode_AIN 模拟输入
- GPIO_Mode_IN_FLOATING 浮空输入
- GPIO_Mode_IPD 下拉输入
- GPIO_Mode_IPU 上拉输入
- GPIO_Mode_Out_OD 开漏输出
- GPIO_Mode_Out_PP 推挽输出
- GPIO_Mode_AF_OD 复用开漏输出
- GPIO_Mode_AF_OD 复用开漏输出
3.输出和输入
输出是CPU计算后进行控制,输入是读取后给CPU进行计算。
输出:GPIO的输出与51的 IO口是差不多的概念,都是输出高、低电平来控制外部电路。
处理过程:CPU下达输出高或低电平指令,指令配置“位设置/清除寄存器(GPIOx_BSRR)”(设置就是“1”高电平,清除就是“0”低电平),再由位寄存器配置输出数据寄存器(GPIOx_ODR),经过一个选择器(选择是一般输出还是复用功能输出),然后进行输出控制,然后输出高或低电平到IO口。
输入:进行数据的采集,外部电路通过IO口输入模拟量,然后通过“TTL肖特基触发器”(肖特基触发器是将相对缓慢变化的模拟信号变成矩形信号,便于后面读取),进入输入数据寄存器,最后就能给CPU读取数据。
4.GPIO初始化步骤
- 使能GPIO时钟,RCC_APB2PeriphClockCmd。
- 设置GPIO参数:输出OR输入,工作模式,端口翻转速率;
- 调用初始化函数:GPIO_Init
- 使用GPIO。
二、STM32F103C8T6实现LED灯轮流闪烁
1.连接电路
2.构建项目
1.c语言实现
- 新建项目
New uVision Project,文件名LED:
选择芯片:根据实验要求选择F103c8
添加文件main.c:
将startup_stm32f10x_md.s
粘贴到程序目录下
下载地址野火产品资料下载中心
添加文件
魔棒进行一些设置
首先在main.c中写入空的main函数:
int main(){
}
编译,发现报错,添加SystemInit函数:
void SystemInit(void);
void SystemInit(){
}
加上循环等总代码:
#define GPIOB_BASE 0x40010C00
#define GPIOC_BASE 0x40011000
#define GPIOA_BASE 0x40010800
#define RCC_APB2ENR (*(unsigned int