STM32F412应用开发笔记之二:基本GPIO控制



NUCLEO-F412ZG板子上的元器件并没有完全焊接,除去ST-LINK部分和电源部分后,还有用一个USB主机接口,三个LED灯和两个按钮,不过很多功能引脚都已经引到了插针。查看原理图可发现,由原理图模块的5大部分与电源部分组成,即连接端子、ST-LINKMCUUSB、以太网和电源部分。

电源部分考虑的非常充分,5V有三路输入,一路是有外部输入6-15VDC电源经U5LD1117S50TR)转为5VDC电源;第二路是USB端口提供的5V电源,同时还有电流限制保护U4ST890CDR);第三路则是由外部直接输入5V电源。默认是选择的USB口电源输入,并U6LD39050PU33R)输出3.3VDC电源。当然还有ST-LINK部分的电源以及USB主机部分的电源。而且这两部分也是上述35VDC供电。

以太网部分的电路并未焊接。时钟部分ST-LINK使用了8M的外部晶振(X1),而F412的主时钟输入有两路,一路是从ST-LINK的主控芯片MCO引来,一路也是外界的8M外部晶振(X3)。板子采用的是从MCO引来的时钟。此外还有一个32.768K的外部晶振(X2)。

在了解了基本电路后,开始编程之旅,使用的开发环境是IAR EWARM7.5。首先使用STM32CubeMX创建一个项目。打开STM32CubeMX出现如下的界面。

点击“New Project”新建一个项目,弹出新项目对话框:

由于使用的是NUCLEO-F412ZG开发板,所以选择BoardSelector标签,并选择板子的类型为Nucleo144,选择MCU系列为STM32F4,点击“OK”按钮创建项目,出现如下界面:

在第一个项目中我们简单的利用开发板上提供的按钮B1来控制开发板上的三个指示灯LD1(绿色)、LD2(蓝色)、LD3(红色)其中:

按钮B1对应的输入引脚为:PC13

绿色指示灯LD1对应的引脚为:PB0

蓝色指示灯LD2对应的引脚为:PB7

红色指示灯LD3对应的引脚为:PB14

同时通过引脚PG2来驱动外围的继电器电路,这部分电路由自己搭建。原理图如下:

对于IO的配置可以在STM32CubeMX中完成,将PC13配置为GPIO_EXIT13;将PB0PB7PB14PG2都配置为GPIO_OUTPUT。配置好GPIO引脚的类型后就可以在”Configuration“标签(如下图所示)中配置GPIO口了。

“System“下,选择GPIO弹出”PinConfiguration“对话框。在对话框中一一配置各个GPIO引脚,在本次中我配置个引脚如下:

完成以上配置后,生成IAR EWARM项目则会在生成的源码中出现GPIO的配置,源码如下:

GPIO_InitTypeDef GPIO_InitStruct;

 

/* GPIO Ports Clock Enable */

__HAL_RCC_GPIOC_CLK_ENABLE();

__HAL_RCC_GPIOH_CLK_ENABLE();

__HAL_RCC_GPIOB_CLK_ENABLE();

__HAL_RCC_GPIOD_CLK_ENABLE();

__HAL_RCC_GPIOG_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

 

/*Configure GPIO pin : B1_Pin */

GPIO_InitStruct.Pin = B1_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(B1_GPIO_Port,&GPIO_InitStruct);

 

/*Configure GPIO pins : LD1_Pin LD3_Pin LD2_Pin*/

GPIO_InitStruct.Pin = LD1_Pin|LD3_Pin|LD2_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

 

/*Configure GPIO pins : STLK_RX_Pin STLK_TX_Pin*/

GPIO_InitStruct.Pin = STLK_RX_Pin|STLK_TX_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_VERY_HIGH;

GPIO_InitStruct.Alternate = GPIO_AF7_USART3;

HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

 

/*Configure GPIO pins : Relay_Ctrl_PinUSB_PowerSwitchOn_Pin */

GPIO_InitStruct.Pin =Relay_Ctrl_Pin|USB_PowerSwitchOn_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);

 

/*Configure GPIO pin : USB_OverCurrent_Pin */

GPIO_InitStruct.Pin = USB_OverCurrent_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(USB_OverCurrent_GPIO_Port,&GPIO_InitStruct);

 

/*Configure GPIO pins : USB_SOF_Pin USB_ID_PinUSB_DM_Pin USB_DP_Pin */

GPIO_InitStruct.Pin = USB_SOF_Pin|USB_ID_Pin|USB_DM_Pin|USB_DP_Pin;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed =GPIO_SPEED_FREQ_VERY_HIGH;

GPIO_InitStruct.Alternate = GPIO_AF10_OTG_FS;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

 

