STM32F407基础总结系列(一)

STM32F407基础总结系列(一)

  • 一、前言
  • 二、STM32F407部分基础小知识(待整理)
    • 1 外设设置相关
      • 1.1 GPIO使用
      • 1.2 定时器PWM波
      • 1.3 外部晶振参数修改
    • 2 语言及使用环境相关
      • 2.1 C/C++
      • 2.2 F407的启动文件
    • 3 测试验证相关
      • 3.1 PWM配置IO引脚
      • 3.2 通用IO引脚
    • 4 故障排查相关
      • 4.1 可靠调试技巧
  • 三、小结尾
  • 四、参考文献

一、前言

突然间想记录一下这些简单实用的东西,因为我发现曾经拥有的、奇妙的抑或是一些引以为豪、熟练的不能再熟练的东西终将会变成脑海中一种自我良好的感觉,当要提取出来用到的时候才发现你依旧是那个小白白,依旧要重新来过。技术时代,时间宝贵,方向远比努力重要,只有更优秀才能更优秀。
本章记录的都是一些超级简单,很基础却也是很有用的东西,旨在帮助那些和我一样曾经迷茫、陷入其中的人,当然有大佬批评指教一下最好。
刚开始记录因此东西杂乱无章,没关系,好的文章是要经过不断地不断地修改才能出来的。记录的东西不详尽没有固定时间,没关系,烂开头好过一动不动(其实是懒)。记录的东西很低级,没关系,都是从新手入门过来然后在来回之间反复横跳(哼,瞧不起谁)。

二、STM32F407部分基础小知识(待整理)

1 外设设置相关

1.1 GPIO使用

单片机入门第一步用寄存器点灯,点灯操作的寄存器代码如下:
以PF6低电平为例

	/*开启 GPIOF 时钟,使用外设时都要先开启它的时钟*/RCC_AHB1ENR |= (1<<5);		/*PF6 MODER6 = 01b 输出模式*/GPIOF_MODER |= (1<<2*6);	/*PF6 OTYPER6 = 0b 推挽模式*/GPIOF_OTYPER |= (0<<1*6);/*PF6 OSPEEDR6 = 11b 速率100MHz*/GPIOF_OSPEEDR |= (3<<2*6);/*PF6 PUPDR6 = 01b 上拉模式*/GPIOF_PUPDR |= (1<<2*6);	/*PF6 BSRR寄存器的 BR6置1,使引脚输出低电平*/GPIOF_BSRR |= (1<<16<<6);

过程就是 开外设时钟->配置模式寄存器(输入还是输出)->输出类型寄存器(若配置输出模式化此项需要)->输出速度寄存器(一般没要求就开最大)->上下拉寄存器(一般上拉为高电平,下拉为低电平)->置位复位寄存器(可直接操作引脚为高低电平)

1.2 定时器PWM波

配置流程

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;//TIM时钟配置结构体
TIM_OCInitTypeDef TIM_OCInitStructure;//TIM PWM配置结构体
GPIO_InitTypeDef GPIO_InitStructure; //GPIO配置结构体
// 开启定时器相关的GPIO 外设时钟*/
RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA,ENABLE);//GPIO时钟
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM3,ENABLE);//TIM3定时器时钟/* 指定引脚复用功能*/GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_TIM3);//功能复用,注意这里GPIO_PinSource6和GPIO_Pin_6不能混淆。这个函数和GPIO_Init()先后无所谓。/* 定时器功能引脚初始化*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//GPIO_PuPd_NOPULL;//上拉下拉无所谓 都可以GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);
/* ================== 时基结构体初始化=================== */// 累计TIM_Period+1 个计数后产生一个更新或者中断// 当定时器从0 计数到1023,即为1024 次,为一个定时周期TIM_TimeBaseStructure.TIM_Period = 1024-1;// 高级控制定时器时钟源TIMxCLK = HCLK=42MHz// 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=100KHzTIM_TimeBaseStructure.TIM_Prescaler = 420-1;// 时钟分频,在计算死区时间的时候会用到TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;// 计数方式TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;// 重复计数器,这里没使用TIM_TimeBaseStructure.TIM_RepetitionCounter=0;// 初始化定时器TIMx, x[1,8]TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);/* ================== 输出结构体初始化=================== */// 配置为PWM 模式1,先输出高电平,达到比较值的时候再改变电平TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;// 主输出使能TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;// 配置比较值TIM_OCInitStructure.TIM_Pulse = 0;// 主输出高电平有效TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;// 通道初始化	
TIM_OC1Init(TIM3, &TIM_OCInitStructure);// 使能通道重装载TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
// 使能定时器TIM_Cmd(TIM3, ENABLE);
// 主动输出使能
// TIM_CtrlPWMOutputs(TIM3, ENABLE);

