HAL+M4学习记录_2

news2024/9/28 3:59:10

一、Boot配置

内存地址是固定的,代码从0x0000 0000开始,而数据从0x2000 0000开始,F4支持三种不同的boot模式

复位芯片时,在SYSCLK的第4个上升沿BOOT引脚值被锁存,STM32F407通过此时BOOT[1:0]引脚值选择Boot模式

BOOT1BOOT0modedescription
x0Main Flash从flash区域boot
01System memory从系统存储区boot
11Embedded SRAM从内置SRAM区域boot

二、GPIO

每一个GPIO端口通过四个32位的配置寄存器、两个32位的数据寄存器、一个32位置/复位寄存器、一个32位的锁存寄存器和两个32位的复用功能寄存器进行工作

2.1 介绍

有以下特性

  • 输出状态:推挽、开漏、上下拉
  • 通过ODR或外设输出数据
  • 输入状态:浮空、上下拉、模拟
  • 通过IDR或外设输入数据
  • 通过LCKR锁存端口
  • 通过BSRR实现对ODR的位操作

STM32F4的GPIO端口可通过软件进行配置
GPIO端口

2.2 特性

  • 推挽输出
    具有驱动能力强的特点,使用IC内部高电平
  • 开漏输出
    输出高电平由外部上拉电阻决定,用于匹配电平,由于存在上升时间,一般选择下降沿输出;只能输出低电平;可将多个开漏输出连接到一条线上,通过一只上拉电阻形成线与功能。
  • 复用推挽和开漏
    复用是指GPIO不作为普通I/O使用,而是由内部设备直接驱动。
  • 四种输入模型
    • 浮空输入:完全取决于外部电路,与CPU内部无关,会出现抖动
    • 下拉输入:外部输入为低电平时,读取为低电平;外部无输入以及输入高电平时读取高电平
    • 上拉输入:外部输入为高电平时,读取为高电平;外部无输入以及输入低电平时读取低电平
    • 模拟输入:连接内部ADC模块

不使用的引脚推荐设置为模拟模式,以降低功耗和避免干扰
注意:STM32F407单个引脚最大拉电流和灌电流不超过25mA

三、必备API

3.1 哪些是必备API

  • 上电复位进入startup_stm32f407xx.s,执行复位中断服务程序
  • 复位中断服务程序里面执行SystemInit,此函数在system_stm32f4xx.c里面
  • 调用编译器封装函数进入main函数
  • HAL库初始化函数HAL_Init,在stm32f4xx_hal.c文件中
  • 系统时钟初始化,用到文件stm32f4xx_hal_rcc.c
  • 各外设标准库文件

3.2 点亮LED

板载LED
板载两颗LED,分别在PA6引脚和PA7引脚。这里给出板载LED驱动文件bsp_led.c,代码如下

#include "bsp.h"

/*
*********************************************************************************************************
*	                                   Func Statement
*
*	板载两颗LED,LED1是PA6引脚,LED2是PA7引脚,低电平点亮,高电平熄灭
*********************************************************************************************************
*/

/* private define */
#define LED_GPIO_CLK_ALLENABLE()	__HAL_RCC_GPIOA_CLK_ENABLE()

#define GPIO_PORT_LED1 				GPIOA
#define GPIO_PIN_LED1				GPIO_PIN_6

#define GPIO_PORT_LED2 				GPIOA
#define GPIO_PIN_LED2				GPIO_PIN_7

/*
**********************************************************************************
*   @brief   配置板载LED 	
*   @param	 None
*   @return	 None
*   @use	  	
**********************************************************************************
*/
void bsp_InitLed()
{
	GPIO_InitTypeDef GPIO_InitStructure = {0};
	/* 开启GPIO端口时钟 */
	LED_GPIO_CLK_ALLENABLE();
	
	/* 初始熄灭LED */
	GPIO_PORT_LED1->BSRR = GPIO_PIN_LED1;
	GPIO_PORT_LED2->BSRR = GPIO_PIN_LED2;
	
	/* 配置LED */
	GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStructure.Pull = GPIO_NOPULL;
	GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
	
	GPIO_InitStructure.Pin = GPIO_PIN_LED1;
	HAL_GPIO_Init(GPIO_PORT_LED1, &GPIO_InitStructure);
	GPIO_InitStructure.Pin = GPIO_PIN_LED2;
	HAL_GPIO_Init(GPIO_PORT_LED2, &GPIO_InitStructure);
}

