基于STM32单片机流水灯控制中的GPIO_Init()函数解析

发布者:dfdiqc最新更新时间:2020-02-09 来源: elecfans关键字:STM32  单片机  流水灯控制 手机看文章 扫描二维码
随时随地手机看文章

学习STM32时,首先要熟悉流水灯例程,在这里就来分析流水灯中的GPIO_Init()函数

例如:流水灯例程中使用的端口是macLED1_GPIO_PORT=GPIOB,

控制的引脚是GPIO_Pin_0,

引脚的模式是GPIO_Mode_Out_PP(通用推挽输出),

引脚的速率是GPIO_Speed_50MHz,

用到的寄存器是CRL


将上述的引脚、模式、速率换算成32位的16进制,分别是:

1)控制的引脚是GPIO_Pin_0

换算成32位的16进制是:0x0000 0001

2)引脚的模式是GPIO_Mode_Out_PP(通用推挽输出)

换算成32位的16进制是:0x0000 0010

3)引脚的速率是GPIO_Speed_50MHz


换算成32位的16进制是:0x0000 0003

然后调用库函数GPIO_Init(),初始化GPIOB

GPIO_Init(macLED1_GPIO_PORT, &GPIO_InitStructure);

GPIO_Init()函数的定义如下:

基于STM32单片机流水灯控制中的GPIO_Init()函数解析

基于STM32单片机流水灯控制中的GPIO_Init()函数解析

GPIO Mode Configuration

currentmode=((uint32_t)GPIO_InitStruct-》GPIO_Mode)&((uint32_t)0x0F);

可以得出currentmode=0x0000 0010 & 0x0000 000F

=0x0000 0000

if ((((uint32_t)GPIO_InitStruct-》GPIO_Mode) & ((uint32_t)0x10)) != 0x00)

判断是否是输出模式,“是”,执行下面代码;“否”,不执行

如:0x0000 0010 & 0x0000 00010 !=0x 0000 0000

则执行下面语句

{

/* Output mode */

currentmode “= (uint32_t)GPIO_InitStruct-》GPIO_Speed;

可以得出currentmode=currentmode | 0x0000 0003=0x0000 0000

=0x0000 0003

}

GPIO CRL ConfiguraTIon

if(((uint32_t)GPIO_InitStruct-》GPIO_Pin&((uint32_t)0x00FF)) != 0x00)

判断是否是Pin0~Pin7引脚,“是”,执行下面代码;“否”,不执行

如:0x0000 0001 & 0x 0000 00FF != 0x0000 0000

则执行下面语句

{

tmpreg = GPIOx-》CRL;

备份原CRL寄存器的值

则是:tmpreg=0x4444 4444

for (pinpos = 0x00; pinpos 《 0x08; pinpos++)

{

pos = ((uint32_t)0x01) 《《 pinpos;

pos是0x0000 0001左移 pinpos 位得到的

如:pos=0x0000 0001 《《 0x00

= 0x0000 0001

为后面的if (currentpin == pos) 判断作准备

/* Get the port pins posiTIon */

currentpin = (GPIO_InitStruct-》GPIO_Pin) & pos;

可得currentpin= 0x0000 0001 & 0x0000 0001

=0x0000 0001

为后面的if (currentpin == pos) 判断作准备

if (currentpin == pos)

由上面得出的pos = 0x0000 0001

currentpin = 0x0000 0001

两者相等,则执行下面代码语句

{

pos = pinpos 《《 2;

可得pos= 0x0000 0000 《《 2

=0x 0000 0000

/* Clear the corresponding low control register bits */

pinmask = ((uint32_t)0x0F) 《《 pos;

可得pinmask=0x0000 000F 《《 0x0000 0000

= 0x0000 000F

tmpreg &= ~pinmask;

可得tmpreg= tmpreg & ~pinmask

= 0x4444 4444 & 0xFFFF FFF0

= 0x4444 4440

/* Write the mode configuraTIon in the corresponding bits */

tmpreg |= (currentmode 《《 pos);

首先,要知道currentmode 《《 pos = 0x0000 0003 《《 0x 0000 0000

= 0x 0000 0003

可得tmpreg= tmpreg | 0x0000 0003

= 0x4444 4440 & 0x0000 0003

= 0x4444 4443

/* Reset the corresponding ODR bit */

if (GPIO_InitStruct-》GPIO_Mode == GPIO_Mode_IPD)

判断是否为下拉输入模式

{

GPIOx-》BRR = (((uint32_t)0x01) 《《 pinpos);

}

else

{

/* Set the corresponding ODR bit */

if (GPIO_InitStruct-》GPIO_Mode == GPIO_Mode_IPU)

判断是否为上拉输入模式

{

GPIOx-》BSRR = (((uint32_t)0x01) 《《 pinpos);

}

}

结果,两种输入模式都不是,而是通用推挽输出,所以不执行

}

}

GPIOx-》CRL = tmpreg;

把前面处理后的暂存值写入到CRL寄存器之中

也就是GPIOx-》CRL= 0x4444 4443

}

最终,向GPIOB组的CRL寄存器写入一个值:

GPIOx-》CRL = 0x4444 4443

转换为二进制是:(0100 0100 0100 0100 0100 0100 0100 0011)B

因此,Pin0的控制值为(0011)B

下面是CRL寄存器的说明

基于STM32单片机流水灯控制中的GPIO_Init()函数解析

对比一下CRL寄存器的说明,Pin0的控制值正好可以把GPIO设置为符合我们输入参数要求的状态,即最大速率为50MHz的通用推挽输出模式。

关键字:STM32  单片机  流水灯控制 引用地址:基于STM32单片机流水灯控制中的GPIO_Init()函数解析

