爆肝9万字,我已从小白晋升ARM嵌入式工程师!带你从零熟悉常用的M4嵌入式功能,建议收藏(含码源)(1)

简介: 嵌入式系统的定义有很多的说法,但是没有一个定义是全面的,下面给到的两种方法我觉得应该算是比较合理的。

嵌入式简介

嵌入式系统定义

嵌入式系统的定义有很多的说法,但是没有一个定义是全面的,下面给到的两种方法我觉得应该算是比较合理的。

  1. 从技术的角度:嵌入式是以应用为中心,以计算机为基础的、软硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统;
  2. 从系统的角度:嵌入式系统是设计完成复杂功能的硬件和软件,并将它们紧密在一起的计算机系统。

嵌入式系统的实例--我们可以通过汽车控制系统来看:如下图

2345_image_file_copy_3.jpg

嵌入式发展过程

嵌入式微处理器(单板计算机)

  嵌入式微处理器的基础是通用计算机中的CPU,在应用当中,将微处理器装配在专门设计的电路板上面,只用保留下我们和嵌入式应用有关的母版的功能,这样可以大幅度的减小系统的体积和相应的功耗。为了满足嵌入式应用的特殊要求,我们嵌入式微处理器虽然在功能上和标准的微处理器是一样的,但是在工作温度、抗电磁波等等方面一般都做到了和工业控制计算机相比较嵌入式微处理器体积小、重量轻、成本低、可靠性高等优点,嵌入式微处理器以及存储器、总线、外设等安装在一块电路板上面我们成为单板计算机--单片机;但是在电路板上面必须包含ROM、RAM、总线接口、外设接口等期间;从而降低系统的可靠性、技术保密性也比较差,所以现在用的都比较少了。


  嵌入式处理器目前主要有Am186/88、386EX、SC-400、ARM系列等等;嵌入式微处理器又可分为CISC 和RISC两类。大家熟悉的大多数台式PC都是使用CISC微处理器,如Intel的x86。RISC结构体系有两大主流:Silicon Graphics公司(硅谷图形公司)的MIPS技术;ARM公司的Advanced RISC Machines技术。此外,Hitachi(日立公司)也有自己的一套RISC技术SuperH。


嵌入式微处理器的选型原则:

1)调查市场上已有的CPU供应商。2) CPU的处理速度。

3)技术指标。

4)处理器的低功耗。

5)处理器的软件支持工具。

6)处理器是否内置调试工具和处理器供应商是否提供评估板。

2345_image_file_copy_4.jpg

   图1.1 单板计算机

   选择一个嵌入式系统运行所需要的微处理器,在很多时候运算速度并不是最重要的考虑内容,有时候也必须考虑微处理器制造厂商对于该儇处埋器的文持态度,有些嵌入式系统产品一用就是几十年,如果过了五六年之后需要维修,却已经找不到该种微处理器的话,势必全部产品都要淘汰,所以许多专门生产嵌入式系统微处理器的厂商,都会为嵌入式系统的微处理器留下足够的库存或是生产线,即使过好几年之后还可以找到相同型号的微处理器或者完全兼容的替代品。

2345_image_file_copy_5.jpg    

图示为:嵌入式微控制器(左)和微控制器芯片内部图

   我们对上图进行一下解读,嵌入式微控制器我们又称为单片机,他已经将我们整一个计算机系统集成到一块芯片上面了。


  嵌入式微控制器一般以某一 种微处理器内核为核心,芯片内部集成ROM/EPROM、RAM、 总线、总线逻辑、定时/计数器、WatchDog、 I/O、 串行口、脉宽调制输出、A/D、 D/A、 Flash RAM、EEPROM 等各种必要功能和外设。为适应不同的应用需求,-般- 个 系列的 单片机具有多种衍生产品, 每种衍生产品的处理器内核都是一样的,不同的是存储器和外设的配置及封装。这样可以使单片机最大限度和应用需求相匹配,功能不多不少,从而减少功耗和成本。

  和嵌入式微处理器相比,微控制器的最大特点是单片化,体积大大减小,从而使功耗和成本下降、可靠性提高。微控制器是目前嵌入式系统工业的主流。微控制器的片上外设资源一般比较丰富, 适合于控制,因此称微控制器。嵌入式微控制器 目前的品种和数量最多,比较有代表性的通用系列包括8051、P51XA、MCS -251、MCS- -96/196/296、C166/167、MC68HC05/11/12/16、 68300、数目众多ARM芯片等。目前MCU占嵌入式系统约70%的市场份额。


  当然,由于技术有限,目前能想到的,能查到的知识点只有那么一些,向更加深入了解的读者们可以到相关的网站、书籍以及视频课等等执查阅!