/*
**********************************************************************************
*   @brief    点亮指定LED
*   @param	  __no:LED序号,范围 1 - 2
*   @return	  None
*   @use	  	
**********************************************************************************
*/
void bsp_LedOn(uint8_t __no)
{
	__no--;
	if(__no == 0)
	{
		GPIO_PORT_LED1->BSRR = (uint32_t)GPIO_PIN_LED1 << 16U;
	}
	else if(__no == 1)
	{
		GPIO_PORT_LED2->BSRR = (uint32_t)GPIO_PIN_LED2 << 16U;
	}
}

/*
**********************************************************************************
*   @brief    熄灭指定LED
*   @param	  __no:LED序号,范围 1 - 2
*   @return	  None
*   @use	  	
**********************************************************************************
*/
void bsp_LedOff(uint8_t __no)
{
	__no--;
	if(__no == 0)
	{
		GPIO_PORT_LED1->BSRR = GPIO_PIN_LED1;
	}
	else if(__no == 1)
	{
		GPIO_PORT_LED2->BSRR = GPIO_PIN_LED2;
	}
}

/*
**********************************************************************************
*   @brief    翻转指定LED
*   @param	  __no:LED序号,范围 1 - 2
*   @return	  None
*   @use	  	
**********************************************************************************
*/
void bsp_LedToggle(uint8_t __no)
{
	if(__no == 1)
	{
		GPIO_PORT_LED1->ODR ^= GPIO_PIN_LED1;
	}
	else if(__no == 2)
	{
		GPIO_PORT_LED2->ODR ^= GPIO_PIN_LED2;
	}
}

同时bsp_led.h文件代码如下

#ifndef __BSP_LED_H
#define __BSP_LED_H

/* public statement */
void bsp_InitLed();
void bsp_LedOn(uint8_t __no);
void bsp_LedOff(uint8_t __no);
void bsp_LedToggle(uint8_t __no);

#endif

延时函数使用HAL自带的HAL_Delay()即可

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

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

相关文章

一种误差较小的计算轮廓法向的方法

1.前言 轮廓有正面和反面&#xff0c;可以通过其法向识别正反面&#xff0c;而法向是轮廓或面的重要特征&#xff0c;求轮廓法向是一种基础的几何工具算法。 由于浮点数存储和运算的精度损失&#xff0c;可能造成求轮廓法向的精度损失&#xff0c;如角点由于精度损失并非精确的…

工业5G路由器赋能防灾减灾地震监测物联网应用

在智慧城市及科技迅速发展的时代&#xff0c;地震监测作为防灾减灾的关键设施&#xff0c;正逐渐融入物联网技术的广阔蓝图中。工业物联网路由器作为关键的通讯枢纽&#xff0c;赋能地震监测实现智能化升级。 地震监测过程要求数据传输的实时性和准确性&#xff0c;而工业物联网…

DK5V100R15ST1直插TO220F,12V 4A两个引脚同步整流芯片

高性能两个引脚同步整流芯片 DK5V100R15ST1产品 概述DK5V100R15ST1是一款简单高效率的同步整流芯片&#xff0c;只有A&#xff0c;K两个引脚&#xff0c;分别对应肖特基二极管PN管脚。芯片内部集成了100V功率NMOS管&#xff0c;可以大幅降低二极管导通损耗&#xff0c;提高整机…

【计算机网络 - 基础问题】每日 3 题(二十五)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

为什么电瓶车上楼充电引起的电气火灾还是一直发生?

0引言 近日&#xff0c;电瓶车火灾事件再次发生&#xff0c;随后主管部门、物业等相关方纷纷发布通知&#xff0c;提出种种禁令&#xff0c;然而这些措施似乎并未触及问题的核心&#xff0c;其效果也显得微乎其微。唯有从根本上解决问题&#xff0c;才能有效消除安全隐患。回顾…

项目实战:Ingress搭建Nginx+WP论坛+MariaDB

1. 网站架构 本次部署形式完全舍弃 Docker&#xff0c;将所有应用都置于Kubernetes&#xff0c;采用 Deployment 而非单 Pod 部署&#xff0c;稳定性得到升级。 2. 部署 MariaDB [rootk8s-master ~]# mkdir tdr [rootk8s-master ~]# cd tdr/ &#xff08;1&#xff09;定义 …

再也不怕数据丢失!四款数据恢复免费软件分享!

在数据满天飞的今天&#xff0c;一不小心就可能遭遇数据丢失的“惊魂一刻”。虽然数据丢失几乎是大家遇到过的事情&#xff0c;不仅仅是数据被删除&#xff0c;也可能是因为一些小意外。不过别担心&#xff0c;今天就来聊聊四位数据恢复界的“护法”&#xff0c;看看它们在实战…

PostgreSQL 创建表,常规表、外部表、分区表区别讲解

