STM32的学习记录--单个模块开发思路

1. 前言

很久没写STM32的学习博客了,不是因为没在搞,而且因为STM32要学习的部分太多,而且代码量太大了,有些代码还涉及到版权问题,就一直没写,最近刚好在搞一个智能设备有关WiFi模块的开发,大概总结一下,在STM32中,单个模块的开发思路。因为我也是一个新手,可能有些部分说的并不正确,请大家不吝请教。为了尽可能不涉及到版权问题,本博客所有资料均来自网络,如有侵权请联系我删除!

本博客原创,转载请注明!!!

本文链接
个人博客:https://ronglin.fun/?p=92
PDF链接:见博客网站
CSDN: https://blog.csdn.net/RongLin02/article/details/115600952

2. 硬件

2.1. 供电分析

因为是单个模块的开发,所以就用现成已经写好的系统框架,通常来说厂家会有配套代码的,这里主要是STM32F4系列厂家自带的框架,和部分从网上copy下来,用于针脚、串口初始化的部分代码。这一部分涉及到硬件部分,也是对于入门者而言比较复杂的部分,总而言之,目的就是让单片机上的STM32F4芯片给要添加的模块供电和供时钟信号。
举一个例子,这是我随便从网上查到的STM32F4的一个原理图(如有侵权请联系我删除),图很糊,大致看一下就行,可以看到黄色区域上标注了每一个针脚的序号,而针脚上标注了这个针脚实现了什么功能或者说这个针脚连接了什么模块。
在这里插入图片描述
有的模块还需要额外配套一个供电模块,STM32给供电模块供电,供电模块给功能模块供电。
随便从网上找一张ESP模块的原理图(如有侵权请联系我删除)
在这里插入图片描述
我们一般只需要关注两个部分,第一个就是绿色区域部分,也就是Vcc供电和控制端部分,看是什么控制ESP模块的开启,这里图是直接连接了高电平,有的时候是一个供电模块;第二个需要注意的就是右侧粉红色部分,也就是TXD和RXD,分别对应发送和接受端,上图是接到了一个叫“串口TTL”上,一般在STM32中,也是接到一个独立的串口里。
这样就很清楚了,回到我们的目的,我们是想让STM32控制一个单独的模块,那就在STM32中选择一个针脚,让这个针脚连接这个模块(或者是这个模块的供电模块),然后我们在代码里,通过控制STM32的那个针脚就可以实现给这个模块的上电和断电。

2.2. 模块初始化

仅仅控制上电还不行,还需要指定一些参数,告诉模块要按照什么参数来工作,,这里贴出来一部分从网上找的“正点原子”写的有关GPIO的初始化代码,仅用于学习,如有侵权,请联系我删除。

      //设置高电平
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO,ENABLE);	//打开GPIO口时钟
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//开时钟
	//初始化化13针脚,并设置为高电平(即开启模块)
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//50MHz
	GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
	GPIO_SetBits(GPIOB,GPIO_Pin_13);//一直上电

这段代码很复杂,涉及到的知识点很多,我这里不展开说明,想要详细了解的话请自行翻阅相关资料!我就简单的说明一下这段代码干了什么,首先是一个GPIO的复杂结构体,这个结构体负责STM32的引脚,代码里开启了13针脚,在原理图中,13针脚可能就是选择好要控制模块的针脚。初始化STM32的针脚,同时设置模块的一些工作参数,大概这就是一个模块初始化要干的事情。

3. 代码

分析完硬件之后,就要开始开发模块,嵌入式开发一般用的C语言,而且涉及到很多宏定义、指针、位运算等C语言语法,要想熟练的开发模块,对C语言要十分熟悉,虽然是嵌入式,涉及到很多硬件,同时开发中,对于代码实现能力的要求也是有一定门槛的。我这里就简单的提几个在开发过程中嵌入式代码的“特色”吧,仅仅是我个人学习过程中遇到的,并没有什么系统理论,如有错误请以教科书为准。

3.1. 无限循环

一般来说,一个单片机,上电之后,我们希望它一直工作,除非断电,所以体现在代码中就是while(1)的无限循环。在main()函数里,前面部分就是各个模块的初始化,一些变量的声明等等,然后就是一个while(1),用来实现CPU一直工作。基本上一个模块的主要功能就是在这个while(1)中执行,这就引出来设计模块的一个思想:状态。
因为是while(1),我们需要给模块设计多个状态,在不同的功能需求下,有不同的状态用来与其对应,举一个简单的例子,假如模块遇到了一些不可预料的错误,就可以把模块的状态切换为重启状态,然后从头开始。在我接触的STM32开发中,用状态控制单个模块的做法是十分好用的。

3.2. 延迟问题

因为是硬件,数据的处理是存在时间问题的,对于串口来说,一个明显的参数就是波特率。CPU处理速度很快很快,但是一些模块的反应速度可能远远慢于CPU,CPU发出命令后,模块可能过了几毫秒才给出回应,但是CPU速度很快,程序不能阻塞在这里等待它回应。这也是嵌入式开发过程中的一个设计点,不能让单个模块的代码执行占用太长CPU,如果阻塞太长时间,会影响其他模块的工作。最近刚好开始学操作系统,打一个不太恰当的比方,在操纵系统中,CPU也是一直在工作,同时操作系统用来负责CPU对于每一个任务的调度,根据调度算法,CPU可以根据硬件情况和用户需求,来“智能”的处理好何时应该运行哪一部分的代码。单片机也是一个小规模的操作系统,但是它没有那么智能的算法,当然也可能是它的硬件也没办法让它这么智能。这样的话,在while(1)中,也就是按照代码顺序来执行模块,每一个模块占用多长时间CPU完全取决于模块代码的执行时间。所以说在设计中,单个模块的代码不能占用太长时间的CPU,这样会影响其他模块的运行。

4. 总结

写着写着发现自己思维变乱了,越写越不知道要说什么,主要还是STM32中要考虑的因素太多了,很多东西我自己知道怎么回事,但是因为语言能力表达有限,写出来可能有些云里雾里,还有很多概念也是有些一知半解,再加上本人做STM32的项目也不是很多,能力有限,本人是先上手项目,并没有系统的学习过嵌入式开发,如有错误,希望大家能多多指点。其实最好还是买一块STM32电路板自己上手玩一次,这是我个人认为学习STM32最快的方法。最后,本博客原创,转载请注明,本博客所有资料均来自网络,如有侵权请联系我删除!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值