STM32F40x最小系统

概念:什么是最小系统? 最小系统指的是:能够让MCU工作的最小组成单位;结构:片内/片上外设、板上外设;我们可以看一下开发板的板上外设:

结构:片内/片上外设、板上外设;

2345_image_file_copy_6.jpg

大致如上:特殊单元有如右边的复位电路、震荡电路,称为板上电路。加上片上外设,组成芯片。

最小系统组成需要哪些部分?

  1. 电源部分:当前使用的芯片采用的是COMS电平(3.3V供电);
  2. 振荡电路:能够让MCU工作心跳产生起来的电路。一般这样的电路存在有很多种,比如RC振荡器、晶振等等;
  3. 2345_image_file_copy_7.jpg
  4. 复位电路: 概念--能够让MCU重新从main函数开始执行的电路;一般这样的复位电路可以分成很多种:比如软硬件复位、看门狗(WDG)复位等等;主要要掌握的是硬件复位:板上外设能够让MCU复位的电路。比如:你的板子卡住了,就需要一个按键进行板子的复位重新开始工作,这样的电路,就成为硬件复位。例如:重启键,下图为复位电路示例图

2345_image_file_copy_8.jpg

4. 启动方式:STM32F40x芯片启动的方式有很多种,可以根据自己的需要进行选择;

2345_image_file_copy_9.jpg

解释:当BOOT1:BOOT0为X 0的时候,这时候的启动方式为 从主Flash启动,MUC可以正常执行工作;


         当BOOT1:BOOT0为0 1的时候,这时候的启动方式为 从系统存储器启动,但是程序可以进行烧录,但是不能执行;


         当BOOT1:BOOT0为1 1的时候,这时候的启动方式为 从嵌入式SRAM启动,且程序可以进行烧录和进行代码执行;但是按下复位键的时候,程序不会执行,代码会丢失,因为当你按下复位键的时候,电源就会断电,因此代码程序也会跟着丢失。


因此,该芯片(STM32F407ZGT6为例,系列芯片差不多)最好用的是X0的方式进行启动。当然,当程序下载有某种错误无法操作的时候,可以进行启动方式的调整,这样后面就可以进行下载烧录了。

1、搭建开发环境

1.开发说明

 我们开发一个功能首先第一步就是写各种各样不同模块的程序,但是在写程序模块之前,我们要的是搭建一个编程的开发的开发环境,我们要安装的开发的软件编程环境就是我们的keil5这个编程软件。跟着我的脚步,我们一步步的安装这个编程软件。

2345_image_file_copy_10.jpg

这个文件包大家可以到STM32官网上面自行下载,也不大就100来M,我们可以看到上面,“芯片支持包”,里面包含使用的是我们的芯片,一个工程要搭建起来 一定所需的就是问我们的芯片包。最下面的两个是我们下载的驱动,一个可以支持win7、win0系统。大家可以根据自己的电脑的配置自行选择下载,这一些资源后续有需要的可以私聊,需要什么都会进行分享,或者大家可以自行到官网下载,这样更加直接了当。

1.1软件安装

2345_image_file_copy_11.jpg

我们上述的软件安装包进行到这里,我们直接双击点击MDK进行运行安装,然后就会出现到一下的这个界面,然后接着我们点击next就好了。

2345_image_file_copy_12.jpg

下一步,我们勾上“同意”,再接着next就好了;

2345_image_file_copy_13.jpg

接下来出现的界面是要我们安装的地方,大家执自行安装到自己想要存放的位置就可以了,最好不要安装到系统盘,也最好不用使用中文、不要有空格,因为中文空格有时候会出现错误,当然出现的几率很小,但是我们还是严谨一点为好。

