实验任务:
学习和理解STM32F103系列芯片的地址映射和寄存器映射原理;了解GPIO端口的初始化设置三步骤(时钟配置、输入输出模式设置、最大速率设置)
实验过程:
一、STM32F103系列芯片的地址映射和寄存器映射原理
1.寄存器
寄存器是中央处理器内的组成部分。 寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。
简单来说,寄存器就是存放东西的一个空间器物。寄存器可能存放的是指令、数据或地址。
按照功能的不同,可将寄存器分为基本寄存器和移位寄存器两大类。基本寄存器只能并行送入数据,也只能并行输出。移位寄存器中的数据可以在移位脉冲作用下依次逐位右移或左移,数据既可以并行输入、并行输出,也可以串行输入、串行输出,还可以并行输入、串行输出,或串行输入、并行输出,十分灵活,用途也很广。
存放数据的寄存器是最好理解的,如果你需要读取一个数据,直接到这个寄存器所在的地方来问问他,数据是多少就行了。问寄存器这个动作,叫做访问寄存器。不同的数据会存放在不同的寄存器,例如引脚PA2与PB8的高低电平数据(1或0)肯定放在不同的寄存器里,那么怎么区分不同的寄存器呢?通过地址,不同的寄存器有不同的地址,就像老张行李寄存处在101号店铺,老王行李寄存处在258号店铺。
指令、地址寄存器与数据寄存器类似,里边存放的都是0和1,毕竟单片机也只认识机器码,机器码都是0或1,只是特别的规定下,数据寄存器里面存放的0和1表示数据,指令寄存器里存放的表示指令。
二、GPIO端口的初始化
1.GPIO简介
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。
既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。
实例:
- 单个GPIO端口
-
GPIO_InitTypeDef GPIO_InitStructure; 第一步:使能GPIOA的时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 第二步:设置GPIOA参数:输出OR输入,工作模式,端口翻转速率 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8; //设定要操作的管脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz 第三步:调用GPIOA口初始化函数,进行初始化。 GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA 第四步:调用GPIO-SetBits函数,进行相应为的置位。 GPIO_SetBits(GPIOA,GPIO_Pin_0); //输出高
- 多个GPIO端口
-
GPIO_InitTypeDef GPIO_InitStructure; 第一步:使能GPIOA,GPIOE的时钟: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE); 第二步:设置GPIOA,GPIOE参数:输出OR输入,工作模式,端口翻转速率 第三步:调用GPIOA口初始化函数,进行初始化。 第四步:调用GPIO-SetBits函数,进行相应为的置位。 把第二、三、四步合并分别设置GPIOA和GPIOE 先设置GPIOA GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 第四个口,PA4 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz GPIO_Init(GPIOA,&GPIO-InitST); //根据设定参数初始化GPIOA GPIO_SetBits(GPIOA,GPIO_Pin_4); //输出高 再设置GPIOE GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; // 第三个口,PE3 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置为推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // IO口速度为50MHz GPIO_Init(GPIOE,&GPIO-InitST); //根据设定参数初始化GPIOE GPIO_SetBits(GPIOE,GPIO_Pin_3); //输出高