STM32F4系列单片机GPIO概述和寄存器分析

第2章 STM32-GPIO口

2.1 GPIO口概述

通用输入/输出口

2.1.1 GPIO口作用

GPIO是单片机与外界进行数据交流的窗口。

2.1.2 STM32的GPIO口

在51单片机中,IO口,以数字进行分组(P0~P3),每一组里面又有8个IO口。

在STM32里面,GPIO口,以英文字母进行分组,针对M4系列最多可以分为AI组,而在我们现在使用的stm32f407zgt6这款芯片一共分成AG组。每一组里面有16个IO口(以0~15进行编号),所以我们这款芯片一共有112个GPIO口。

并不是所以的管脚都是GPIO口

每一个GPIO口都是多功能的,在使用之前需要先配置好特定的一个功能,需要用什么功能就要配置成什么功能。

对GPIO的配置就是学习如何使用GPIO口。

对GPIO口操作其实就是操作GPIO对应的寄存器。

寄存器其实就是一段内存空间。芯片内部有很多模块,系统会给每一个模块都分配一段特定的内存空间,这些内存空间的地址其实就是这些模块的寄存器地址。每个寄存器都有自己特定的一些功能,我们往寄存器里面读写的数据也都是有一定意义的,不是随意的。如果我们想要操作一个模块做某些事情,就需要找到这个模块对应有这个功能的寄存器,往这个寄存器里面写入特定的指令数据,系统就会根据你的操作对这个模块进行控制。

img

补充:

变量:声明变量其实就是在内存中申请了一段内存空间,我们可以在这个内存空间进行读写操作。这个内存空间的地址是随机。

寄存器:寄存器其实也是一段内存空间,同样可以往里面进行读写操作,但是寄存器的地址是固定的,是已知的,是芯片厂家出厂时就已经固化了,不可更改的。

img

从上图可以知道GPIO模块寄存器边界地址和所在的总线(AHB1)

img

相邻两组GPIO之间的偏移量是0x0400,换句话说每组GPIO的空间大小为1024字节。

img

总结:

相邻GPIO组之间的偏移量为1K字节,每一组GPIO相邻寄存器之间的偏移量为0x04.

2.1.3 STM32的GPIO口特征

每个通用 I/O 端口包括 4 个 32 位配置寄存器(GPIOx_MODER、 GPIOx_OTYPER、GPIOx_OSPEEDR 和 GPIOx_PUPDR)、 2 个 32 位数据寄存器(GPIOx_IDR 和GPIOx_ODR)、 1 个 32 位置位/复位寄存器 (GPIOx_BSRR)、 1 个 32 位锁定寄存器(GPIOx_LCKR) 和 2 个 32 位复用功能选择寄存器(GPIOx_AFRH 和 GPIOx_AFRL)。

● 受控 I/O 多达 16 个
● 输出状态:推挽或开漏 + 上拉/下拉
● 从输出数据寄存器 (GPIOx_ODR) 或外设(复用功能输出)输出数据
● 可为每个 I/O 选择不同的速度
● 输入状态:浮空、上拉/下拉、模拟
● 将数据输入到输入数据寄存器 (GPIOx_IDR) 或外设(复用功能输入)
● 置位和复位寄存器 (GPIOx_BSRR),对 GPIOx_ODR 具有按位写权限
● 锁定机制 (GPIOx_LCKR),可冻结 I/O 配置
● 模拟功能
● 复用功能输入/输出选择寄存器(一个 I/O 最多可具有 16 个复用功能)
● 快速翻转,每次翻转最快只需要两个时钟周期
● 引脚复用非常灵活,允许将 I/O 引脚用作 GPIO 或多种外设功能中的一种

2.1.4 STM32的GPIO功能

根据数据手册中列出的每个 I/O 端口的特性,可通过软件将通用 I/O (GPIO) 端口的各个端口
位分别配置为多种模式:
● 输入浮空
● 输入上拉
● 输入下拉
● 模拟功能----用在模数转换/数模转换上
● 具有上拉或下拉功能的开漏输出
● 具有上拉或下拉功能的推挽输出
● 具有上拉或下拉功能的复用功能推挽
● 具有上拉或下拉功能的复用功能开漏
每个 I/O 端口位均可自由编程,但 I/O 端口寄存器必须按 32 位字、半字或字节进行访问。
GPIOx_BSRR 寄存器旨在实现对 GPIO ODR 寄存器进行原子读取/修改访问。这样便可确保
在读取和修改访问之间发生中断请求也不会有问题。

