MCU点灯实验小结

cnblogs 2024-06-28 08:15:00 阅读 57

设备采用芯片:STM32F407ZET6

4个LED灯,网络标号分别为LED0 ,LED1,FSMC D10,FSMC D11。对应的引脚号分别为PF9,PF10,PE12,PE13。

GPIO外设基本概念

General-Purpose Input Output,通用型输入输出的,也简称I/O口,有时也简写为IO口。用于电信号的传递,以实现与外部器件的通信、控制外部器件或者采集外部器件数据的功能。(在本次所用芯片中,共有114个GPIO引脚。)

对于MCU设备和传感器之间,一般采用TTL电平信号,即传输的电平信号>2.4V就表示高电平,<0.4V就表示低电平。(另外还有RS232RS485标准)

一般IO口的命名是由P(Pin)开头,分为很多组(端口),以字母AH来命名,每个组(端口)有16个引脚,引脚的编号为015,所以如端口A引脚范围: PA0 ~ PA15 端口B引脚范围:PB0~PB15。

第一步 . 查找相应部分的原理图

第二步 .分析原理图

如上图所示,该处发光二极管为单向导电性,输出电平信号0才能使电路走通。如果输出电平信号1,则二极管两端电压平衡,无法形成电流。

发光二极管需要单独深入学习。

第三步 . 程序设计

1. 亮灯代码实例部分展示:

//1.定义变量

GPIO_InitTypeDef GPIO_InitStructureF;//F端口

GPIO_InitTypeDef GPIO_InitStructureE;//E端口

int main()//中文注释

{

//2.时钟控制

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);

//3.设置结构体变量 F端口

GPIO_InitStructureF.GPIO_Pin = GPIO_Pin_9| GPIO_Pin_10;

GPIO_InitStructureF.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructureF.GPIO_OType = GPIO_OType_PP;//推挽模式PP(都可以输出),开漏输出OD(只能输出低电平)

GPIO_InitStructureF.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructureF.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOF, &GPIO_InitStructureF);

//3.设置结构体变量 E端口

GPIO_InitStructureE.GPIO_Pin = GPIO_Pin_13| GPIO_Pin_14;

GPIO_InitStructureE.GPIO_Mode = GPIO_Mode_OUT;

GPIO_InitStructureE.GPIO_OType = GPIO_OType_PP;

GPIO_InitStructureE.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_InitStructureE.GPIO_PuPd = GPIO_PuPd_NOPULL;

GPIO_Init(GPIOE, &GPIO_InitStructureE);

while (1)

{

//亮灯

GPIOF->BSRRL =GPIO_Pin_9 | GPIO_Pin_10| GPIO_Pin_13| GPIO_Pin_14;

GPIOE->BSRRL = GPIO_Pin_13| GPIO_Pin_14;

return 0;

}

2. 代码拆分:

定义外设的结构体变量

GPIO外设结构体原型及代表含义如下:

typedef struct

{

uint32_t GPIO_Pin;

//指定要配置的GPIO引脚。此参数可以是以下参数之一,设置与引脚号对应的编号

/*

#define GPIO_Pin_0 ((uint16_t)0x0001)

#define GPIO_Pin_1 ((uint16_t)0x0002)

...

#define GPIO_Pin_15 ((uint16_t)0x8000)

#define GPIO_Pin_All ((uint16_t)0xFFFF)

...

*/

GPIOMode_TypeDef GPIO_Mode;

// 指定选定引脚的操作模式,设置为以下参数之一

/*

GPIO_Mode_IN = 0x00, //输入模式,用得较多

GPIO_Mode_OUT = 0x01, //输出模式,用的最多

GPIO_Mode_AF = 0x02, //复用模式,偶尔用

GPIO_Mode_AN = 0x03 //模拟模式

*/

GPIOSpeed_TypeDef GPIO_Speed;

// 指定选定引脚的速度,设置为以下参数之一,输出速度指的是引脚电平的翻转速度,如果选择高速,则会增加功耗和噪声。

/*

GPIO_Low_Speed = 0x00, //2MHz

GPIO_Medium_Speed = 0x01, //25MHz

GPIO_Fast_Speed = 0x02, //50MHz

GPIO_High_Speed = 0x03 //100MHz

*/

GPIOOType_TypeDef GPIO_OType;

//指定选定引脚的操作输出类型,设置为以下参数之一

/*

GPIO_OType_PP = 0x00, //推挽输出,可以输出高和低电平

GPIO_OType_OD = 0x01 //开漏输出,只能输出低电平,不能输出高电平

*/

GPIOPuPd_TypeDef GPIO_PuPd;

//指定选定接点的操作上拉/下拉,即GPIO引脚的内部电阻,设置为以下参数之一

/*

GPIO_PuPd_NOPULL = 0x00,

GPIO_PuPd_UP = 0x01,//上拉电阻,当外部没有电平输入或输出时,可以给GPIO引脚一个默认的高电平状态

GPIO_PuPd_DOWN = 0x02//下拉电阻,当外部没有电平输入或输出时,可以给GPIO引脚一个默认的低电平状态

*/

}GPIO_InitTypeDef;

时钟控制

打开GPIO的外设时钟

//函数原型

void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState);

//用法示例

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);

​ 因为STM32属于低功耗的MCU,而为了降低功耗,所以STM32的MCU在复位之后默认会关闭绝大多数的外设的时钟,所以用户想要使用MCU内部的某个外设,就必须打开该外设的时钟(clock)。

对GPIO外设的初始化结构体中成员进行赋值

根据GPIO外设结构体原型,对每一个结构体成员进行赋值,解释如下:

GPIO_InitStructureE.GPIO_Pin = GPIO_Pin_13| GPIO_Pin_14;//对13和14引脚进行操作

GPIO_InitStructureE.GPIO_Mode = GPIO_Mode_OUT;//输出模式

GPIO_InitStructureE.GPIO_OType = GPIO_OType_PP;//推挽输出

GPIO_InitStructureE.GPIO_Speed = GPIO_Speed_100MHz;//设置速率,默认选最高

GPIO_InitStructureE.GPIO_PuPd = GPIO_PuPd_NOPULL;

通过init函数对把GPIO结构体中的值写入到GPIO端口寄存器,完成初始化

//函数原型

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);

//用法示例

GPIO_Init(GPIOE, &GPIO_InitStructure);


上一篇: Linux下mysql的彻底卸载

下一篇: 操作系统启动的过程

本文标签

硬件   


声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。