2345_image_file_copy_14.jpg

接下来就到这个界面,里面的参数我们可以随意修改,但是还是不要有中文;

2345_image_file_copy_15.jpg

到这里后就next,然后就可以进行到安装软件了;

2345_image_file_copy_16.jpg

接下里会出现一个这样的界面,我们需要的是要把这个选项勾选上的去掉,因为如果你选择他的话,它就会自动帮你运行工程;

2345_image_file_copy_17.jpg

下载安装完成之后,我们就会看到电脑自动弹出这样的一个界面,我们不需要理会,也不需要任何的操作,直接关掉就好了,因为我们这个步骤没有什么东西需要我们进行改动的,然后我们的软件就安装完毕了;

2345_image_file_copy_18.jpg

然后我们就可以在我们的桌面上看到我们的软件的图标,表示安装已经全部完成;

2345_image_file_copy_19.jpg

2. 软件注册

在我们刚刚的文件夹下面我们找到这个注册机,我们直接双击进行运行注册;

2345_image_file_copy_20.jpg

接下来我们右键 单击我们刚刚下载的keil5软件,然后以“管理员身份运行”;

2345_image_file_copy_21.jpg

然后我们到keil5里面在我们的file这一栏我们点击选择“license”这一栏,

2345_image_file_copy_22.jpg

点击之后我们机会进到下面这个界面,这个是我们的软件注册的界面;

2345_image_file_copy_23.jpg

然后下面的注册机上面的操作大家按照下面图示的步骤操作就可以了,这里图示比文字更加的详细;

2345_image_file_copy_24.jpg

到这个地方,我们的软件的安装加上我们注册机的注册就完成了;

2345_image_file_copy_25.jpg

3.安装相应的芯片包

改该文章我们使用的是stm32F407ZGT6,我们就要安装相对应的芯片包,(第一个是F4系列的,第二个是完整的芯片包)

2345_image_file_copy_26.jpg

我们的第一步就是直接运行我们的Keli.STM32F4xx_DFP.2.7.0这个包,然后我们就可以看到下面的这个界面;

2345_image_file_copy_27.jpg

在我们等待一段时间之后就会出现这样的一个界面,我们不需要进行任何的操作,我们直接next就好了,下一步,就会进行我们芯片包的安装,我们只需要等待下载完成就好了;如下图所示

2345_image_file_copy_28.jpg

4.安装下载器驱动

因为我们写好代码,我们要需要将代码烧录到我们的板子,所以我们需要安装一个可以下载的驱动,我们这里用的是ST-Link,我们可以根据自己的系统进行下载不同的驱动;

2345_image_file_copy_29.jpg

我们这一篇文章我们使用的是win10,所以这里就使用win10,如下图,我们点击的是win19的驱动,我们就会就会进入到我们这样的一个界面;

2345_image_file_copy_30.jpg

接着我们就会弹出这样的一个界面;

2345_image_file_copy_31.jpg

我们只需要点击next就可以了;

2345_image_file_copy_32.jpg

当出现这样的一个界面,这样就驱动安装完成。路径全部都选择默认的路径,不需要进行任何操作,下一步,我们怎么检查是否安装成功呢,我们电脑脸上ST-Link,打开我们的设备管理器,出现这样的,那么我们这个工程的前期工作就表示安装成功了。

2345_image_file_copy_33.jpg

当然不代表这样就成功了,只有驱动的灯不闪烁,才算是安装成功,灯颜色固定为红色,不闪烁即可。

这一个安装的步骤都是博主往期的博客,大家想看简单的,可以网页进行搜索就好了。相关的链接如下:本文链接:【Cortex-M4】学习 Day1 搭建开发环境_丘比特惩罚陆的博客-CSDN博客

2、GPIO实验

2.1GPIO概述

   GPIO接口指的是通用输入/输出接口。通俗的讲,那就是芯片的引脚,可以通过他们输入高电平或者低电平,也可以通过读入他们的引脚的电平状态--到底是高还是低电平。GPIO口:简单而言,就是芯片用来控制或者采集外部器件的相关信息,这个又可以称之为输入输出的端口。


  那GPIO的作用是什么呢?是芯片用来感知外部世界并且用来控制外部世界的媒介;