PostgreSQL 创建表&#xff0c;常规表、外部表、分区表区别讲解 创建表&#xff0c;常规表、外部表、分区表区一、常规表1. 定义和特点&#xff1a;2. 适用场景&#xff1a; 二、外部表1. 定义和特点&#xff1a;2. 适用场景&#xff1a; 三、分区表1. 定义和特点&#xff1a;2…

quiz: python网络爬虫之规则1

下面答错了&#xff1a; B c 8A&#xff0c; 9A

代码随想录算法训练营第四十三天 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数组

四十三天打卡&#xff0c;今天解决子序列系列题目&#xff0c;定义dp[i]为以nums[i]为结尾的最长子序列长度。 300.最长递增子序列 题目链接 2024.7.12一刷 没做出来。这题答案使用dp做&#xff0c;答案也不是dp.back()&#xff0c;思路需要转换一下。 2024.9.27二刷 解题…

酒店智能门锁接口pro[V10] 对接酒店收银-SAAS本地化-未来之窗行业应用跨平台架构

一、文档 调用函数库&#xff1a; 提供Windows下的32位动态连接库proRFL.DLL&#xff0c;函数使用详细说明 //-----------------------------------------------------------------------------------// 功能&#xff1a;读DLL版本&#xff0c;不涉及USB口操作 C原型&…

Unity八股总结

这里写目录标题 OnEnable、Awake、Start运行时的发生顺序&#xff1f;哪些可能在同一个对象周期中反复的发生&#xff1f;动态加载资源的方式?Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期&#xff0c;请列出系统自带的几个重要的方法。物理更新一般放在哪个系统函数里…

视频加字幕软件:5款好用加字幕软件来袭!

在视频制作过程中&#xff0c;添加字幕不仅能够提升观众的观看体验&#xff0c;还能有效传达视频信息&#xff0c;增强内容的吸引力和理解度。然而&#xff0c;市面上众多的视频加字幕软件让人眼花缭乱&#xff0c;不知如何选择。今天&#xff0c;我们就来盘点五款既实用又易上…

设计模式之享元(Flyweight)模式

前言 面向对象很好地解决了 “抽象” 的问题&#xff0c;但是不可避免的要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大都可以忽略不计。但是某些情况&#xff0c;面向对象所带来的成本必须谨慎处理 具体需要自己根据需求去评估 定义 “对象性能” 模式。运用…

pdf转ppt文件有哪些方法?这几种方法看了就能学会!

pdf转ppt文件有哪些方法&#xff1f;PDF与PPT&#xff0c;作为两种广泛应用的文件格式&#xff0c;它们各自承载着不同的功能特性与适用场景&#xff0c;其间的差异远不止于表面&#xff0c;首先&#xff0c;PDF可以很好的保留文档原始布局与内容&#xff0c;它确保了信息的精确…

【记录】在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示

【问题】&#xff1a;在返回值类型为BigDecimal情况下末尾小数位为0的会省略不显示 问题复现&#xff1a; 实体类 package com.zlp.aspect.entity;import java.math.BigDecimal;/*** program: my_utils* description:* author: zlp* create: 2024-09-24 10:01**/public clas…

【test】google cloud

https://shell.cloud.google.com/ 默认已经安装了 VsCode 开发环境和终端界面&#xff0c;都是在线运行的&#xff0c;使用非常丝滑。 此外&#xff0c;服务器上还默认安装了 Docker, 这样就可以直接在 Docker 基础上运行一个 Kubernetes 本地集群了&#xff0c;还要啥自行车…

经典单方程计量经济学模型:一元线性回归模型-Eviews实现

下表为中国内地某年各地区税收Y与国内生产总值的GDP的统计资料。 地区YGDP 北京1435.79353.3 天津438.45050.4 河北618.313709.5 山西430.55733.4内蒙古347.96091.1 辽宁815.711023.5 吉林237.45284.7黑龙江3357065 上海1975.512188.9 江苏1894.825741.2 浙江1535.418780.4 安…

剖解环形链表1

环形链表 思路&#xff1a;我们知道在操场上跑步&#xff0c;若一个人跑的快&#xff0c;另一个人跑得慢&#xff0c;那么就一定会有相遇的那一刻&#xff0c;两人站在同一个位置&#xff0c;所以我们可以分别定义快慢指针&#xff0c;若快指针和慢指针相逢&#xff0c;就说明该…

梦幻西游端游如何查看挂机进度,GameViewer远程随时手机畅玩梦幻西游

原来用手机就可以免费玩梦幻西游端游&#xff1f;还可以随时查看游戏进度&#xff01;如果你喜欢玩梦幻西游端游&#xff0c;有总觉得出门在外不方面携带电脑&#xff0c;要想用手机实现随时随地查看梦幻西游的挂机进度&#xff0c;可以用网易GameViewer远程这款专为游戏玩家设…