发帖数

50

原创数

50

关注者

12

阅读数

8965

点赞数

4

蔡琰

  • 张飞单片机来了

    大家好!我是张飞实战电子蔡琰老师,今天给大家分享张飞单片机。

    在这一芯难求的时代,张飞单片机来了,带着丰富的示例、手册以及最小系统板,还有强大的技术支持,让迷茫的你可以快速上手到应用。话不多说,我们就一起来看一下张飞单片机的特点以及应用吧。

    张飞单片机目前的芯片有:ZFM32F030系列32位微控制器(TSSOP20QFN32),都是M0核。ZMF32F103CB 32位微控制器(LQFP48),是M3核。

    1、先说一下我们两个系列的特点吧

    FM32F030系列32位微控制器的特点:

    图片1.jpg

    图片2.jpg

    ZFM32F103CB  32 位微控制器特点:

    图片3.jpg

    看到这些特点对于一般的硬件工程师或者单片机应用工程师就可以检索到自己的需求了,可以快速去查找相关应用了对吧。找到外设应用了就可以快速对照手册来看具体操作了。

    1、接下来跟大家看下我们提供的数据包都有什么内容吧

    image.pngimage.png

    用户手册大家都知道,是可以查询最详细信息的手册,包括寄存器应用之类的信息;数据手册就是对应单片机最基本的信息,比如特点,管脚信息,系统及外设等的描述,电气规范,封装等的一些信息。

    FLM烧写文件是一个FLASH烧写算法文件,要加载到MDK工具下才能下载烧录程序;第四点是标准库以及示例程序;还有我们提供了最小系统板的说明和原理图。

    1、为了方便大家能快速上手应用我们的单片机,可以免费申领我们的数据包和最小系统板,扫描下面二维码咨询,相关的技术问题我们也可以交流。

    image.png

    张飞单片机技术支持邮箱:support@zhangfeidz.com


    收藏 0 回复 0 浏览 726
  • USB的四种传输类型之批量传输


    虽然USB定义数据在总线上传输的基本单位是包,但是我们还不能随意地使用包来传输数据.必须按照一定的关系把这些不同的包组织成事务才能传输数据.

    那什么是事务呢?事务通常由两个或者三个包组成:令牌包,数据包和握手包.令牌包用来启动一个事务,总是由主机发送;数据包传送数据,可以从主机到设备,也可以是从设备到主机,方向由令牌包来指定;握手包的发送者通常为数据接收者,当数据接收正确后,发送握手.设备也可以使用NAK握手包来表示数据还未准备好.

    USB协议规定了4中传输类型:批量传输,等时传输,中断传输和控制传输.其中,批量传输,等时传输,中断传输每次传输一次数据都是一个事务;控制传输包括三个过程,建立过程和状态过程分别是一个事务,数据过程则可能包含多个事务.下面我们先来说说批量传输.

    批量传输是最容易理解的,它使用批量事务传输数据.一次批量事务有三个阶段:令牌包阶段,数据包阶段和握手包阶段.这里的每个阶段都是一个独立的包.批量传输分为批量读和批量写(记住,输入还是输出是以主机为参考的),批量读使用批量输入事务,批量写使用批量输出事务.

    批量传输没有规定数据包中的数据的意义和结构,具体的数据结构要由设备自己定义.批量传输通常用在数据量大,对数据的实时性要求不高的场合,例如USB打印机,扫描仪,大容量存储设备等.

    首先介绍批量输出事务。主机先发出一个OUT令牌包,这个令牌包中包含了设备地址、端点号。然后,再发送一个DATA(具体是什么类型的DATA,要看数据切换位),这时地址和端点匹配的设备就会收下这个数据包。然后主机切换到接收模式,等待设备返回握手包。设备解码令牌包、数据包都准确无误,并且有足够的缓冲区来保存数据后,就会使用ACK握手包或者NYET握手包来应答主机(只有高速模式才有NYET握手包,它表示本次数据成功接收,但是没有能力接收下一次传输)。如果没有足够的缓冲区来保存数据,那么它就会返回一个NAK握手包,告诉主机目前没有缓冲区可用,主机会在稍后的时间重试该批量输出事务。如果设备检测到数据正确,但是端点处于挂起状态,返回一个 STALL握手包。如果设备检测到有错误(例如校验错误位填充错误等),则不做任何响应,让主机等待超时再来看看批量输入事务。主机首先发出一个IN令牌包,同样IN令牌包中包含了设备地址和端点号然后主机切换到接收数据状态,等待设备返回数据如果设备检测到错误,那么不做任何响应,主机等待超时如果此时有地址和端点匹配的设备,并且没有检测到错误,则该设备要做出响应:如果设备有数据需要返回,那么它把一个数据包放到总线上(具体的数据包类型要看数据切换位);如果设备没有数据需要返回,则它直接使用NAK握手包来响应主机;如果该端点处于挂起状态,设备会返回一个 STALL握手包。如果主机接收到设备发送的数据包并解码正确后,使用ACK握手包应答设备。如果主机检测到错误,则不做任何响应,设备会检测到超时USB协议规定,不允许主机使用NAK握手包来拒绝接收数据包(否则的话,设备会在下面想:你真是USB”!既然你没空间接收数据,你还请求我返回数据给你干啥!浪费表情……)主机在收到NAK握手包后,知道设备暂时无数据返回,主机会在稍后的时间里重试该输入事务。另外,USB2.0高速设备中增加了一个ING令牌包,它不发出数据,直接等待设备的握手包。因此PING事务只有令牌包和握手包。图1.10.1是一个批量事务的流程图。下面对该流程图进行简单地解释,后面几种事务的流程图表示方法是差不多的,就不再一一解释了.

    image.png 

    平时无数据传输时,总线处于空闲状态。当需要传输一次事务时,主机发送一个令牌包,它可以是OUT令牌包、IN令牌包或者是PING令牌包,如图1.10.1中第一行所示,其中PING令牌包是USB2.0高速模式输出特有的,全速模式和低速模式没有这个令牌包如果设备解码令牌包时出错,则直接进入空闲状态。令牌阶段之后是数据阶段或者握手阶段对于批量输入事务,则由设备返回数据,或者返回应答包NAK握手包或 STALL握手包。这由设备的状态来决定对于批量输出事务,则主机在令牌包后面再发送一个数据包PING令牌用来探测设备是否有空间接收数据,它没有数据阶段,只有握手阶段,设备根据实际的情况返回握手包,AK握手包表示有空间接收数据,NAK握手包表示无空间接收, STALL握手包表示端点挂起。最后是握手阶段。对于批量输入事务,如果主机接收设备返回的数据正确,则由主机返回ACK握手包;否则数据错误,主机什么也不返回。主机必须要能够接收数据,不能用NAK握手包回应设备。对于批量输出事务,如果设备能够接收数据,则返回ACK握手包;如果设备没有空间接收数据包,则返回NAK握手包;如果设备端点挂起,则返回 STALL握手包;如果设备检测到传输错误,则什么都不回应,直接进入到空闲状态图1.10.2和图1.10.3更详细地给出一个传输正确的批量输入事务和批量输出事务的数据包图(传送了2字节数据)

    image.png

    今天我们就先介绍这么多,get到了吗?

     


    收藏 0 回复 0 浏览 628
  • 为什么好多人设计USB上拉电阻都是1.5K?

    大家好!我是张飞实战电子蔡琰老师,今天给大家讲解为什么好多人设计USB上拉电阻都是1.5K?

    说起USB,想必大家对这个词儿都不默生,USB接头那么多种,怎么分得清呢?下面由两幅图来简洁表述。

    图片1.jpg

    图片2.jpg


                                      常见USB接头及连接线介绍

     

    通过上面两幅图,我们心里已经有了一个大致的概念了,那么在USB接口设计的时候,通常我们要在USB的通信线上挂上拉电阻,为什么要这个上拉电阻呢?不要行吗?谈起这个USB的上拉电阻,我们还得从USB的插入检测机制说起,至于这个上拉电阻是挂在D+?还是D-还大有文章,请听我慢慢道来!

    USB主机是如何检测到,到插入的设备呢?在USB集线器的每个下游端口的D+ D-上,分别接了一个15K的下拉电阻到地,这样,当集线器的端口悬空没有设备插入时,输入端就被这两个下拉电阻拉到了低电平,而在USB的设备端,在D+或者D-上接了一个1.5K的上拉电阻到3.3V的电源,1.5K的上拉电阻是接在D+还是D-上,有设备的速度来决定,对于全速设备和高速设备,上拉电阻是接在D+上的,而低速设备的上拉电阻则是接在D-上。

    image.png

                                                                                      USB传输速度

    当设备插入到集线器时,接了上拉电阻的那条数据线的电压由1.5K的上拉和15K的下拉分压决定,结果大概在3V(3.3/1.5+15)* 1.5=3V),这对于集线器的接收端来说,是一个高电平信号,集线器检测到这个状态后,它就报告给USB主控制器,这样就检测到设备的插入了,集线器根据检测到的被拉高的数据线是D+还是D-来判断插入的是什么速度类型的设备,USB高速设备先是被识别为全速设备,然后通过集线器和设备的通信确认,再切换到高速设备,在高速模式下,是电流传输模式,这时要将D+上的上拉电阻断开。

    image.png


    USB速度检测

    可以做一个简答的实验,用一个10K的上拉电阻接在USB的+5V和D+/D-上,电脑会提示发现新硬件,但是无法找到驱动程序,这时因为D+/D-被拉高,集线器就认为有设备插入了,它就报告给主机,但是主机获取数据却没有响应,就会得到一个无法识别的USB设备,这时你的设备管理器就会显示一个未知USB设备。

    换句话来讲,这个如果这个1.5K是其他值,那么D+/D-上拉分压之后的电平就会发生变化,如果再遇到电压纹波,那么就有可能不会被检测到,这个就是1.5K的由来,你明白了吗?




    收藏 0 回复 0 浏览 621
  • 轻松解码串口通信

    说到通信,在我们的生活方方面面体现的淋漓尽致,比如手机信号,WiFi等这些无线通信更是近些年热点,并且各种通信设备都出来了,真的是科技社会,对我们的生活太方便了。


    对于通信,我们今天聊一下串口通信,其实做过单片机的基本都会用到,即便没有外设需求,就单独拎出来做个调试助手也是好的,可以通过和电脑通信直接打印出你想要的信息,直观。

    常规的通信方式就类似下图这样,是不是看上去很简单~

    1.jpg 

    对于串口通信属于串行异步通信,有相应的协议,是不是读懂并遵守协议就可以通信了?不一定。哈,不要有疑问,一个模块的方方面面都要照顾到它才给你工作不是,如果你家养了一个小狗,你把狗粮都买好了,都倒在食盆里了,最后却忘记放到它能看到的地方,是不是会饿肚子了。属于前面的工作都是无效的。


    我们先来了解下串口通信的底层规则都有哪些,通用规则你熟知了,然后选用不同款的单片机来控制的时候要再去研读对应单片机模块的相关配置,这个是必备的技能了。

    接下来我们看下串口通信的格式:

    2.jpg 

    空闲位UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平
    起始位:开始进行数据传输时发送方要先发出一个低电平’0’来表示传输字符的开始。

    数据位:起始位之后就是要传输的数据,数据可以是56789位,构成一个字符,一般都是8位。先发送最低位最后发送最高位。

    奇偶校验位:数据位传送完成后,要进行奇偶校验,校验位其实是调整个数,串口校验一般分以下3种方式:
    1.无校验(no parity
    2.奇校验(odd parity):如果数据位中’1’的数目是偶数,则校验位为’1’,如果’1’的数目是奇数,校验位为’0’
    3.偶校验(even parity):如果数据为中’1’的数目是偶数,则校验位为’0’,如果为奇数,校验位为’1’

    停止位:数据结束标志,一般可以是1/1.5/2位的高电平。

    波特率:数据传输速率使用波特率来表示,单位bpsbits per second

    常见的波特率9600bps115200bps等等,其他标准的波特率是120024004800192003840057600。举个例子,如果串口波特率设置为9600bps,那么传输一个比特需要的时间是1/9600≈104.2us

    3.jpg 

    电脑端的配置就要做出同样的选择才能通信,所以往往如果你的产品是需要串口通信的话,最基本的产品手册就要把这些信息写上,否则通信不上。通信如果没数据,可以通过示波器来单独测试发送和接收端口数据进行分析。

    那么单个数据的规则有了,就是通信协议了,有自定义协议(方便定义,不方便客户开发)和标准协议(ModBus)等。话说如果自作产品端到端通信,那自定义协议就够用了,如果和外界通信,建议还是用标准协议,这样规则更强,方便扩展。

    4.jpg 

    对于标准协议ModBus,很多人还是会一知半解,如果有兴趣的话我可以单独拎出来一篇跟大家分享它的规则和使用方面的建议,毕竟我也算熟知,做了挺多产品的。附件我跟大家分享标准协议的相关规范文档,大家有兴趣记得下载去学习下。串口通信过程中碰到的层出不穷的问题可以和我交流啊,断帧,丢字节是常用的事,一般需要分段采集数据分析,发送接收状态寄存器的读取也有讲究的。对于不同的单片机我这里就不列举了,如果你有死结问题,可以一起分析哈~

    关注我们,单片机实际经验分享或许会带你走出调试死结。

    收藏 0 回复 0 浏览 306
  • 存储器保护单元

    MPU也就是我们通常说的存储器保护单元,它可以为微控制器或片上系统(SOC)提供存储器保护特性,而且会提高所开发产品的健壮性。MPU在使用前需要进行编程使能,若MPU未使能,存储器系统的行为同没有MPU时一样。当然有的支持MPU特性,有的没有。

    MPU是一种可编程的部件,用于定义不同存储器区域的存储器访问权限(如只支持特权访问或全访问)和存储器属性(如可缓冲、可缓存)。

    MPU可以通过以下方面提高嵌入式系统的健壮性:

    避免应用任务破坏其他任务或OS内核使用的栈或数据存储器。

    避免非特权任务访问对系统可靠性和安全性很重要的外设。

    SRAMRAM空间定义为不可执行的,防止代码注入攻击。

    检测不可预期的存储器访问(例如,栈被破坏)。

    还可以利用MPU定义其他存储器属性,如可被输出到系统缓存单元或存储器控制器的可缓存性。

    若存储器访问和MPU定义的访问权限冲突,或者访问的存储器位置未在已编程的MPU区域中定义,则传输会被阻止且触发一次错误异常。触发的错误异常处理可以是存储器管理错误或者HardFault异常,实际情况取决于当前的优先级及存储器管理错误是否使能。然后异常处理就可以确定系统是否应该复位或只是OS环境中的攻击任务。

    在使用MPU前需要对其进行设置和使能,若未使能MPU,处理器会认为MPU不存在。若MPU区域可以出现重叠,且同一个存储器位置落在两个MPU区域中,则存储器访问属性和权限会基于编号最大的那个区域。例如,若某传输的地址位于区域1和区域4定义的地址范围内,则会使用区域4的设置。

    MPU的设置方法有多种。

    对于没有嵌入式OS的系统,MPU可以被编程为静态配置。该配置可用于以下功能:

    RAM/SRAM区域设置为只读,避免重要数据被意外破坏。

    将栈底部的一部分RAM/SRAM空间设置为不可访问的,以检测栈溢出。

    RAM/SRAM区域设置为XN,避免代码注入攻击。

    定义可被系统级缓存(2级)或存储器控制器使用的存储属性配置。

    对于具有嵌入式OS的系统,在每次上下文切换时都可以配置MPU,每个应用任务都有不同的MPU配置。这样可以:

    定义存储器访问权限,使得应用任务只能访问分配给自己的栈空间,因此可以避免因为栈泄漏而破坏其栈。

    定义存储器访问权限,使得应用任务只能访问有限的外设。

    定义存储器访问权限,使得应用任务只能访问自己的数据或自己的程序数据(设置起来可能会有麻烦,因为多数情况下OS和程序代码是一起编译的,因此数据在存储器映射中也可能是混在一起的。)

    如果需要的话,具有嵌入式OS的系统还可以使用静态配置。

    简单应用大多不需要使用MPUMPU默认为禁止状态,而且系统运行时它就如同不存在一样。在使用MPU前,需要确定程序或应用任务要访问(以及允许访问)的存储器区域:

    包括中断处理和OS内核在内的特权应用的程序代码,一般只支持特权访问。

    包括中断处理和OS内核在内的特权应用使用的数据存储器,一般只支持特权访问。

    非特权应用的程序代码,全访问。

    非特权应用(应用任务)的栈等数据存储器,全访问。

    包括中断处理和OS内核在内的特权应用使用的外设,只支持特权访问。

    可用于非特权应用(应用任务)的外设,全访问。

    在定义存储器区域的地址和大小时,注意区域的基地址必须要对齐到区域大小的整数倍上。例如,若区域大小为4KB(0x1000),起始地址必须为N X 0x1000,其中N为整数。

    若使用MPU的目的是防止非特权任务访问特定的存储器区域,则可以利用背景区域特性减少所需的设置步骤。只需设置非特权任务所用的区域,而利用背景区域,特权任务和异常处理则对其他存储器空间具有全访问权限。

     


    收藏 0 回复 0 浏览 294
×
蔡琰