在我们的STM32中,GPIO口一共有114个,而且这114个GPIO口以分组的形式存在,如下图所示:我们由这个芯片内部结构框架这个图(STM32F407xx),我们可以知道GPIO口,会按照分组的形式存在。


 如下图,分别可以从GPIOA到GPIOI口,但是上述的结构框架图是F407系列的,现在记笔记的芯片为STM32F407ZGTx芯片,所以上述的分组没有那么多,只含有分配到从GPIOA--GPIOG一共7组,每一组16个IO口,可以如上结构框架图可以知道从0口--15口,一共十六个,所以一共总得GPIO口一共是112个。

2345_image_file_copy_34.jpg

           STM32F407ZGT6芯片

2345_image_file_copy_35.jpg

还有两个分别是,我们可以从电路图可以找到,因为这两个IO口比较特殊,不用我们直接操作的,所以可以不算到结构图当中来,我们可以了解一下,分别如下:

2345_image_file_copy_36.jpg

另一个也是在CPU右边,这个IO口是电池管理。

2345_image_file_copy_37.jpg

扩展比较一下,相比于STM32,我们的51单片机的IO口也是按照分组的形式存在的,分别从P0-P3组,而且每一组IO口都有8个口,分别由P0.0-P0.7.

2345_image_file_copy_38.jpg

2.2 GPIO的主要特征

  1. 受控IO口多达十六个,每一组有16个IO口;
  2. 输出状态:推挽或者开漏+上拉或下拉
  3. 从输出数据寄存器(GPIOx_ODR)或外设(复用功能输出)输出数据;
  4. 可以为每一个IO选择不同的速度;
  5. 输入状态:浮空、上下拉、模拟输入(数模转换器);
  6. 将数据输入到输入数据寄存器(GPIOx_ODR)或外设(复用功能输入)(这里简单而言,我们采集外面的信息,放到哪里去,就是我们的输入数据寄存器中)
  7. 置位或者复位寄存器(GPIOx_BSRR),对GPIOx_ODR具有按位写权限;
  8. 锁定机制(GPIOx_LCKR),可冻结IO配置(这些简单理解就是比如我们用引脚控制灯,我们就是只用一个引脚就可以了,后面不用改变这个引脚,然后我们就可以将这个引脚改成冻结配置模式,好处就是我们不小心碰了一个引脚转态,这个冻结就可以帮我们锁定,不然固定功能因此改变)
  9. 含有模拟功能;
  10. 复用功能输入/输出选择寄存器(一个IO口最多可以有十六个复用功能,和51不一样,我们每一个IO口都有复用功能)(这里简单理解就是我们所谓的复用就是除了GPIO我们还有很多的很多,如下图所示,TIMx、SPI等等)
  11. 快速翻转,每次翻转最多只需要两个时钟周期;
  12. 引脚复用非常灵活,允许将IO引脚用作GPIO或多种外设功能中的一种;

2345_image_file_copy_39.jpg

我们和我们的51单片机相互比较一样,就会发现和51的IO口不一样,我们下图图示比较一下:

2345_image_file_copy_40.jpg

如上圈起来的解释,51单片机这个P3只有P3.0和RxD这两个功能,所以我们的STM32的GPIO口用起来更加的灵活。

2.3 变量和寄存器

我们说一下这两个不同以及相同的地方,二者相同的地方:变量和寄存器一样都是向内存申请了存储的空间,可以存储数据,并且还有相应的地址;

二者存在差异的地方:变量的地址是随时变化的,但是寄存器的地址是不变的,简单说,寄存器的地址已经被我们的芯片给固定好了。

例如:

2345_image_file_copy_41.jpg

  变量我们用一个个小的(右下角)方框表示,让后这个变量是可以改变的,可以进行左移右移等操作,但是我们的寄存器,寄存器相当于变量,变量就会有变量名,变量名就有地址,只不过我们的寄存器的地址是固定的(如上我们设置成0x32),所以0x32就是我们寄存器的名字。

2.4 GPIO实验(按键点亮LED灯)

 我们通过下面的电路图,我们可以看到四个灯的引脚分别是PF9、PF10、PF6、PC0,我们直接进行宏定义这一些引脚就可以了,默认为高电平,电平低点亮;

