物联网感知层的主要控制多为单片机。
51 个微控制器内核是免费的。电容式触摸IC(带CPU)、Wifi芯片(ESP8266)、LoRa无线通信IC等专用SoC均使用51核。
开发板选择(普中科技):通过开发板学习需要软硬件的结合。
制作开发板涉及采购、供应链等,单个生产不可靠。
所需的基础:编程和电气基础知识、英语、计算机基础知识、兴趣、时间。
微控制器和嵌入式之间的区别
CPU差异:是否存在MMU,即虚拟地址映射。
操作系统区别:实时操作系统、Linux操作系统。
应用领域的差异:低端和中高端,低性能与中高性能。
单片机是一种低级嵌入式器件,嵌入式是单片机的先进延伸和必然趋势。
微控制器和物联网的区别
物联网的三层架构:
实施自下而上、自上而下的双路径。
微控制器是物联网感知层的核心。
相关概念
:
单片机的定义:它属于计算机的一类。
组成如下:
框图如下:
中间部分是CPU模块,其他部分对应相应的外围模块。
单片机的ROM和RAM工作原理
单片机频率
外设与内部外设
内部外设:GPIO控制器、串口控制器、中断控制器等
外部外设:目前微控制器中没有集成电路模块。
电路板(PCB板)。
PCB板=基板(绝缘,玻璃纤维)+印刷电路
单层板、双面板、四层板、六层板等,一般在覆铜层顶部刷上一层绝缘油墨,避免与外界氧化或导电。
用途:硬件电路的架构和连接,载体。
硬件和软件
硬件比较吃经验。电路板是一种产品,处于低端。20%
软件偏向于思维和逻辑。该产品是一个代码,属于高端。80%
你需要知道一些硬件才能编程,以软件为主线,学习硬件附加。
硬件
岗位职责:
软件
岗位职责:
初级:协助测试、编写代码和维护
中级:独立工作,对产品负责,调整bug
高级:需求分析、框架设计、团队管理
学习基础知识(知识和能力),找工作,学习和锻炼,中级,高级/改变方向
开发工具
万用表
焊接套件
Keil 软件
MCU分类
51 微控制器由英特尔设计并诞生,C8051 内核,8 位微控制器。
热门:宏晶STC51系列单片机。
趋势:
主频越来越高,内部外设也越来越复杂。
ROM 和 RAM 越来越大。
集成其他模块以形成专用 SOC。 包括通用和专用微控制器。
STC MCU系列特点
1T单片机(高性能51单片机):12MHz分频为1MHz(6个时钟周期,12个时钟周期)。
ISP/IAP支持,系统在线编程/在线编程。方便程序烧录升级,不再需要使用烧录机,直接通过USB口在开发板上进行程序烧录。
51、单片机硬件平台
选择 51 种微控制器:STM89C52、8K ROM、512 字节 RAM
普中科技 51 MCU A2 套件。
外围电路标准C语言和Keil C51 C语言
标准 C 语言独立于各种其他应用程序的编程语言,并且是通用的。
Keil C51 是一种标准 C 语言。
程序开发过程
源代码编写
编译和生成可执行程序
灼烧痛
仿真器和 ISP
仿真器用于代替微控制器进行仿真,这是非常昂贵的。后来升级到调试器。
最小的系统
最小的开销,能够工作。
二进制和 IO 端口
位 (b) 和字节 (byte:一个字节等于 8 位
微控制器的 IO 在物理上由微控制器的引脚表示。
51 MCU软件开发 MCU编程一般步骤
原理图分析
芯片数据手册读取
自来水灯
分析:单片机P2输出高电平时LED熄灭,输出低电平LED亮起。
复制模板项目文件并修改组名
右键单击管理组以输入下图:
确认。
修改项目输出属性:
点亮 LED 的核心代码:
P2=0x00; //将P2端口写满为0,即可点亮8个LED。
使用微控制器向导软件生成此延迟函数:
软件配置如下:
实际延时功能为100ms。
按钮输入
按钮:用于用户与 CPU 交互。
处理方式:轮询(CPU每短时间检查一次按键是否被按下,效率低)、中断(效率高)。
按键连接:独立按键和矩阵键盘
原理图分析
分析:当单片机P3口连接的按键引脚被读取到低电平时,表示按钮已被按下,否则未按下。
检测是否按下 P3.3 按钮,如果按下,LED 灯状态反转。
复制模板项目文件,并使用运行灯实验修改组名:方法。
定时器/计数器
SOC 的内部外设。
计时器是CPU的“闹钟”。
计时器是使用计数实现的。
可以计算外部脉冲的数量。
设置时钟源(内部脉冲源,用于计数的脉冲),定时时间等于脉冲时间*脉冲数。
设置计时器时间(计数次数)。
打开计时器。
设置中断处理程序。
计时器计数时,生成中断,CPU 在收到中断信号后执行中断处理程序。
MCU学习内容:CPU和各种内部外设。
这
各种内部外设的编程接口是寄存器。
熟悉微控制器就是熟悉其寄存器。
微控制器越复杂,相应的寄存器就越复杂。
MSB:最重要的一点。
LSB:最低有效位,表示二进制数中的最低有效位。
相关寄存器:
每个寄存器及其相关位的详细说明可在数据手册中找到。
使用计时器定时 LED 灯闪烁:
代码编写:
复制模板项目文件,并使用运行灯实验修改组名:方法。
分析:定时为0.5s,CPU在定时器定时期间也可以做主任务,定时时间会产生中断,在中断处理功能中会改变LED灯状态。
在12T模式下,时钟频率为1MHz,时钟周期为1us。最大定时时间为65535(16位定时器),即最大定位时间为65535*1us=65535us=65.535ms。
如果需要 500 毫秒,则重复计时,然后累积。
计算 TH0 和 TL0:(51 个微控制器是加法计数器)。
固定时间为10ms
在12T模式下,外部晶振为11.0592MHz,则实际周期为1/(11.0592MHz/12),即计数一次所消耗的时间。
计数次数为 10 ms/(1/(11.0592 MHz/12))) = 9216,计算使用 9215
TL0 = (65535-9615) % 256 = 0x00;
TH0 = (65535-9615) / 256 = 0xDC;
串行通信
Simplex:同时只能单方面发送或接收
半双工:一方可以同时发送或接收
全双工:同时,一方可以发送和接收
1.简单的工作
数据只单向传输,无法实现双方之间的通信。
栗子:电视、收音机。
二、半双工
数据允许双向传输,但数据只能同时向一个方向传输,这实际上是一个单工开关。
栗子:对讲机。
3.全双工
允许在两个方向上同时传输数据。
栗子:手机电话。
串行通信相关概念:
数据以轮换模式发送,以中断模式接收。
注意:对于串口的四种工作模式,只需要使用工作模式1。 8 位 UART,波特率可变模式。
忽略其他三种工作模式。
查询模式处理串口发送的数据:CPU不知道串口何时完成数据发送,因此CPU需要一直工作在串口上,效率低下。
中断模式:串口发送数据后,硬件会自动标记TI位置1,CPU在收到中断信号后执行相关的中断处理程序。
注意:通常,您可以使用轮询方法发送数据,并使用中断方法接收数据。
复制模板项目文件并修改组名
该软件生成的代码如下:
#include
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xF4;
TL1 = TH1;
PCON = 0x80;
EA = 1;
ES = 1;
TR1 = 1;
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void main(void)
{
InitUART();
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
//add your code here!
}
else
TI = 0;
}
实际使用的程序:
实验结果:
RS485
STM32调试接口:
JTAG系列
SWG公司
常用调试器:
JLINK公司
STLINK公司
STM32编程:
1.寄存器操作:容易出错,过于注重细节。
2、标准库:提供多种标准外设驱动库。
2. HAL库开发:集成各种第三方库。只需配置它。
存储器和 I/O 编码在同一地址中,这些寄存器的操作方式与存储器相同。
STM32的内存映像
上电复位以初始化 GPIO 和其他状态。
数据总线为 32 位,地址线为 32 位。
逻辑地址(理论上可访问的地址)、实际地址(实际可访问的地址)。
存储器和 I/O 的寻址是统一的,I/O 的操作方式与存储器相同。
内部外设的地址从 0x开始。
参考手册给出了内部外设的内存图像。
STM32的位段操作:地址映射
别名存储:Word(32 位)。
映射
位存储桶存储:位
别名存储和段存储是内存中的两个位置。
位段操作是否有原因?
51 个 MCU 支持位操作。STM32本身不支持位运算,只支持32位、8位、16位运算,所以发明了这个运算。将一个位映射到其他 32 位,操作 32 位等同于操作该位。
别名内存区域大小是位带内存区域大小的 32 倍。
STM32 引导模式
三种启动模式:
ISP:系统中的编程。在微控制器运行期间可以烧毁程序。PC 通过串行端口直接将 bin/hex 文件发送到微控制器闪存。
IAP:应用内编程。在线升级功能。自己更新自己。
电源管理系统(PWR)。
CPU 休眠状态:CPU 停止,外设运行,唤醒源全部中断。
CPU停止状态:CPU停止、时钟停止、外设停止,只有SRAM和寄存器保持其原始值,唤醒源为外部中断。
待机模式:CPU停止、时钟停止、外设停止、SRAM和寄存器停止,相当于断电,只有备用电路和备用寄存器工作,唤醒源为IWDG中断等。
复位和时钟
在系统启动开始时,使用内部时钟,并在完成一些初始化后打开外部时钟。
上电复位:执行复位中断功能。
时钟源:时钟产生源,纯内部,内部外部,纯外部
PLL:锁相环电路,功能为倍频。
时钟通道和流向,分频器
完全独立的多个时钟
完全独立的多个时钟。
当系统通电时,默认时钟关闭。 使用内部时钟。
ISP自动下载:不推荐。
GPIO控制LED原理图分析
分析:总共可以控制2个LED,PF9控制LED0,PF10控制LED1。如果输出低电平,LED 将亮起。
编程思路:配置PF9和PF10作为输出,输出电平可以低点亮LED。
MDK4项目成立
创建项目模板:
选择开发板芯片:
关掉:
该项目已建立并完成:
修改 keil 字体大小:
将编码设置为 UTF8:
启动代码
这
从 CPU 重置执行的第一条指令是 main 函数开始执行之前的代码。该代码涉及 CPU 架构、CPU 运行时环境、编译器环境等。
不同 CPU 的起始代码不同。
相关寄存器
GPIOF的
地址:
模式寄存器:GPIOF_MODER偏移量:0x00实际地址:0x4002 1400
输出类型寄存器: GPIOF_OTYPER 偏移量: 0x04 实际地址: 0x4002 1404
输出速度寄存器: GPIOF_OSPEEDR 偏移: 0x08 实际地址: 0x4002 1408
输出上拉寄存器:GPIOF_PUPDR偏移:0x0C 实际地址:0x4002 140C
输出数据寄存器:GPIOF_ODR偏移量:0x14物理地址:0x4002 1414
位复位/偏移寄存器:GPIOF_BSRR偏移:0x18物理地址:0x4002 1418
C 语言操作寄存器
ARM 针对内存和 Io 统一寻址。C 通过操纵这些地址来操纵寄存器。
模式寄存器配置
配置 GPIOF9 和 GPIOF10 作为输出模式:
即0X500。
输出上拉寄存器
将 GPIOF9 和 GPIOF10 配置为输出上拉
即0X500。
输出数据寄存器
将 GPIOF9 配置为 GPIOF10 作为高电平输出:
即0X600。
调试器配置
注意:此选项需要删除,否则下载程序后将无法自动重置操作。
下载后,我发现没有任何现象。原因是时钟模块未打开。
时钟驱动器移植
由于时钟模块相对复杂,从0开始容易出现错误,需要注意多个寄存器的细节。因此,对于此类问题,一般采用移植方法。根据其他人的代码进行更改。
这里的选择是忽略这种时钟驱动的写入。
修改项目模板组的名称
获取此板芯片的启动代码:
将以下中文部分复制到项目目录下:
添加到项目结构:
添加头文件包含:
时钟相关寄存器
碾 压 混凝土:
地址: 0x4002 3800
AHB1 外设时钟使能寄存器:AHB1 外设时钟使能寄存器
实际地址为:0x4002 3830
引入标准外设库是一种传统的微控制器软件开发方法
芯片制造商提供数据手册和参考手册、示例代码和开发环境。
微控制器的软件工程师查阅参考手册以开发产品功能。
调试各种外设,但实现产品功能。
外设库是芯片公司提供的示例代码的标准化产品。
创建 SI 项目
标准库文件结构:
CMSIS:与ARM内核相关的东西(CPU本身)。
STM32F4xx_StdPeriph_Driver:与内部外设相关的驱动程序
分析:在学习过程中,一次执行一个模块的代码分析。
使用结构访问内存。结构指针。
碾压混凝土模块分析
.c 文件和 .h 文件都有宏定义。
.c 文件中定义的宏定义仅由 C 文件使用,而不由其他文件使用。.h 文件中定义的宏定义不仅可以在相应的 .c 文件中使用,还可以在其他文件中使用。
断言:用于确定参数是否可用。
HAL 库开发 创建 cubemx 项目
配置页面如下
:
配置 LED 引脚 GPIOF9 和 GPIOF10:
配置输出模式:
时钟配置:
使用的默认配置是使用内部提供的 16MHz:
现在需要将其配置为使用外部晶体振荡器来产生最大工作频率:
生成的时钟配置:
项目配置:
其他配置仍为默认配置。
生成 MDK 代码
使用 MDK 打开项目:
生成的项目结构如下:
编译项目:
下载: 注意:您只需要按如下方式进行设置。
串口实验
F4 开发板原理图分析:
使用串口 1
生成代码:
配置串口接收中断:
RS485(RS422)通讯
RS232通讯距离不大于15m。
远距离传输要求:
提高电压标准,提供通信线路抗扰度,降低阻抗,并使用差分信号。
串行通信常用的波特率为:9600 和 115200。
RS485的最大通讯距离为1200M,最快通讯速度为10Mps,与距离和速度成反比。
差分信号负逻辑。
可以为更长的距离添加中继。
半双工通信。
RS485仅提供物理层通信能力,不提供数据层协议,需要用户定制,或使用MODBUS协议等标准协议。
CPU本身只会提供UART接口,不提供RS485接口。
用法:UARTàRS485-àUART
RS485是纯硬件实现,软件工程师只需要注意串口,只通过串口发送或接收数据,UART到485和UART到UART对CPU都是透明的。
原理图分析:
连接UART2,PG8用于控制数据的发送和接收。
默认为接收模式。
功能要求:
默认的485芯片是接收功能,每1s发送一个0x88,如果接收到0x55,则返回0x01,如果接收到的数据不0x55,则返回给0x00。
运行结果:
MODBUS协议
它可以基于串行端口(RS232、RS485 和 RS422)和以太网。主要分为三类。它属于应用层接口。
Modbus ASCII (英语)
Modbus TCP/IP
Modbus RTU系统
关键在于编码和解码的过程。
STM32 定时器实验 5 种定时器简介
看门狗计时器 (IWDG)。
它分为独立看门狗和窗口看门狗。它用于防止程序逃跑。
Systick 计时器:在操作系统中用作系统运行的滴答时钟。
可用于生成 RTOS 的系统滴答时钟。
它可以用于裸机程序中的短时间精确延迟函数,这就是HAL函数的延迟函数中使用的。
可用作正常定时器中断功能。
功能强度分类:高级定时器(TIM1-TIM8)>通用定时器(TIM2-TIM5、TIM9-TIM14)>基本定时器(TIM6-TIM7)。
在实践中,通用定时器就足够了。
对于STM32F4计时器,有 14 个计时器。比较复杂,学习思路如下:
首先,学习如何使用基本功能。定时,设置时间,时间到了,就会执行中断服务功能。其他高级功能可以在以后在工作中使用时讨论。
定时器 4 实验
为演示文稿选择通用函数计时器。
定时器时钟频率为 84MHz:
使能定时器4,预交叉系数为4200-1,对应的交叉频率为84MHz/4200=20KHz,自动过载值设置为35,超时周期为1750us。
注意:如果时序为 1750us,则计数数为 1750us/(1/20K)=35
如果时序为 1s,则计数数为 1s/(1/20K)=20000
注意:在实验过程中,发现可以将此位置设置为 false 和 true。
自动生成的代码:
打开定时器中断:MX_TIM4_Init ();
基于STM32CubeMX,端口freeModbusRTU(从站)。
请参阅教程:
为了便于处理,以串口1为例。
打开中断:
以计时器 4 为例进行演示:
使能定时器4,预交叉系数为4200-1,对应的交叉频率为84MHz/4200=20KHz,自动过载值设置为35,超时周期为1750us。
注意:如果时序为 1750us,则计数数为 1750us/(1/20K)-1=35-1=34
打开定时器中断:
配置中断优先级:
配置中断优先级,定时器中断优先级低于串口中断
生成代码:
打开 freeModbus 包的 demo 文件夹,新建一个名为 STM32MB 的文件夹,然后将 BARE 文件夹的所有内容复制到 STM32MB 文件夹,返回 freeModbus 包,复制整个 modbus 文件夹并粘贴到 STM32MB 文件夹中。
将 STM32MB 文件夹移动到 stm32cubeMX 生成的项目目录,如图所示
打开项目,导入STM32MB中的所有头文件,新建一个名为 MB 和 MB_Port 的组,将 STM32MB 文件夹下的 modbus 文件夹中的所有 c 文件和 MB 下根目录下的 demo.c 文件添加,并在MB_Port中添加 STM32MB 文件夹下的 port 文件夹中的所有 c 文件, 如图所示
编译错误:
将 demo 中 main 函数的名称更改为 host:
修改 portserial.c 文件(串口设置)下MB_Port
省略的其他移植程序:
测试:
软件配置:
移植成功:
NodeRed 读取:
FreeRTOS 开发
简介:实时操作系统
中断可以嵌套。
您希望使用什么实时操作系统?
原因如下:多任务处理。
RTOS 能学到什么?
应用开发的核心是任务创建、IPC、内存管理等。
应用程序开发(重点) à 内核开发
Cummx 端口
功能:2 个 LED 以不同的频率闪烁。
CMSIS:ARM Cortex 微控制器软件接口标准。
use preemption:使用抢占。
最大优先级
最小堆栈大小
闲置应该屈服
use_mutexes
use recursive mutexes:使用递归收缩
使用计数信号量:使用计数信号量
队列注册表大小:队列注册表的大小
使用应用程序任务标记:使用应用程序任务标记
启用反向兼容性:启用向后兼容性
使用端口优化任务选择:使用端口优化任务选择
use tickless idle:使用无滴答空闲
内存管理:
使用守护进程任务启动钩子:使用守护进程任务启动钩子
检查堆栈溢出:检查堆栈溢出
生成运行时统计信息:生成运行时统计信息
使用跟踪工具:使用跟踪工具
max coroutine priority:最大协程优先级
中断嵌套行为配置:中断嵌套行为配置
库最低中断优先级:库的最低中断优先级
消息缓冲区长度类型:消息缓冲区的长度
use posix errno:使用 posix 错误号
堆仍然可用
use newlib reentrant:使用 newlib 重入
总共有三个任务:
生成代码:
原始刻度设置:
改 性:
lwip 开发 PING 函数实现
如后所述,您需要启用中断功能。
自动协商:自动协商
双工模式:双工模式
从 mll 中分离 phy:从 mll 中分离 phy
已建立有效链接:建立有效链接
其中,Bits4:2 包含 PHY Speed 掩码和 PHY 双工掩码的掩码
Bits2 代表两种速度:10MB/s 和 100MB/s;PHY速度掩模(0x0004)
Bits4 代表两种工作模式:半双工和全双工、PHY 双工掩码 (0x0010)。
启用 ETH 中断:
注意:对于具有正原子的板,需要重新映射:
请注意 PD3 引脚的设置:
默认配置如下:
此处需要修改配置
freeRTOS 配置
LWIP 配置
生成代码:
在实验过程中发现,静态分配的IP地址在一段时间后会失效。
修改操作:
这
重新修改了 FreeRTOS 标准:其他配置无需修改。
NVIC公司
嵌套矢量中断控制器
起始代码:帮助我们构建中断向量表。
外部中断实际编程过程:
1)设置时钟并打开相应的GPIO模块时钟。
2) NVIC设置
3) 使能外部中断线触发
4) 准备 ISR 并等待中断程序在 ISR 上执行。
注意:NVIC和jtag调试不属于内部外设,而是属于内部CPU,因此标准库中没有对应模块的库文件。
优先级:包含抢占式优先级和次级优先级,数字越小,优先级越高。
HAL 库中断检测密钥
原理图分析:
实验
采用KEY0和PE4。
设置下降沿触发器:
配置 NVIC 以设置中断优先级:
STM32 CPU使用以下方法确定优先级:
1)先确定抢占优先权,数量越小,优先级越高;
2)如果优先权相同,则判断次级优先权,同样,数量越小,优先级越高
配置使用中断优先级分组规则的NVIC_PriorityGroup_2
根据中断优先级分组规则的NVIC_PriorityGroup_2设置特定的优先级大小
生成代码
首先打开 stm32l4xx_it.c 文件:
打开 stm32l4xx_hal_gpio.c 文件,查看函数的原型:
HAL_GPIO_EXTI_Callback(GPIO_Pin);
此函数称为 EXIT 中断回调函数,用于处理发生的所有 EXIT 中断事件。
还可以在 stm32l4xx_hal_gpio.c 文件中找到该函数的原型:
自行实现 EXIT 中断处理回调函数
放在 gpio.c 的末尾:
编译和下载项目:
请注意,配置为中断检测的引脚的初始状态需要为高电平。否则,实验无效。