野火霸天虎 STM32F407 学习笔记_4 构建库函数尝试;使用固件库点亮 LED 灯

news2024/11/25 10:06:31
构建库函数

创建一个通用的模板,后面写程序直接使用这个模板。

$ ls
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2023/11/8     23:27                Libraries
d-----         2023/11/8     23:27                Listing
d-----         2023/11/8     23:27                Output
d-----         2023/11/8     23:27                Project
d-----         2023/11/8     23:27                User
-a----         2020/2/27     13:45            401 keilkill.bat

前面都是新建的文件夹,keilkill.bat 是从 keil 编译程序中复制出来的一个脚本,可以删掉中间文件。

把固件库 Lib 里的 CMSIS 和 Driver 文件拷贝到 Libraries 文件夹中。CMSIS 中只保留 Device Include 文件夹。Device 中包含外设相关(比如 stm32f4xx.h system_stm32f4xx),Include 中只包含内核相关。

把 main.c stm32f4xx_it.c / stm32f4xx_it.h stm32f4xx_conf.h 拷贝到 User 文件夹中。

在 Project 文件夹里可以包含多给项目文件,不光只有 Keil 的。比如 IAR 的我们新建一个 IAR 文件夹,Keil 我们新建一个 RVMDK(uv5) 文件夹。RealView 是包含不止 MDK 的开发工具集合的称呼,MDK 是 MCU 开发工具集成包,uVersion 是 IDE,Keil 是公司名字。

uVision 里新建工程,新建在 RVMDK(uv5) 文件夹下。

新建组、添加文件如下:

image-20231109002542997

STM32F4xx_StdPeriph_Driver 添加 STM32F4xx_StdPeriph_Driver/src 下的所有文件,屏蔽掉 dma2d fmc ltdc,后两个是 sd 和 lcd 屏幕组件。

头文件如下:

image-20231109002823229

宏定义如下:

USE_STDPERIPH_DRIVER,STM32F40_41xxx

我现在好想明白为什么宏定义在这里了,这样后面换单片机型号的时候可以直接修改这个宏定义。

PS:我下载的是 1.8.1 版本 stm32f4xx.h 库函数,里面出现了一段重复定义导致编译产生了200多个 warning。我把下面那一段删掉了就好了。

jingqing3948_1-1699463889291.png

Output 里设置 Output 文件夹,不然都在 Proj 里太乱。

记得勾选 MicroLib。

点灯——官方库函数版

在 User 文件夹中新建 LED 文件夹,里面新建 bsp_led.c,代表板级支持包 LED 代码,也就是只针对我们当前这一款开发板的点灯程序。

  1. 设置时钟:rcc 时钟,在 stm32f4xx_rcc.c 中:

  2. /**
      * @brief  Enables or disables the AHB1 peripheral clock.
      * @note   After reset, the peripheral clock (used for registers read/write access)
      *         is disabled and the application software has to enable this clock before 
      *         using it.   
      * @param  RCC_AHBPeriph: specifies the AHB1 peripheral to gates its clock.
      *          This parameter can be any combination of the following values:
      *            @arg RCC_AHB1Periph_GPIOA:       GPIOA clock
      *            @arg RCC_AHB1Periph_GPIOB:       GPIOB clock 
      *            @arg RCC_AHB1Periph_GPIOC:       GPIOC clock
      *            @arg RCC_AHB1Periph_GPIOD:       GPIOD clock
      *            @arg RCC_AHB1Periph_GPIOE:       GPIOE clock
      *            @arg RCC_AHB1Periph_GPIOF:       GPIOF clock
      *            @arg RCC_AHB1Periph_GPIOG:       GPIOG clock
      *            @arg RCC_AHB1Periph_GPIOG:       GPIOG clock
      *            @arg RCC_AHB1Periph_GPIOI:       GPIOI clock
      *            @arg RCC_AHB1Periph_GPIOJ:       GPIOJ clock (STM32F42xxx/43xxx devices) 
      *            @arg RCC_AHB1Periph_GPIOK:       GPIOK clock (STM32F42xxx/43xxx devices)  
      *            @arg RCC_AHB1Periph_CRC:         CRC clock
      *            @arg RCC_AHB1Periph_BKPSRAM:     BKPSRAM interface clock
      *            @arg RCC_AHB1Periph_CCMDATARAMEN CCM data RAM interface clock
      *            @arg RCC_AHB1Periph_DMA1:        DMA1 clock
      *            @arg RCC_AHB1Periph_DMA2:        DMA2 clock
      *            @arg RCC_AHB1Periph_DMA2D:       DMA2D clock (STM32F429xx/439xx devices)  
      *            @arg RCC_AHB1Periph_ETH_MAC:     Ethernet MAC clock
      *            @arg RCC_AHB1Periph_ETH_MAC_Tx:  Ethernet Transmission clock
      *            @arg RCC_AHB1Periph_ETH_MAC_Rx:  Ethernet Reception clock
      *            @arg RCC_AHB1Periph_ETH_MAC_PTP: Ethernet PTP clock
      *            @arg RCC_AHB1Periph_OTG_HS:      USB OTG HS clock
      *            @arg RCC_AHB1Periph_OTG_HS_ULPI: USB OTG HS ULPI clock
      * @param  NewState: new state of the specified peripheral clock.
      *          This parameter can be: ENABLE or DISABLE.
      * @retval None
      */
    void RCC_AHB1PeriphClockCmd(uint32_t RCC_AHB1Periph, FunctionalState NewState)
    

    其他部分基本也是参照库函数(主要是 stm32f4xx_gpio.h)最终呈现如下:

    #include "bsp_led.h"
    
    void LED_GPIO_Config(void){
        //RCC set function in stm32f4xx_rcc.h
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
        {
            //Init structure
            GPIO_InitTypeDef GPIO_InitStructure;
            GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
            GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
            GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
            GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;
            GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
            //init function
            GPIO_Init(GPIOF,&GPIO_InitStructure);
        }
        
    }
    

    置位可以使用 GPIO_SetBitsGPIO_ResetBits

    int main()
    {
        int i;
        LED_GPIO_Config();
        
        
        *(unsigned int *)(0x40021400+0x14)&=~(1<<6); 
      while (1)
      {
          GPIO_ResetBits(GPIOF,GPIO_Pin_6);
          i=12000000;
          while(i--);
          GPIO_SetBits(GPIOF,GPIO_Pin_6);
          i=12000000;
          while(i--);
      }
    }
    

    没有上下拉的时候推挽输出会直接被 ODR 值所影响,哪怕没有赋值其中本来的值也会影响。所以推挽输出无上下拉,不置位 LED 也会被点亮,因为 ODR 默认值0.

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

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