2.2 STM32的GPIO口框架(重点)

img

输入电路和输出电路是独立的。

2.2.1 输出配置框架分析

对 I/O 端口进行编程作为输出时:
● 输出缓冲器被打开:
— 开漏模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端
口保持高组态 (Hi-Z)(P-MOS 始终不激活)。
— 推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活
P-MOS。
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态
● 对输出数据寄存器的读访问可获取最后的写入值

img

在配置成输出模式时,输入功能并没有被关闭。

推挽输出:当配置成推挽模式时,P-MOS和N-MOS均可以工作(都被打开)

当要输出高电平‘1’时,P-MOS导通,N-MOS不导通,VDD电源正极(高电平)连接到IO引脚

当要输出低电平‘0’时,P-MOS不导通,N-MOS导通,VSS电源负极(低电平)连接到IO引脚

推挽输出即可以输出高电平也可以输出低电平

开漏输出:当配置成开漏模式时,P-MOS被关闭(高阻态),N-MOS被打开

当要输出高电平‘1’时,P-MOS不导通,N-MOS不导通,不能把高电平从输出驱动器输出出去,IO引脚的电平值取决外界环境。

当要输出低电平‘0’时,P-MOS不导通,N-MOS导通,VSS电源负极(低电平)连接到IO引脚

开漏输出只具有输出低电平的能力,不具有输出高电平的能力。

如果仍然想输出高电平‘1’,那么需要在外部电路中接一个上拉电阻

上拉电阻:电阻的一端接着电源正极,在IO口没有电流流过时,保证电阻另外一端有一个稳定高电平

下拉电阻:电阻的一端接着电源负极(GND),在IO口没有电流流过时,保证电阻另外一端有一个稳定低电平

芯片内部上拉电阻和下拉电阻都是弱上拉和弱下拉,驱动能力比较弱

2.2.2 输入配置框架分析

对 I/O 端口进行编程作为输入时:
● 输出缓冲器被关闭
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻
● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态

img

变换一下如下图:

img

img

这种情况下,配置成输入浮空(不上拉也不下拉)

img

这种情况下可以配置成输入上拉

img

这种情况下可以配置成输入下拉

2.2.3 模拟功能框架分析

对 I/O 端口进行编程作为模拟配置时:
● 输出缓冲器被禁止。
● 施密特触发器输入停用, I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被
强制处理为恒定值 (0)。
● 弱上拉和下拉电阻被关闭。
● 对输入数据寄存器的读访问值为“0”。

img

img

2.2.4 复用功能框架分析

对 I/O 端口进行编程作为复用功能时:
● 可将输出缓冲器配置为开漏或推挽
● 输出缓冲器由来自外设的信号驱动(发送器使能和数据)
● 施密特触发器输入被打开
● 根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻
● 输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
● 对输入数据寄存器的读访问可获取 I/O 状态

img

img

2.3 STM32的GPIO口相关寄存器

img

img

2.3.1 GPIO 端口模式寄存器 (GPIOx_MODER) (x = A…I)

偏移地址: 0x00
复位值:(默认值)
● 0xA800 0000(端口 A)
● 0x0000 0280(端口 B)
● 0x0000 0000(其它端口)

img

位 2y:2y+1 MODERy[1:0]: 端口 x 配置位 (Port x configuration bits) (y = 0…15)
这些位通过软件写入,用于配置 I/O 方向模式。
00:输入(复位状态)
01:通用输出模式
10:复用功能模式
11:模拟模式

2.3.2 GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A…I)

偏移地址: 0x04
复位值: 0x0000 0000

img

位 31:16 保留,必须保持复位值。
位 15:0 OTy[1:0]: 端口 x 配置位 (Port x configuration bits) (y = 0…15)
这些位通过软件写入,用于配置 I/O 端口的输出类型。
0:输出推挽(复位状态)
1:输出开漏

2.3.3 GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A…I/)

偏移地址: 0x08
复位值:
● 0x0000 00C0(端口 B)
● 0x0000 0000(其它端口)

img

位 2y:2y+1 OSPEEDRy[1:0]: 端口 x 配置位 (Port x configuration bits) (y = 0…15)
这些位通过软件写入,用于配置 I/O 输出速度。
00: 2 MHz(低速)
01: 25 MHz(中速)
10: 50 MHz(快速)
11: 30 pF 时为 100 MHz(高速)(15 pF 时为 80 MHz 输出(最大速度))

2.3.4 GPIO 端口上拉/下拉寄存器 (GPIOx_PUPDR) (x = A…I/)