上一篇:基于STM32单片机在手持设备中的应用设计
下一篇:基于STM32单片机FSMC协议分析

推荐阅读最新更新时间:2024-11-01 12:32

51单片机DIY做PLC编程
有朋友想定制一个净水机控制器,有一些独特的功能要增加,但是商品控制板没有这样的功能,问我能否做一个,我觉得单片机完全能满足这种简单的控制需要,上手开始编程序时候突然感到,用PLC逻辑编这种功能是非常简单轻松的,而如果用汇编或C编却感觉有点棘手,编程效率不高,所以想为何不在单片机上实现PLC的逻辑呢?上网搜索尝试看能否找到合适的程序下载来稍微改改就能用的呢?方案几年前就有了,实际上是利用三菱的低档PLC编程软件编辑好梯形图,存盘后用专用的格式转换工具转换成HEX单片机烧写文件烧进去,尝试下载三菱PLC工具软件,但是在我的WIN7-64位系统上不能正常工作,好容易换了系统装好开发工具,但是初次上手这款开发工具,界面挺复杂的,懒得研究各个
[单片机]
51<font color='red'>单片机</font>DIY做PLC编程
正点原子STM32学习笔记——通用定时器基本原理
以下描述适用于整个STM32FM10xxx系列。 本文依据《STM32中文参考手册_V10》 STM32 通用定时器简介 STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能包括: 1)16 位向上、向下、向上
[单片机]
正点原子<font color='red'>STM32</font>学习笔记——通用定时器基本原理
8031单片机CPU响应中断源请求详细过程及程序示例
MCS-51的CPU在每一个机器周期顺序检查每一个 中断 源,在每一机器周期的状态周期S6采样并按优先级顺序处理所有被激活了的中断请求,如果没有被下述条件所阻止,将在下一个机器周期的状态周期S1响应激活了的最高级中断请求。 (1)CPU正在处理相同的或更高优先级的中断。 (2)现行的机器周期不是所执行指令最后一个机器周期。 (3)正在执行的指令是RETI或是访问IE或IP的指令(CPU在执行RETI或访问IE、IP的指令后,至少需要再执行一条指令才会响应新的中断请求。 如果上述条件中有一个存在,CPU将丢弃中断查询的结果。 CPU响应中断时,先置相应的优先级状态触发器(该触发器指出CPU开始处理的中断优先级别),然
[单片机]
8031<font color='red'>单片机</font>CPU响应中断源请求详细过程及程序示例
基于AT89S51单片机的低频信号设计及仿真研究
传统的低频信号源或发生装置,因其大部分采用模拟电路设计的原因,一般具有价格昂贵、输出性能欠佳且不便于调节等问题,工程应用价值较低。为避免传统低频信号源或发生装置的上述技术缺点,降低技术开发成本和提高技术开发效率,文中利用AT89S51可以在线编写程序的特点,结合了DAC接口技术,设计了波形、频率、相位均调节方便并可产生方波、三角波、锯齿波、正弦波四种波形的技术方案。这种新的低频信号源设计方案,可以使得波形信号的产生由单片机查表软件产生,波形的周期依靠程序设置来改变,具有线路简单、结构紧凑、价格低廉、性能优越等优点。 1 设计目标和思路 文中设计目标是完成4种波形信号输出,即正弦波、三角波、方波和锯齿波,并使其在低频范围内具
[单片机]
基于AT89S51<font color='red'>单片机</font>的低频信号设计及仿真研究
SAM8系列S3C825A型单片机及其软件设计
摘要:以S3C825A为例介绍三星公司SAM8系列单片机的内部结构及其软件开发环境,详细描述采用混合编辑法来对SAM8系列单片机进行软件设计的一般方案,最后给出用混合编程法对S3C825A进行软件设计的具体应用实例。 关键词:SAM8系列单片机;OPENice i500;IAR C编译器;混合编程 引言 三星SAM8系列单片机是8位CMOS型微控制器,该系列单片机具有功耗超低、多样型号、资源丰富、CPU时钟可调及软件对硬件控制灵活等优点,其中,S3C825A型是目前应用较为广泛的单片机。S3C825A与三星SAM8系列其他单片机一样,其常用的开发环境是IAR公司的IAR Embedded Workbench集成开发资源,该环
[应用]
STM32芯片简介以及功能特点和其优异性
STM32与单片机 单片机(Microcontrollers)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。由于8位单片机由于内部构造简单,体积小,成本低廉,在一些较简单的控制器中应用很广。常见的8位单片机主要有:Intel的51系列,Atmel的AVR系统,Microchip公司的PIC系列,TI的MSP430系列等。而STM32是一种功能比较强大的32位的单片机。它和8位单片机最大的不
[单片机]
在51系列单片机系统中应用SPI总线
1 引言 SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOST和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。由于SPI系统总线一共只需3~4位数据线和控制即可实现与具
[单片机]
沁恒股份8位增强型USB主从单片机CH559概述
概 述 CH559是一款兼容MCS51的增强型E8051内核单片机,79%的指令是单字节单周期指令,内置60K Code Flash,6K+256B Ram。 CH559 内嵌USB控制器和双USB收发器,支持 USB-Host 主机模式和 USB-Device 设备模式,支持 USB 2.0 全速 12Mbps 或者低速 1.5Mbps,USB 主机模式下可以通过双端口 Root-HUB 同时管理两个 USB 设备。支持最大 64 字节数据包,内置 FIFO,支持 DMA。 CH559提供丰富的接口资源,包括内置类485数据收发器、LED控制卡接口和快速电平捕捉功能,其他包括2组SPI、2路串口、8位并口等,UART1兼
[单片机]
沁恒股份8位增强型USB主从<font color='red'>单片机</font>CH559概述
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved