STM32,电路板,调度器以及RJ45电路分享

摘要://(HAL_UART_Receive(&huart3, rx_float_data.byte, 4, 1000)==HAL_OK) { printf("rx_float_data.byte[0] = %.2x (addr: %#x)\n", rx_float

实际应用中,我们可能需要两个设备通过串口传输浮点数据:

本篇笔记为了方便演示,使用串口助手模拟其中一个设备,本篇笔记内容如下:

我们创建一个用于管理float类型数据的共用体:

union float_data { float f_data; uint8_t byte[4]; };

数据的流向如:

本次使用串口助手模拟发送设备,省略了第一步,主要看第②、③步。

创建两个共用体变量,用于发送与接收:

unionfloat_data rx_float_data, tx_float_data;

收发相关代码:

//(HAL_UART_Receive(&huart3, rx_float_data.byte, 4, 1000)==HAL_OK) { printf("rx_float_data.byte[0] = %.2x (addr: %#x)\n", rx_float_data.byte[0], &rx_float_data.byte[0]); printf("rx_float_data.byte[1] = %.2x (addr: %#x)\n"11]); printf("rx_float_data.byte[2] = %.2x (addr: %#x)\n"22]); printf("rx_float_data.byte[3] = %.2x (addr: %#x)\n"33]); printf("rx_float_data.f_data = %f (addr: %#x)\n", (float)rx_float_data.f_data, &rx_float_data.f_data); tx_float_data.f_data = rx_float_data.f_data + 1.0f; printf("tx_float_data.f_data = %f\n", tx_float_data.f_data); HAL_UART_Transmit(&huart3, tx_float_data.byte, 4, 1000); }

代码很简单,UART3接收到串口助手发送的float类型对应的16进制数据存于rx_float_data.byte中,并打印输出rx_float_data.byte的各个字节,此时rx_float_data.f_data就是我们接收的浮点数据,接收到的数据加上1.0后赋予tx_float_data.f_data再通过UART3把tx_float_data.byte发送出去。

运行结果:

这里以传输数据1.28为例,1.28对应的十六进制数据是什么呢?

我们可以通过一些在线网站查看,比如

1.28对应的十六进制为:3FA3D70A。因为STM32是小端模式,所以使用串口助手发送时需要进行一个逆序,即发送0AD7A33F。从实验结果可以看到:

STM32收到1.28之后,加上1.0之后通过UART3发回上位机,2.28对应4011EB85:

这里我们使用串口助手来模拟一个设备,所以需要查一下我们要发送的float数据对应的十六进制数据。实际两个设备之间做传输是不需要这么做的,想发什么就传什么就可以……

查看原文:

极性元件在整个PCBA加工过程中需要特别注意,因为方向性的元件错误会导致批量性事故和整块PCBA板的失效,因此工程及生产人员了解SMT极性元件极为重要。

极性是指元器件的正负极或第一引脚与PCB(印刷电路板)上的正负极或第一引脚在同一个方向,如果元器件与PCB上的方向不匹配时,称为反向不良。

2.1 陶瓷电容无极性

▲ 图2.2.1 陶瓷电容(无极性)2.2 钽电容有极性PCB板和器件正极标示:1)色带标示;2)“+”号标示;3)斜角标示。

▲ 图2.2.2 钽电容有极性2.3 铝电解电容有极性零件标示:色带代表负;PCB板标示:色带或“+”号代表正极。

▲ 图2.2.3 铝电解电容有极性

3.1 片式线圈片式电感等两个焊端封装无极性要求。

▲ 图2.3.1 片式电感无极性3.2 多引脚电感类多引脚电感类有极性要求。零件标示:圆点/“1”代表极性点;PCB板标示:圆点/圆圈/“*”号代表极性点。

▲ 图2.3.2 多引脚电感类

4、发光二极管(Light Emitting Diode)

4.1 SMT表贴LED表贴LED有极性。

零件负极标示:绿色为负极;

PCB负极标示:1) 竖杠代表;2) 色带代表;3) 丝印尖角代表;4) 丝印“匚”框代表。

▲ 图2.4.1 表贴LED器件

5、二极管(Diode)

5.1 SMT表贴两端式二极管表贴两端二极管有极性。

零件负极标示:1)色带,2)凹槽,3)颜色标示(玻璃体);

PCB负极标示:1)竖杠标示,2)色带标示,3)丝印尖角标示,4)“匚”框标示

▲ 251.表贴的二极管带有极性

6.1 SOIC类型封装这类封装有极性。极性标示:1)色带,2)符号,3)凹点、凹槽,4)斜边

▲ 图2.6.1 集成电路的极性标记6.2 SOP或QFP类型封装这类封装有极性。极性标示:1)凹点/凹槽标示,2)其中一个点与其它两/三个点的(大小/形状)不同。

▲ 图2.6.2 SOP以及QFP封装6.3 QFN类型封装这类封装有极性。极性标示:1)一个点与其它两个点(大小/形状)不同,2)斜边标示,3)符号标示(横杠/“+”号/圆点)。

▲ 图2.6.3 QFN封装有极性

零件极性:凹点/凹槽标示/圆点/圆圈标示;

PCB板极性:圆圈/圆点/字母“1或A”/斜角标示。

零件极性点对应PCB上极性点……

查看原文:

开局分割线:接着我们上一篇,其实小小调度器最不同于其它实时任务框架的点就在于他的核心是基于:_LINE_的应用(纯C的实现,并没有用到和cpu相关的寄存器操作,所以他是可以忽略硬件进行移植的,只要编译器支持),当然这并不是原作者的原创(真要是我怕你也不敢用),使用_LINE_行号记录程序运行位置,最早是有PT thread采用的,感兴趣的童鞋可以自行度娘,言归正传,先从LINE用法开始下刀:

ANSI C 规定了预定义宏,__LINE__:表示当前源代码的行号;

#define WaitX(tickets) do { _lc=(__LINE__%255)+1; return (tickets) ;case (__LINE__%255)+1:;} while(0); int func(void){ while(1) { WaitX(50); //假定该行代码在文件中的行号是18LED0=!LED0; } }

这里有两个需要注意的,define WaitX宏为什么写为一行,因为写一行__LINE__的值就是行号而且是相同的,虽然宏写一行看起来很难理解,但是这的确是必须的。

接下来解释下_lc=(__LINE__%255)+1; _lc类型为char,取值范围在0-255,而0为刚进入函数开始直接,所以需要避过该号,所以实际取值应该在1-255之间,__LINE__的实际值可能超过255,所以需对其取余操作,防止跳转冲突(该错误可在编译阶段查找出来,并不需要太过担心,一旦出现冲突,解决方案也很简单,再任务中多打一行空格即可错开行号冲突)。

到这里我们再来看WaitX(50);这个宏到底执行了什么,其实就以下三点:

1.记录该行号(因为后面程序要跳转到该行继续执行)。

2.跳走,返回值50(返回值是给到调度任务,调度任务计时到后,主动调用当前任务)

3.进入当前任务,从记录行号开始执行。

接下来,隆重介绍下即将登场的调度任务:本质上其就是一个定时器任务(框架任务,必不可少),运行环境为:中断运行,代码如下:

voidINTT0(void) interrupt 1 using 1 //看这个样子明显是个中断函数{ TL0=0Xff; //寄存器操作,10ms执行一次中断 TH0=0XDB; //寄存器操作,这不是重点 UpdateTimers; //这里是重点,看着像函数,实际这也是个宏。}

重点就是UpdateTimers宏展开的实现:

//用最简单的方式:纯C实现调度器核心代码。do{ unsignedchar i; for(i=MAXTASKS;i>0 ;i--) { if((timers[i-1]!=0)&&(timers[i-1]!=65535)) timers[i-1]--; } } while(0);

这段宏完成了定时器任务最主要的功能,主要是对timers数组进行--操作,timers数组里面记录的每个任务的延时时间(专业一点叫做阻塞时间),当一个任务被阻塞时,return返回值就会被写入对应的timers数组中……

查看原文:

一、网线介绍

双绞线由两根绝缘铜导线相互缠绕而成。两根绝缘的铜导线按一定密度互相绞在一起,可降低信号干扰的程度,每一根导线在传输中辐射的电波也会被另一根线上发出的电波抵消。把一对或多对双绞线放在一个绝缘套管中便成了双绞线电缆,在局域网中常用4对双绞线组成的。

1.1、UTP与STP

1.1.1、UTP(非屏蔽双绞线):

非屏蔽双绞线抗干扰能力较差、误码率高,但由于价格便宜、安装方便、故广泛应用于电话系统和计算机网络中,成为最普遍的传输媒体。

1.1.2、STP(屏蔽双绞线):

屏蔽双绞线的外面有一个金属构成的屏蔽层,其内部结构与非屏蔽双绞线相同。屏蔽双绞线的误码率明显低于非屏蔽双绞线,还可以比非屏蔽双绞线支持更远的距离,更高的传输率和连接更多的网点,但价格相对也就贵很多。

1.1.3、双绞线标准:

技术指标参数

1.2、CAT3、CAT5、CAT6什么意思

1.2.1、三类线(CAT3)应用范围:

指在ANSI和EIA/TIA568标准中指定的电缆,该电缆的传输频率16MHz,最高传输速率为10Mbps(10Mbit/s),主要应用于语音、10Mbit/s(10BASE-T)和4Mbit/s,最大网段长度为100m,采用RJ形式的连接器,目前已淡出市场。

1.2.2、五类线(CAT5)应用范围:

该类电缆增加了绕线密度,外套一种高质量的绝缘材料,线缆最高频率带宽为100MHz,最高传输速率为100Mbps(100Mbit/s),用于语音传输和最高传输速率为100Mbps的数据传输,主要应用于100BASE-T和1000BASE-T网络,最大网段长度为100m,采用RJ形式的连接器,这是最常用的以太网电缆。

超五类线(CAT5e):具有衰减小、串扰小,具有更高的衰减与串扰比值(ACR)和信噪比(SNR)、更小时延误差,性能得到很大提高,超五类线主要应用于1000Mbps以太网。

1.2.3、六类线(CAT6)应用范围:

该类电缆的传输频率1MHz-250MHz之间,六类布线系统在200MHz时综合衰减串扰比(PS_ACR)应该有较大余量,它提供2倍于超五类线的带宽。六类布线的传输性能远远高于超五类线标准,最适用于传输速率高于1Gbps的应用。改善了串扰与回波损耗方面的性能,对于新一代全双工的高速网络应用而言,优良的回波损耗性能是极其重要的。

六类线标准中取消了基本链路模型,布线标准采用星形的拓扑结构,要求的布线距离为:永久链路的长度不能超标90m,信道长度不能超过100m。超六类线(CAT6e):此类线传输带宽介于六类线与七类线之间,传输频率为500MHz,传输速率10Gbps,标准外径为6mm。

二、以太网电路构成

以太网电路主要包含:CPU、MAC控制器、PHY芯片、网络变压器和RJ45接头组成,有的系统会有DMA控制。一般的系统中CPU和MAC以及DMA控制器都是集成在一块芯片上的,为了节省空间简化设计,很多时候网口的变压器和RJ45的接头集成在一起……

查看原文:

来源:山东省成人高考

相关推荐