偏移地址: 0x0C
复位值:
● 0x6400 0000(端口 A)
● 0x0000 0100(端口 B)
● 0x0000 0000(其它端口)

img

位 2y:2y+1 PUPDRy[1:0]: 端口 x 配置位 (Port x configuration bits) (y = 0…15)
这些位通过软件写入,用于配置 I/O 上拉或下拉。
00:无上拉或下拉(浮空)
01:上拉
10:下拉
11:保留

2.3.5 GPIO 端口输入数据寄存器 (GPIOx_IDR) (x = A…I)

偏移地址: 0x10
复位值: 0x0000 XXXX(其中 X 表示未定义)

img

位 31:16 保留,必须保持复位值。
位 15:0 IDRy[15:0]: 端口输入数据 (Port input data) (y = 0…15)
这些位为只读形式,只能在字模式下访问。它们包含相应 I/O 端口的输入值。

2.3.6 GPIO 端口输出数据寄存器 (GPIOx_ODR) (x = A…I)

偏移地址: 0x14
复位值: 0x0000 0000

img

位 31:16 保留,必须保持复位值。
位 15:0 ODRy[15:0]: 端口输出数据 (Port output data) (y = 0…15)
这些位可通过软件读取和写入。
注意: 对于原子置位/复位,通过写入 GPIOx_BSRR 寄存器,可分别对 ODR 位进行置位和复
位 (x = A…I/)。

2.4 寄存器访问方法

操作GPIOA_MODE,写入data值

第一种:

*(unsigned int *)0x4002 0000=data;

第二种:

#define GPIOA_MODE *(unsigned int *)0x4002 0000

GPIOA_MODE=data;

第三种:

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)#define GPIOI ((GPIO_TypeDef ) GPIOI_BASE) typedef struct{ __IO uint32_t MODER; /!< GPIO port mode register, Address offset: 0x00 / __IO uint32_t OTYPER; /!< GPIO port output type register, Address offset: 0x04 / __IO uint32_t OSPEEDR; /!< GPIO port output speed register, Address offset: 0x08 / __IO uint32_t PUPDR; /!< GPIO port pull-up/pull-down register, Address offset: 0x0C / __IO uint32_t IDR; /!< GPIO port input data register, Address offset: 0x10 / __IO uint32_t ODR; /!< GPIO port output data register, Address offset: 0x14 / __IO uint16_t BSRRL; /!< GPIO port bit set/reset low register, Address offset: 0x18 / __IO uint16_t BSRRH; /!< GPIO port bit set/reset high register, Address offset: 0x1A / __IO uint32_t LCKR; /!< GPIO port configuration lock register, Address offset: 0x1C / __IO uint32_t AFR[2]; /!< GPIO alternate function registers, Address offset: 0x20-0x24 /} GPIO_TypeDef; 说明:GPIO_TypeDef :结构体 GPIO_TypeDef:结构体指针 #define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800)#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00)#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000)#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400)#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800)#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00)#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000)//---------------------------------------------------------------------------------------#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)//---------------------------------------------------------------------------------------#define PERIPH_BASE ((uint32_t)0x40000000) 分析:#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000) ((PERIPH_BASE + 0x00020000)+0x0000) ((((uint32_t)0x40000000)+ 0x00020000)+0x0000) ((uint32_t)0x40020000) #define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)#define GPIOA ((GPIO_TypeDef *) (uint32_t)0x40020000)GPIOA—结构体常量指针 操作寄存器方法:GPIOA->MODE=data;

2.5 STM32的GPIO口相关实验

2.5.1 通用输出功能实验

通过GPIO口点亮LED灯

LED其实是发光二极管,当给阳极高电平,给阴极低电平,会让二极管正向导通,LED点亮

2.5.1.1 硬件设计

img

img

img

2.5.1.2 软件设计

点亮LED1,把PF6配置成普通功能推挽输出

配置流程:

\1. 配置模式寄存器(把GPIOF的MODER寄存器的第13和12位分配成01)—输出模式

\2. 配置输出类型寄存器(把GPIOF的OTYPER寄存器的第6位分配成0)—输出推挽

\3. 配置输出速度寄存器(把GPIOF的OSPEEDR寄存器的第13和12位分配成00)–低速2Mhz

\4. 配置上/下拉寄存器(把GPIOF的PUPDR寄存器的第13和12位分配成00)–浮空

点亮LED1----往GPIOF的ODR寄存器的第6位写入0