/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD3_Pin|LD2_Pin,GPIO_PIN_RESET);

 

/*Configure GPIO pin Output Level */

HAL_GPIO_WritePin(GPIOG,Relay_Ctrl_Pin|USB_PowerSwitchOn_Pin, GPIO_PIN_RESET);

在硬件配置方面,STM32CubeMX能够完成全部的基础工作,我们只需要完成自己的控制逻辑,非常方便。如果设计的好,我们自己学的程序的通用性可以大大提高,极大降低与底层硬件的耦合强度。不过在使用中发现STM32CubeMX似乎与中文操作系统配合得不太好,总是出现全角字符的困扰,估计ST不久会解决。

我的测试逻辑比较简单,一开始三个指示灯全部亮,继电器不导通。按钮B1按一下,LD1灭,再按一下LD2灭,再按一下LD3灭同时继电器吸合,再按一下三个灯全亮同时继电器断开,如此循环。

这部分的源码实现也比较简单,首先定义了一个表示状态的枚举类型,然后根据不通的状态定义逻辑操作。

typedef enum

{

  STATE0 =0,

  STATE1,

  STATE2,

  STATE3,

  STATENUM

}STATE;

 

/*逻辑控制的实现*/

void LogicCtrol(void)

{

 GPIO_PinState b1State=HAL_GPIO_ReadPin(B1_GPIO_Port,B1_Pin);

 if(b1State==GPIO_PIN_SET)

  {

   status++;

  }

 if(status>=STATENUM)

  {

   status=STATE0;

  }

 switch(status)

  {

  caseSTATE0:

    {

     HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD3_Pin|LD2_Pin, GPIO_PIN_SET);

     HAL_GPIO_WritePin(GPIOG, Relay_Ctrl_Pin, GPIO_PIN_RESET);

     break;

    }

  caseSTATE1:

    {

     HAL_GPIO_WritePin(GPIOB, LD1_Pin, GPIO_PIN_RESET);

     HAL_GPIO_WritePin(GPIOB, LD3_Pin|LD2_Pin, GPIO_PIN_SET);

     HAL_GPIO_WritePin(GPIOG, Relay_Ctrl_Pin, GPIO_PIN_RESET);

     break;

    }

  caseSTATE2:

    {

     HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD2_Pin, GPIO_PIN_RESET);

     HAL_GPIO_WritePin(GPIOB, LD3_Pin, GPIO_PIN_SET);

     HAL_GPIO_WritePin(GPIOG, Relay_Ctrl_Pin, GPIO_PIN_RESET);

     break;

    }

  caseSTATE3:

    {

     HAL_GPIO_WritePin(GPIOB, LD1_Pin|LD2_Pin|LD3_Pin, GPIO_PIN_RESET);

     HAL_GPIO_WritePin(GPIOG, Relay_Ctrl_Pin, GPIO_PIN_SET);

     break;

    }

  default:

    {

     break;

    }

  }

}

下载到NUCLEO-F412ZG开发板测试,结果与预期一致。

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

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

相关文章

1-3移动均线交叉策略2

第一阶段、一个简单策略入门量化投资 1-3移动均线交叉策略2 上一篇文章1-2 移动均线交叉策略1中我们最后提到: 如果我们从第一天买入股票,一直持有股票,最后一天卖出,获得的收益是每股124.02美元,收益率为412% 如果…

1-4移动均线交叉策略3

第一阶段、一个简单策略入门量化投资 1-4移动均线交叉策略3 上一文1-3移动均线交叉策略2中,我们得到的结果是令人失望的。但我们的探索还要继续。 我们知道,使用投资组合的方式进行分散投资是降低风险的好办法。尽管移动均线交叉策略的表现并不理想&a…

STM32学习及应用笔记一:SysTick定时器学习及应用

 这几年一直使用STM32的MCU,对ARM内核的SysTick计时器也经常使用,但几乎没有仔细了解过。最近正好要在移植一个新的操作系统时接触到了这块,据比较深入的了解了一下。 1、SysTick究竟是什么? 关于SysT…

使用Atom快速打造好用的Markdown编辑器

使用Atom快速打造好用的Markdown编辑器 Atom当前主流的跨平台的三大编辑器(Atom,sublime,vscode)之一 今天尝试了使用Atom来打造Markdown编辑器,快速上手且易用,墙裂推荐! 下面直接进入正题,一步步介绍如何使用Atom快速打造好用…

PID控制器开发笔记之一:PID算法原理及基本实现

 在自动控制中,PID及其衍生出来的算法是应用最广的算法之一。各个做自动控制的厂家基本都有会实现这一经典算法。我们在做项目的过程中,也时常会遇到类似的需求,所以就想实现这一算法以适用于更多的应用场景。…