2345_image_file_copy_42.jpg

进行灯的宏定义:(这里直接在我们的main.c进行宏定义)

#define led1 PFout(9)
#define led2 PFout(10)
#define led3 PFout(6)
#define led4 PCout(0)

然后我们再看看我们的按键;


2345_image_file_copy_43.jpg

有这个图我们直接可以在我们的main.c进行按键的宏定义就可以了;

#define key1 PAin(0)
#define key2 PEin(2)
#define key3 PEin(3)
#define key4 PEin(4)

LED.c

新建一个文件,我们命名为main.c 来配置我们灯的初始化 LED_Init,然后我们进行相应的配置就好了;

#include "led.h"            
void LED_Init(void)
{
  GPIO_InitTypeDef led;
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);  //使能GPIOC
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);  //使能GPIOC
  led.GPIO_Mode=GPIO_Mode_OUT;   //输出
  led.GPIO_OType=GPIO_OType_PP;  //推挽
  led.GPIO_Pin=GPIO_Pin_0;    //引脚
  led.GPIO_PuPd=GPIO_PuPd_UP;   //上拉
  led.GPIO_Speed=GPIO_Speed_100MHz;
  GPIO_Init(GPIOC,&led);
  led.GPIO_Mode=GPIO_Mode_OUT;   //输出
  led.GPIO_OType=GPIO_OType_PP;  //推挽
  led.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_9|GPIO_Pin_10; //引脚6/9/10
  led.GPIO_PuPd=GPIO_PuPd_UP;   //上拉
  led.GPIO_Speed=GPIO_Speed_100MHz;
  GPIO_Init(GPIOF,&led);
  GPIO_SetBits(GPIOC, GPIO_Pin_0);  //给到高电平,因为我们前面说了电路为低电平点亮
  GPIO_SetBits(GPIOF, GPIO_Pin_6|GPIO_Pin_9|GPIO_Pin_10);
}

Key.c  操作还是跟上面的,配置相应的时钟、功能等等;不过多的介绍,因为往期的博客已经有,而且这个东西相对的简单,就不讲了!

然后我们在函数进行调用就可以了!如下图:

2345_image_file_copy_44.jpg

这样我们的一个按键点亮我们LED灯的小实验就可以完成了,相关的项目文件夹后面有需要的话可以私聊!

相关文章
|
1月前
|
数据处理
基于ARM的嵌入式原理与应用:ALU的功能与特点
基于ARM的嵌入式原理与应用:ALU的功能与特点
|
5月前
|
存储 Ubuntu 编译器
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)
|
5月前
|
Ubuntu Unix Linux
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(一)
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(一)
|
5月前
|
Linux 编译器 语音技术
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(二)
合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(二)
|
4月前
|
机器学习/深度学习 人工智能 计算机视觉
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
|
1月前
|
编解码 弹性计算 应用服务中间件
阿里云服务器Arm计算架构解析:Arm计算架构云服务器租用收费标准价格参考
阿里云服务器架构分为X86计算、Arm计算、高性能计算等多种架构,其中Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将深入解析阿里云Arm计算架构云服务器的技术特点、适用场景以及包年包月与按量付费的收费标准与最新活动价格情况,以供选择参考。
|
1月前
|
存储 Docker 容器
ARM架构鲲鹏主机BClinux离线安装docker步骤
下载并安装适用于ARM架构的Docker CE二进制文件,解压后移动至/usr/bin目录。创建docker组,配置systemd服务脚本(docker.service、docker.socket、containerd.service),重载systemd配置,启动并启用docker服务。编辑daemon.json配置存储驱动、镜像加速地址等,最后拉取所需镜像。
44 0
|
1月前
|
NoSQL MongoDB Docker
求助,有没有大神可以找到arm64架构下mongodb的3.6.8版本的docker镜像?
在Docker Hub受限的情况下,寻求适用于ARM架构的docker镜像资源或拉取链接,以便在x86架构上获取;内网中的机器为ARM架构,因此优先请求适合ARM的Docker镜像或Dockerfile,非常感激您的帮助。
|
3月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
109 3
|
2月前
ARM64架构提供的Cache操作
ARM64架构提供的Cache操作