总体流程是 开GPIO、TIM时钟->配置GPIO参数(注意是否功能复用)->配置TIM定时器参数(主要是分频与计数-也就是输入时钟与计数周期)->TIM定时器PWM波配置(包括占空比、模式、高低电平及通道)->功能开启

1.3 外部晶振参数修改

不同板子可能晶振不同,需要修改的地方如下:

先修改stm32f4xx.h文件中的HSE_VALUE(外部高速时钟)
在这里插入图片描述
再修改system_stm32f4xx.c中的PLL_M(锁相环分频系数)
在这里插入图片描述
不改程序也能运行,点灯可以,但定时时序肯定是错乱的,比如定时1s可能快也可能慢。

2 语言及使用环境相关

2.1 C/C++

工程中添加头文件 出现了c/c++混编 需要修改编译文件方式
有时候会出现这种问题,很奇怪,明明添加了头文件并且按F12也能跳转到相应的函数中去,它就是报错跟你对着干,这种问题考虑一下可能要调用的头文件的问价类型设置问题(c/c++混编导致)
在这里插入图片描述
比如main.c文件类型设定为c++源文件,main中调用了bsp_led.h,bsp_led.h对应的源文件为bsp_led.c,其类型为c源文件,编译后就会造成上述错误。(都改为c++源文件类型就好了,后续免不了使用c++模块化思想)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 F407的启动文件

有时候我们会遇到移植了不同F4芯片的工程,启动文件不一样,这时候就会尴尬要不要更换启动文件。实测不用更换,只需要修改魔术棒中的宏定义即可
在这里插入图片描述
在这里插入图片描述
问题不大,修改魔术棒选项中C/C++里的Define就好了,如下使用了429的启动文件,使用的时候定义407的宏定义就好了
在这里插入图片描述

3 测试验证相关

3.1 PWM配置IO引脚

配置PWM波IO引脚设置上拉或下拉或者不拉没啥影响,波形照样输出 (可能波形初次电平不一样吧)

3.2 通用IO引脚

实测引脚复用后,使用引脚置位复位函数无效//GPIO_SetBits()|GPIO_ResetBits(),功能复用相当于一个开关只能单项操作。
在这里插入图片描述
看一些教程上说GPIO上下拉模式设置上拉或下拉默认电平不一样,实测这一段代码执行后IO引脚仍处于没有电平的状态(非0v,非3.3v),最好有需求的话后边手动设置一个置位或复位就好啦
在这里插入图片描述

4 故障排查相关

4.1 可靠调试技巧

一些重要的调试技巧,确保硬件电路是没问题的,我曾经调试一个程序花了几个小时,从顶层逻辑排查到底层IO配置,最终发现是核心板外部电路有问题。准备多块板子对比验证也可。
当问题很久没有排查出来时最好把所有的可能问题列出记录下来一个一个尝试,思路要清晰一点,由大到小,由简到难,
通信端口可以放两个LED用于指示通信,一些工业级的通信模块都是带双向收发指示灯的,这个很棒,出现问题可以看指示灯从而将问题快速定位在外部还是内部。

三、小结尾

