嵌入式课程 之 GPIO的配置与FLASH编程

版权归如下公司,禁止非授权转载:

  • 北京西普阳光教育科技股份有限公司(https://www.simpleware.com.cn)
  • 维周机器人科技有限公司(http://www.vejoe.com)


【实验目的】

1、通过练习初步掌握STM32基本IO口的使用,迈向STM32的第一步。
2、通过对GPIO端口配置和对FLASH的读写编程,设计程序按要求点亮小灯,初步了解和熟悉GPIO端口的配置方法以及FLASH的写入和读取。

【实验原理】

一、GPIO简介

STM32的IO口可以由软件通过编程配置成8种模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽输出、推挽式复用功能和开漏复用功能。每个IO口可以自由编程,单IO口寄存器必须要按32位字被访问。STM32的每个IO端口都有7个寄存器来控制,如表1所示。
在这里插入图片描述
表1 GPIO相关寄存器

在STM32芯片上,I/O引脚可以被软件编程设置成各种不同的功能,如输入或输出,所以被称为GPIO(General-purposeI/O)。而GPIO引脚又被分为GPIOA、GPIOB…GPIOG不同的组,每组端口分为0~15,共16个不同的引脚,对于不同型号的芯片,端口的组和引脚的数量不同,具体请参考相应芯片型号datasheet。

二、STM32时钟系统

从时钟频率来说,分为高速时钟和低速时钟,高速时钟是提供给芯片主体的主时钟,而低速时钟只是提供给芯片中的RTC(实时时钟)及独立看门狗使用。

从芯片角度来说,时钟源分为内部时钟与外部时钟源,内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号。

我们实验中调用了RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState),其中RCC_APB2Periph用于指示要配置的时钟,在应用时可以使用“|”或操作同时配置几个外设的时钟;NewState用于设置状态,可输入“Disable”关闭或者“Enable”使能时钟。

三、STM32的内部FLASH读写

在STM32芯片内部有一个FLASH存储器,它主要用于存储代码,我们在电脑上编写好程序后,使用下载器把编译后的代码文件烧录到该内部FLASH中,由于FLASH存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部FLASH中加载代码并运行。

我们实验中实现对FLASH的读写是通过调用库函数:
STMFLASH_Write(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)
其中WriteAddr为起始地址(此地址必须为2的倍数),pBuffer为数据指针,NumToWrite和NumToRead为半字数(就是要写入或读取16位数据的个数)。

四、硬件连接和GPIO相关库函数介绍

控制LED灯,通过控制I/O引脚电平的高低来实现。通过图1,LED的硬件连接图可知当I/O引脚为高电平时,LED点亮,为低电平是,LED熄灭。

在这里插入图片描述
图1 LED硬件连接示意图

对应GPIO_InitTypeDef类型的结构体配置说明如下,其中GPIO 输入/输出模式配置如表2所示,GPIO的输出速率配置如表示所示。
typedef struct
{
u16 GPIO_Pin; //指定将要配置的GPIO引脚序号
GPIOSpeed_TypeDef GPIO_Speed; //指定GPIO引脚可以输出的最高频率
GPIOMode_TypeDef GPIO_Mode; //指定GPIO引脚配置的工作状态
}GPIO_InitTypeDef;
在这里插入图片描述
表2 GPIO 输入/输出模式配置
在这里插入图片描述
表3 GPIO 输出速率配置

对结构体中的各个成员进行赋值,然后把这个变量作为“GPIO初始化函数”GPIO_Init的输入参数,该函数能根据这个变量值中的内容去配置寄存器,从而实现GPIO的初始化。对初始化结构体赋值后,把它输入到GPIO初始化函数GPIO_Init,由它来实现寄存器配置,完成GPIO引脚初始化。
库函数GPIO_Init根据GPIO_InitStruct中指定的参数初始化外设GPIOx寄存器,调用形式为:
GPIO_Init(GPIO_TypeDef* GPIOx,GPIO_InitTypeDef* GPIO_InitStruct)
其中GPIOx为GPIO_TypeDef类型的指针,指向GPIO端口的地址;GPIO_InitStruct为GPIO_TypeDef结构体指针,指向初始化变量。
我们实验中选择的GPIOC的1~3引脚连接到电路上的3个LED小灯。控制引脚的电平变化时,直接使用GPIO_SetBits、GPIO_ResetBits函数控制引脚的输出,就可以控制小灯的亮灭。
库函数GPIO_SetBits/GPIO_RessetBits的主要功能为置/复位指定的数据端口位,其调用形式为:
GPIO_SetBits(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
GPIO_ResetBits(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
其中GPIOx为GPIO_TypeDef类型的指针,指向

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放羊郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值