熄灭LED1----往GPIOF的ODR寄存器的第6位写入1

操作寄存器的原则:操作你要操作的相关位,而不能影响到其他位的值。

2 软件设计

点亮LED1,把PF6配置成普通功能推挽输出

配置流程:

\1. 配置模式寄存器(把GPIOF的MODER寄存器的第13和12位分配成01)—输出模式

\2. 配置输出类型寄存器(把GPIOF的OTYPER寄存器的第6位分配成0)—输出推挽

\3. 配置输出速度寄存器(把GPIOF的OSPEEDR寄存器的第13和12位分配成00)–低速2Mhz

\4. 配置上/下拉寄存器(把GPIOF的PUPDR寄存器的第13和12位分配成00)–浮空

点亮LED1----往GPIOF的ODR寄存器的第6位写入0

熄灭LED1----往GPIOF的ODR寄存器的第6位写入1

操作寄存器的原则:操作你要操作的相关位,而不能影响到其他位的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/201072.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nacos和Eureka的区别

目录 配置&#xff1a; 区别&#xff1a; ephemeral设置为true时 ephemeral设置为false时&#xff08;这里我使用的服务是order-service&#xff09; 1. Nacos与eureka的共同点 都支持服务注册和服务拉取 都支持服务提供者心跳方式做健康检测 2. Nacos与Eu…

验证码 | 可视化一键管控各场景下的风险数据

目录 查看今日验证数据 查看未来趋势数据 验证码作为人机交互界面经常出现的关键要素&#xff0c;是身份核验、防范风险、数据反爬的重要组成部分&#xff0c;广泛应用网站、App上&#xff0c;在注册、登录、交易、交互等各类场景中发挥着巨大作用&#xff0c;具有真人识别、身…

新手做抖店,这6点建议一定要收好,能让你不亏钱!

我是电商珠珠 我呢&#xff0c;目前身居郑州。 电商这个行业也做了5年多了&#xff0c;抖店从20年开始做&#xff0c;到现在也已经快3年了。 其实&#xff0c;我做抖店期间呢&#xff0c;踩过很多坑&#xff0c;所以今天就把我所踩过的坑&#xff0c;给做抖店的新手总结了6点…

[oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux

先跑起来 &#x1f94a; Python 什么是 Python&#xff1f; Python [ˈpaɪθɑ:n]是 一门 适合初学者 的编程语言 类库 众多 几行代码 就能 出 很好效果 应用场景丰富 在 各个应用领域 都有 行内人制作的 python 工具类库 非常专业、 好用 特别是 人工智能领域 pytho…

【高性能计算】CUDA,OpenCL,FPGA 加速,MPI

OpenCL OpenCL&#xff08;Open Computing Language&#xff09;是一种跨平台的GPU加速技术&#xff0c;由Khronos Group开发。OpenCL允许开发人员在不同的硬件平台上编写并行计算应用程序。 OpenCL使用C语言的子集来编写应用程序&#xff0c;并提供了一组API&#xff0c;可以…

opencv-图像对比度增强

对比度增强&#xff0c;即将图片的灰度范围拉宽&#xff0c;如图片灰度分布范围在[50,150]之间&#xff0c;将其范围拉升到[0,256]之间。这里介绍下 线性变换&#xff0c;直方图正规化&#xff0c;伽马变换&#xff0c;全局直方图均衡化&#xff0c;限制对比度自适应直方图均衡…

机器学习算法——集成学习

目录 1. Bagging1.1 工作流程1.2 代码实践 2. 随机森林2.1 工作流程2.2 代码实践 3. Adaboost3.1 工作流程3.2 样本权值的更新策略3.3 代码实践 4. Stacking4.1 代码实践 5. Voting5.1 代码实践 6. 集成学习分类 1. Bagging Bagging&#xff08;bootstrap aggregating&#xf…

steam游戏找不到steam_api64.dll,分享三个有效的解决方法

在现代科技发展的时代&#xff0c;游戏已经成为了许多人生活中不可或缺的一部分。而Steam作为全球最大的数字发行平台之一&#xff0c;拥有着庞大的游戏库和活跃的用户群体。然而&#xff0c;在使用Steam时&#xff0c;有些用户可能会遇到Steam_api64.dll丢失的问题&#xff0c…

头插法尾插法建立单链表

头插法建立单链表 #define NULL 0 #include<stdio.h>typedef struct LNode {int data;struct LNode *next; }LNode,*LinkList;//单链表尾插法 LinkList List_TailInsert(LinkList &L){int x;L (LinkList)malloc(sizeof(LNode)); //初始化空表LNode *r L; …

Cascade-MVSNet论文笔记

Cascade-MVSNet论文笔记 摘要1 立体匹配&#xff08;Stereo Matching&#xff09;2 多视图立体视觉&#xff08;Multi-View Stereo&#xff09;3 立体视觉和立体视觉的高分辨率输出4 代价体表达方式&#xff08;Cost volume Formulation&#xff09;4.1 多视图立体视觉的3D代价…

微服务实战系列之Gateway

前言 人类世界自工业革命以来&#xff0c;无论从金融、货币、制度&#xff0c;还是科技、资源、社会各个方面&#xff0c;都发生了翻天覆地的变化。物质极大丰富&#xff0c;从而也推动了科技的极速发展。当计算机问世也仅仅不到80年&#xff0c;而如今我们的生活中处处有它的影…

为了摆脱 Android ,亚马逊开发基于Linux的操作系统

导读亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”&#xff0c;以便在 Fire TV、智能显示器和其他联网设备上取代 Android 系统。 亚马逊一直在开发一种新的操作系统 —— 内部代号为 “Vega”&#xff0c;以便在 Fire TV、智能显示器和其他联网设备上取代 Andr…

K8S精进之路-控制器Deployment-(1)

在K8S中&#xff0c;最小运行单位为POD,它是一个逻辑概念&#xff0c;其实是一组共享了某些资源的容器组。POD是能运行多个容器的&#xff0c;Pod 里的所有容器&#xff0c;共享的是同一个 Network Namespace&#xff0c;并且可以声明共享同一个 Volume。在POD中能够hold住网络…

2023年中国宠物清洁用品分类、市场规模及发展特征分析[图]

宠物清洁用品指专用于清洁宠物毛发、口腔、耳部、脚爪等部位的各类宠物用品&#xff0c;包括宠物香波、滴耳露、修毛刀等。宠物主对宠物清洁用品需求的出现&#xff0c;一定程度上反映出部分宠物主与宠物间的感情逐渐加深&#xff0c;并逐渐达到了较为亲密的程度。随着宠物清洁…

全民阅读营造良好氛围 助力培养孩子阅读习惯

日前,2023年全民终身学习活动周全国总开幕式在重庆举行,自2005年起,终身学习活动周已连续举办了18届,累计带动4亿多群众参与全民终身学习活动周,有效推进全面阅读。 随着全民阅读氛围的持续浓厚,阅读不再是语文学科的专项,不再是学校教育的专属,家庭、社会都在积极参与进来。尤…

2023年11月25日(星期六)骑行三家村

2023年11月25日 (星期六) 骑行三家村(赏红杉林&#xff09;&#xff0c;早8:30到9:00&#xff0c; 大观公园门囗集合&#xff0c;9:30准时出发 【因迟到者&#xff0c;骑行速度快者&#xff0c;可自行追赶偶遇。】 偶遇地点:大观公园门口集合 &#xff0c;家住东&#xff0c;南…

ssm租房小程序-计算机毕设 附源码42196

SSM租房小程序 摘 要 本论文主要论述了如何使用SSM框架开发一个租房小程序&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构JAVA技术&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述租房小程序的当前背景以及系…

Ajax技

Ajax的特点 异步提交&#xff1a;Ajax采用异步通信方式&#xff0c;能够在页面无需重新加载的情况下向服务器发送请求并接收响应数据&#xff0c;提升了用户体验。无需插件&#xff1a;Ajax是基于标准浏览器的Javascript和XMLHttpRequest对象实现的&#xff0c;无需安装插件或…

5.基于飞蛾扑火算法(MFO)优化的VMD参数(MFO-VMD)

代码的使用说明 基于飞蛾扑火算法优化的VMD参数 优化算法代码原理 飞蛾扑火优化算法&#xff08;Moth-Flame Optimization&#xff0c;MFO&#xff09;是一种新型元启发式优化算法&#xff0c;该算法是受飞蛾围绕火焰飞行启发而提出的&#xff0c;具有搜索速度快、寻优能力强的…

母婴服务预约小程序的效果如何

二胎家庭增速明显&#xff0c;占比较大&#xff0c;成为市场各母婴品牌的目标&#xff0c;而随着行业发展及市场变化&#xff0c;线上互联网深入人们生活&#xff0c;各家母婴品牌开始向“数字化”靠拢。 目前母婴门店商家主要面临服务/产品线上曝光不足、宣传度不够或扩圈无门…