相关文章

Django文件配置、request对象、连接MySQL、ORM

文章目录 Django静态文件及相关配置静态文件前言静态文件相关配置 form表单request对象request请求结果GET请求POST请求 pycharm连接数据库Django连接MySQLDjango ORM简介 Django静态文件及相关配置 在此篇博客我将以一个用户登录页面来引入相关知识 首先我们先编写一个html页面…

【计算机网络笔记】网络层服务模型——数据报网络

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

不可忽视的国外服务器地址IP选择指南

​  在如今互联网高速发展的时代&#xff0c;海外服务器扮演着重要的角色。选择合适的国外服务器IP地址却是一项复杂而又关键的任务。本文将为您介绍一些不可忽视的国外服务器地址IP选择指南。 私有IP地址&#xff1a; 私有IP地址是指在局域网内使用的IP地址&#xff0c;用于…

vue Sts认证后直传图片到阿里云OSS

后端进行sts认证生成临时身份凭证&#xff0c;前端通过凭证直传图片等文件到OSS中 一 OSS配置 增加用户和角色&#xff0c;创建OSS bucket 1.1 添加用户 登录阿里云管理控制台&#xff0c;右侧头像&#xff0c;进入访问控制 点击左侧导航栏的身份管理的用户&#xff0c;点击…

python- time模块

3种时间格式之间的转换 &#xff1a; 1、时间戳->格式化时间 time.localtime(timestamp)&#xff1a;北京时间 time.gmtime(timestamp) &#xff1a;伦敦时间 2、格式化时间->时间戳时间

PHP网站源码 知识付费分站代理自助下单系统 自带多款模板

源码测评&#xff1a;功能很齐全&#xff0c;有可以对接的总站&#xff0c;应该是对接好就可以推广赚钱了&#xff0c;但是这种感觉能赚钱的就那么几个人&#xff0c;见仁见智吧&#xff01; 截图演示&#xff1a; 转载自 https://www.qnziyw.cn/cmsmb/qtcms/3952.html

【JAVA学习笔记】67 - 坦克大战1.5 - 1.6,防止重叠,记录成绩,选择是否开新游戏或上局游戏,播放游戏音乐

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter20/src 增加功能 1.防止敌人坦克重叠运动 2.记录玩家的成绩&#xff0c;存盘退出 3.记录当时的敌人坦克坐标&#xff0c;存盘退出 4.玩游戏时&#xff0c;可以选择是开新游戏还是继续上局…

说说对React Hooks的理解?解决了什么问题?