前边说的很虚,其实就是最近帮朋友看一个定时器输出PWM的基础问题,我找了半天没给人家解决,不仅啪啪打脸而且引发了一系列调试问题把我陷进去了【泪流满面】,最终我发现我连一个灯都点不起来,沮丧的亚批(可以想象一下一个单片机程序员半夜坐在那里在台灯的照射下对着电脑发呆)。星光不问赶路人,好在最后发现了问题(嘿嘿)。
要多开源记录一些东西帮自己的同时也是帮别人。

四、参考文献

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

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

相关文章

C#制作挂机程序V2.0—刷鼠标单击类在线视频

文章目录 往期内容回顾一、程序界面二、功能说明1.程序已经集成了Microsoft Spy的功能2.通过拖动工具自动获取窗体的Title3.拖动工具自动获取鼠标准备单击点的坐标4.通过时间设置单击事件后等待时间&#xff08;刷视频必备&#xff09;5.浏览器应用程序不再局限于FireFox6.适应…

菜鸡的秋招升级打怪之旅

记录秋招。。。 旷视一面&#xff08;2022.08.12&#xff09; softmax&#xff0c;交叉熵loss实现 import numpy as np import torch import torch.nn.functional as Fdef softmax(logits):logits_exp torch.exp(logits)logits_softmax logits_exp / torch.sum(logits_exp, …

7000字爆肝!我把14个自学编程的压箱底网站全部分享给你们啦

前一段时间&#xff0c;一个初学编程的小伙子跟我说&#xff0c;他一般在某站上找视频自学&#xff0c;但是学了2个多月&#xff0c;刚开始学的知识已经忘得差不多了&#xff0c;现在再继续学下去又听不懂&#xff0c;该怎么办&#xff1f; 经过一夜深思&#xff0c;终于想出了…

给你5分钟白漂:这些都是我的常用在线工具和网站

小伙伴们大家好&#xff0c;本期再托一次家底&#xff0c;和大家分享十几个自己日常工作学习过程中的常用在线工具和网站&#xff0c;希望能有帮助。 也欢迎小伙伴们分享和安利出你们觉得有用的工具&#xff0c;不要停啊。 注&#xff1a;本文 Github开源项目&#xff1a;gith…

吃透OLED显示原理——玩转OLED模块各种使用方法

oled模块有4种工作模式&#xff0c;分别是6800、8080两种并行接口方式、 4线的穿行SPI接口方式、IIC接口方式。通过模块的BS1/BS2设置&#xff08;通过硬件来设置&#xff09;&#xff0c;BS1/BS2的设置与模块接口模式的关系如表所示&#xff1a; 这是其中一种工作方式的模块&…

推荐52个堪称神器的学习网站,每天坚持一小时,让你受益一生【上】

本篇文章分为上下篇&#xff0c;给大家整理了一些终身受益&#xff0c;堪称神器的学习网站&#xff0c;什么行业的学习网站都有&#xff0c;推荐给大家&#xff0c;里面都是满满的干货&#xff0c;我就不过多介绍了&#xff0c;大家自行探索。 社区类 1、GitHub 我就不吭气&…

C++贪吃蛇(控制台版)

C自学精简实践教程 目录(必读) 目录 主要考察 需求 输入文件 运行效果 实现思路 枚举类型 enum class 启动代码 输入文件data.txt 的内容 参考答案 学生实现的效果 主要考察 模块划分 文本文件读取 UI与业务分离 控制台交互 数据抽象 需求 用户输入字母表示方…

炒股的策略方法

炒股的策略方法 炒股常见问题 你炒股的时候有没有遇到这样的问题&#xff1f; &#xff08;1&#xff09;需要时刻盯着大盘和个股的走势&#xff0c;一分心&#xff0c;一走神&#xff0c;就错过了机会&#xff1f;工作时没有时间和精力去看大盘走势和个股的走势&#xff0c;…

国内四大炒股软件APP 全面技术解析

