当前位置: 首页 > news >正文

HAL+M4学习记录_2

一、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.mrgr.cn/news/37656.html

相关文章:

  • 从零开始Ubuntu24.04上Docker构建自动化部署(三)Docker安装Nginx
  • 如何保护自己电脑以及服务器的ip地址
  • MySql在更新操作时引入“两阶段提交”的必要性
  • 开源b2b2c商城系统流程 多用户商城系统流程图
  • 队列宽搜 -1
  • 【HarmonyOS鸿蒙应用开发者高级认证单题精讲】从桌面冷启动如下应用代码,点击Change按钮5次,整个过程中,代码中的2条log依次出现的次数是
  • 日本IT-正社员、契约社员、个人事业主该如何选?
  • pgrep的一次入坑经历
  • CUDA C++ Best Practices Guide 概要
  • 计算机毕业设计党建学习网站查看发布党建评论留言搜索部署安装/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序
  • Excel FIND函数用法详解,附FIND函数提取文本示例
  • 参会通知!第三届计算、通信、感知与量子技术国际会议(CCPQT 2024)
  • 18724 二叉树的遍历运算
  • ICAS英格尔认证闪耀2024汽车供应链降碳峰会,引领行业绿色发展新潮流
  • Invalid Executable The executable contains bitcode
  • 安卓手机视频被误删怎么恢复,这3个方法满足你
  • SAP B1 认证考试习题 - 解析版(二)
  • 博主回归!数据结构篇启动
  • CDGA|数据流通新策略:高效利用,解锁数字经济新动能
  • C~排序算法