一、是什么 Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 至于为什么引入hook&#xff0c;官方给出的动机是解决长时间使用和维护react过程中常遇到的问题&#xff0c;例如&#xff1a; 难以重用和共享组件中的与状态…

ChatGPT:something went wrong

今天下午不知什么原因&#xff0c;ChatGPT无法使用。我原来在使用ChatGPT for chrome&#xff0c;返回了一个答案&#xff0c;后来在网页端无法使用&#xff0c;以为是这个chrome插件泄露API KEY导致的。注销账号&#xff0c;删除API KEY后&#xff0c;wrong问题仍然存在。 我…

读程序员的制胜技笔记08_死磕优化(上)

1. 过早的优化是万恶之源 1.1. 著名的计算机科学家高德纳(Donald Knuth)的一句名言 1.2. 原话是&#xff1a;“对于约97%的微小优化点&#xff0c;我们应该忽略它们&#xff1a;过早的优化是万恶之源。而对于剩下的关键的3%&#xff0c;我们则不能放弃优化的机会。” 2. 过早…

12 # 手写 findIndex 方法

findIndex 的使用 findIndex() 方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回 -1。 <script>var arr [1, 3, 5, 7, 8];var result arr.findIndex(function (ele, index, array) {console.log("ele----->", ele);conso…

【Java】SPI在Java中的实现与应用

一、SPI的概念 1.1、什么是API&#xff1f; API在我们日常开发工作中是比较直观可以看到的&#xff0c;比如在 Spring 项目中&#xff0c;我们通常习惯在写 service 层代码前&#xff0c;添加一个接口层&#xff0c;对于 service 的调用一般也都是基于接口操作&#xff0c;通…

已解决:rm: 无法删除“/opt/module/zookeeper-3.4.10/zkData/zookeeper_server.pid“: 权限不够

解决&#xff1a; ZooKeeper JMX enabled by default Using config: /opt/module/zookeeper-3.4.10/bin/../conf/zoo.cfg Stopping zookeeper ... /opt/module/zookeeper-3.4.10/bin/zkServer.sh: 第 182 行:kill: (4149) - 不允许的操作 rm: 无法删除"/opt/module/zooke…

开发知识点-Python

Python从小白到入土 python渗透测试安全工具开发锦集Python安全工具编程基础第一章 Python在网络安全中的应用第一节 Python黑客领域的现状第二节 我们可以用Python做什么第三节 第一章课程内容总结 第二章 python安全应用编程入门第一节 Python正则表达式第二节 Python Web编程…

C++二分查找算法:阶乘函数后 K 个零

涉及知识点 二分查找 数学 题目 f(x) 是 x! 末尾是 0 的数量。回想一下 x! 1 * 2 * 3 * … * x&#xff0c;且 0! 1 。 例如&#xff0c; f(3) 0 &#xff0c;因为 3! 6 的末尾没有 0 &#xff1b;而 f(11) 2 &#xff0c;因为 11! 39916800 末端有 2 个 0 。 给定 k&a…

Python--列表及其应用场景

1.为什么需要列表 思考&#xff1a;有一个人的姓名(laowang)怎么书写存储程序&#xff1f; 用 变量。如&#xff1a;name laowang 但是&#xff0c;如果要记录很多人的名字&#xff0c;怎么办&#xff1f; 思考&#xff1a; 如果一个班级100位学生&#xff0c;每个人的…

17 Linux 中断

一、Linux 中断简介 1. Linux 中断 API 函数 ① 中断号 每个中断都有一个中断号&#xff0c;通过中断号可以区分出不同的中断。在 Linux 内核中使用一个 int 变量表示中断号。 ② request_irq 函数 在 Linux 中想要使用某个中断是需要申请的&#xff0c;request_irq 函数就是…

【Unity ShaderGraph】| 如何快速制作一个炫酷的 全息投影效果

前言 【Unity ShaderGraph】| 如何快速制作一个炫酷的 全息投影效果一、效果展示二、 全息投影效果 前言 本文将使用ShaderGraph制作一个 炫酷的 全息投影效果 &#xff0c;可以直接拿到项目中使用。对ShaderGraph还不了解的小伙伴可以参考这篇文章&#xff1a;【Unity Shader…

mac 卸载第三方输入法

输入法设置里的移除&#xff0c;并不是真的卸载&#xff0c;点击还是能添加回来 在活动监视器里强制退出此输入法在访达界面使用快捷键 ShiftcommandG在弹出的对话框内输入以下路径&#xff08;/资源库/Input Methods&#xff09;&#xff0c;再点击下面的前往找到你要卸载的输…

HadSky+内网穿透打造个人专属社区论坛并远程访问

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…