随着人们的焦点逐步由电脑PC端转为手机端之后&#xff0c;国内炒股软件也逐步开始推出手机炒股APP&#xff0c;但是面对如此众多的都以“最牛、最佳”等冠名的APP真的实至名归吗&#xff1f;为了大家不再走弯路&#xff0c;不沉迷智能选股&#xff0c;笔者将近期比较火的几款炒…

炒股知识讲解

炒股知识目录 笔者致读者朋友的话一、炒股基础知识1.什么是股票?2.股票的分类a.第一类b.第二类c.第三类 3.股票市场a.一级市场b.二级市场c.三级市场d.四级市场e.场外交易市场f.二板市场 4.各股票市场的开盘时间中国A股市场开盘时间&#xff1a;中国香港股市开盘时间&#xff1…

鸿蒙策略炒股软件安全么,鸿蒙即将全量开源 引爆国产软件板块!

华为正在全方位加速构建鸿蒙生态。在5月18日举行的HarmonyOS Connect伙伴峰会上&#xff0c;华为正式宣布升级智慧全场景生态战略&#xff0c;对鸿蒙硬件生态伙伴进行“产品渠道运营”全方位赋能。 在上述峰会上&#xff0c;华为消费者业务AI与智慧全场景业务部副总裁杨海松给鸿…

同花顺手机显示切换服务器,手机炒股超人时代到来 手机Level-2功能点评

您可能感兴趣的话题&#xff1a; 同花顺手机炒股3G版 核心提示&#xff1a;手机炒股也能看上证深证level-2数据啦&#xff01;深受股民喜爱的同花顺 (300033) 手机炒股正式推出了手机Level-2版&#xff0c;不但优化并新加了股民用户需求较多的功能&#xff0c;还进一步改善软件…

webassembly009 transformers.js 网页端侧推理

之前试用过两个网页端的神经网络框架&#xff0c;一个是 Tensorflow PlayGround&#xff0c;它相当与实现了一个网页端的简单的训练框架&#xff0c;有关节点的数据结构可看这篇。另一个是onnx的网页端(nodejs绿色免安装try onnx on web(chrome))&#xff0c;需要自己转换onnx模…

2022安全员-A证试题及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022安全员-A证上岗证题库为安全员-A证考试题库新版习题库&#xff01;2022安全员-A证试题及在线模拟考试根据安全员-A证最新教材汇编。安全员-A证考试真题随时根据安全生产模拟考试一点通上提前熟悉考试环境。 1、【…

2022山东省安全员C证复训题库及模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022山东省安全员C证理论题库是山东省安全员C证试卷高频考题覆盖&#xff01;2022山东省安全员C证复训题库及模拟考试依据山东省安全员C证最新教材汇编。山东省安全员C证考试模拟题随时根据安全生产模拟考试一点通上快…

2022安全员-A证考题及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022年安全员-A证上岗证题目系安全员-A证考试模拟题理论知识考试题库&#xff01;2022安全员-A证考题及在线模拟考试依据安全员-A证新版考试题库。安全员-A证复审模拟考试通过安全生产模拟考试一点通上查看全部题库。…

2022年安全员-C证考试练习题及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022年安全员-C证上岗证题目为安全员-C证操作考试题新版教材大纲题库&#xff01;2022年安全员-C证考试练习题及在线模拟考试根据安全员-C证新版教材大纲编写。安全员-C证模拟考试题库随时根据安全生产模拟考试一点通…

2022年安全员-A证考试试题及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022年安全员-A证复训题库系安全员-A证理论题库的多种练习模式&#xff01;2022年安全员-A证考试试题及在线模拟考试根据安全员-A证新版考试题库。安全员-A证操作考试题通过安全生产模拟考试一点通上模拟考试。 1、【…

2022年安全员-C证考试题库及在线模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022安全员-C证复训题库系安全员-C证练习题考前押题&#xff01;2022年安全员-C证考试题库及在线模拟考试根据安全员-C证新版考试题库。安全员-C证考试题目通过安全生产模拟考试一点通智能考场练习。 1、【多选题】《…