十分钟能学会的简单python爬虫

简单爬虫三步走,So easy~ 本文介绍一个使用python实现爬虫的超简单方法,精通爬虫挺难,但学会实现一个能满足简单需求的爬虫,只需10分钟,往下读吧~ 该方法不能用于带有反爬机制的页面,但对于我这样的非专业…

PID控制器开发笔记之二:积分分离PID控制器的实现

前面的文章中,我们已经讲述了PID控制器的实现,包括位置型PID控制器和增量型PID控制器。但这个实现只是最基本的实现,并没有考虑任何的干扰情况。在本节及后续的一些章节,我们就来讨论一下经典PID控制器的优化与改进。这一节我们首…

利用python实现短信和电话提醒功能

有时候,我们需要程序帮我们自动检测某些事件的发生 这个需求是广泛存在的 因此,这里整理了利用python实现短信和电话提醒功能的方法 主要需要完成以下4个步骤: - 安装核心库:twilio - 注册账号及配置 - 发送短信示例 - 电话…

PID控制器开发笔记之三:抗积分饱和PID控制器的实现

积分作用的引入是为了消除系统的静差,提高控制精度。但是如果一个系统总是存在统一个方向的偏差,就可能无限累加而进而饱和,极大影响系统性能。抗积分饱和就是用以解决这一问题的方法之一。这一节我们就来实现抗积分饱和的PID算法。 1、抗积…

如何获取STM32 MCU的唯一ID

前段时间由于应用需要对产品授权进行限制,所以研究了一下有关STM32 MCU的唯一ID的资料,并最终利用它实现了我们的目标。 1、基本描述 在STM32的全系列MCU中均有一个96位的唯一设备标识符。在ST的相关资料中,对其功能的描述有3各方面&#x…

SHA256算法原理详解

1. SHA256简介 SHA256是SHA-2下细分出的一种算法 SHA-2,名称来自于安全散列算法2(英语:Secure Hash Algorithm 2)的缩写,一种密码散列函数算法标准,由美国国家安全局研发,属于SHA算法之一&…

学习笔记:区块链概念入门

本文是100天区块链学习计划的第二篇学习笔记,其实就是按照阮一峰的网络日志-区块链入门教程的讲解进行的简单梳理。也是时间有点紧张的原因,相比于上一篇SHA256算法原理详解,个人感觉质量和原创程度明显下降。待对区块链有了更深的理解后&…

PID控制器开发笔记之四:梯形积分PID控制器的实现

从微积分的基本原理看,积分的实现是在无限细分的情况下进行的矩形加和计算。但是在离散状态下,时间间隔已经足够大,矩形积分在某些时候显得精度要低了一些,于是梯形积分被提出来以提升积分精度。 1、梯形积分基本思路 在PID控制…

SHA256 的C语言实现

前几天总结了SHA256的算法原理一文 SHA2系列的原理并不复杂,但是需要注意细节还是挺多的。不少中文博客贴出的代码都有错,这两天也踩了几个坑。 代码在这里!!!SHA256的C Code 代码实现主要依照的这个git仓库crypto-…

信息摘要算法之一:MD5算法分析及实现

MD5即Message-DigestAlgorithm 5(信息-摘要算法5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。 1、MD5算法简介 MD5在90年代初由…

非对称加密概述

非对称加密概述 前言 在阅读《精通比特币》的过程中,我发现比特币系统中有两个重要的概念需要利用非对称加密技术: 比特币地址的生成 交易合法性的验证 因此,我用了几天时间学习了密码学基础知识,尤其是非对称加密技术的原理…

信息摘要算法之二:SHA1算法分析及实现

SHA算法,即安全散列算法(Secure Hash Algorithm)是一种与MD5同源的数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。 1、概述 SHA算法…

2018数学建模A题的简单指导

之前写过一篇博客,介绍如何使用差分格式求解热传导方程 今天打开博客,突然发现评论区被这篇文章霸屏了 询问实验室的小伙伴才知,原来是被可爱的建模学子们攻占了 经过简单的了解,发现今年建模的A题的核心就是求解一个热传导方程…

PID控制器开发笔记之五:变积分PID控制器的实现

在普通的PID控制算法中,由于积分系数Ki是常数,所以在整个控制过程中,积分增量是不变的。然而,系统对于积分项的要求是,系统偏差大时,积分作用应该减弱甚至是全无,而在偏差小时,则应该…

使用SIFT匹配金馆长表情包

python使用opencv计算SIFT特征点的示例前言潜在的问题记录demo1:计算并绘制特征点demo2:使用SIFT匹配两幅图像参考文章地址前言 SIFT(Scale-invariant feature transform)是2004年提出的,至今已经经受住各种考验&…