浅谈单片机下载程序电路原理

目前为止,接触单片机已有不少,从选择元器件、原理图、PCB、电路硬件调试、软件开发也算小有心得。

单片机软件开发里面第一步当属下载程序了,如果这一步都有问题,那么后面的一切便无从谈起,记得当初刚接触单片机时,对于下载电路方法及原理也是一头雾水。好在随着经验的积累以及自己的努力探求,现在对此问题算是有了点点自己的经验理解。故今天在此针对常用51单片机下载程序问题做下详解,以求新手们少走弯路。

原理

单片机的TXD、RXD是TTL电平,所以你得万变不离其宗的将其它信号转成TTL电平,只有这样给单片机下载程序才有可能成功!其中CH340、PL2303等芯片是直接将USB信号转换为TTL电平,而MAX232等芯片是将TTL转换为RS232信号或者将RS232信号转换为TTL.下面请看利用这种原理的两种常用方法:

方法一:

基于TI-RTOS的CC2650DK开发(16)---Timer(定时器)

之前一直把Timer翻译为计时器,感觉定时器更贴切些。之后全部翻译为定时器。

5.3 定时器模块

ti.sysbios.hal.Timer模块是一个面向定时器外设的标准接口。此模块将于8.3节进行详细描述,因为它是硬件抽象层(HAL)的一部分。

你可以使用此模块创建定时器(就是标记使用的定时器)并配置为定时器到期时调用一个tickFxn。仅在定时器外设无需任何自定义配置时使用此模块。

计时器可被配置为单周期或多周期模式。period可被指定为定时器次数或微秒。

5.4 Seconds模块

ti.sysbios.hal.Seconds模块提供了一种设置或获取自格林尼治时间1970年1月1日00:00:00以来走过的秒数。Seconds模块如果可用的话,将通过一个指定设备Seconds委托来维护时间。如果指定设备Seconds模块不可用,ti.sysbios.hal.SecondsClock模块将作为Seconds委托使用。SecondsClock内部使用时钟模块周期性地增加秒数。

Seconds模块的APIs是:

程序的思考「从单片机到PC」

关于程序的执行,以前想的不多,没有意识到一个程序在运行时,从哪里读指令,数据又写在哪里呢

从单片机上知道,在上电的那一刻,MCU的程序指针PC会被初始化为上电复位时的地址,从哪个地址处读取将要执行的指令,由此程序在MCU上开始执行(当然在调用程序的 main之前,还有一系列其他的的初始化要做,如堆栈的初始化,不过这些我们很少回去修改)。PC在上电时,和MCU差不多,不过读取的是BIOS,有它完成了很多初始化操作,最后,调用系统的初始化函数,将控制权交给了操作系统,于是我们看到了Windows,Linux系统启动了。如果将操作系统看作是在处理器上跑的一个很大的裸机程序(就是直接在硬件上跑的程序,因为操作系统就是直接跑在CPU上的,这样看待是可以的,不过这个裸机程序功能很多,很强大),那么操作系统的启动很像MCU程序的启动。前者有一个很大的初始化程序完成很复杂的初始化,后者有一段不长的汇编代码完成一些简单的初始化。这一点看,它们在流程上是很相似的。

基于TI-RTOS的CC2650DK开发(15)---Clock(时钟)

时间服务

时间服务概览

• 在 SYS/BIOS和XDCtools中,有几个模块涉及计时和时钟相关服务:
ti.sysbios.knl.Clock模块:负责内核用于保持时间轨道的周期性系统tick。所有SYS/BIOS APIs期望一个timeout参数来中断根据时间ticks所设置的timeout。时钟模块用于调度那些在时钟ticks中指定的内部运行的函数。默认情况下,时钟模块使用硬件抽象层。计时器模块则获取基于硬件的tick。另外,时钟模块可配置为使用应用程序提供的tick源,详见5.2节(时钟模块代替了早期DSP/BIOS版本中的CLK和PRD)。

• ti.sysbios.hal.Timer模块:提供使用计时器外设的标准接口。它隐藏了计时器外设的所有目标/设备的具体特征。计时器的目标/设备具体属性由 ti.sysbios.family.xxx.Timer模块支持(例如,ti.sysbios.family.c64.Timer)。你可以使用计时器模块来在计时器到期时调用一个tickFxn。详见5.3节和8.3节。

6种常见的单片机数字滤波算法

单片机主要作用是控制外围的器件,并实现一定的通信和数据处理。但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。

在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的误差,硬件上可采用滤波技术,软件上可采用软件算法实现数字滤波。滤波算法往往是系统测控算法的一个重要组成部分,实时性很强。

采用数字滤波算法克服随机干扰的误差具有以下优点:

1、数字滤波无需其他的硬件成本,只用一个计算过程,可靠性高,不存在阻抗匹配问题。尤其是数字滤波可以对频率很低的信号进行滤波,这是模拟滤波器做不到的。

2、数字滤波使用软件算法实现,多输入通道可共用一个滤波程序,降低系统开支。

3、只要适当改变滤波器的滤波程序或运算,就能方便地改变其滤波特性,这对于滤除低频干扰和随机信号会有较大的效果。

4、在单片机系统中常用的滤波算法有限幅滤波法、中值滤波法、算术平均滤波法、加权平均滤波法、滑动平均滤波等。

MCU产品、软件、生态系统的演变及未来展望

作者:王朋朋

单片机进入中国30年,也正是单片机高速发展的时代。从简单的控制到嵌入式系统,再到物联网,从工业领域到消费电子、安防、医疗、汽车、智能家居等产品,单片机无处不在,并从高科技领域越来越多的进入我们的日常生活。

单片机的发展从8位开始,目前8位单片机仍占有较高市场份额,在很多应用中发挥重要作用,但32位的ARM产品显然成长更快。从8位到32位,不仅仅是位数和CPU内核的变化,在软件开发、工具和环境、工程师开发方式、生态系统方面,都带来了深刻的变化。甚至产品的名字也从早期的“单片机”,到更多地使用“微控制器”或者“嵌入式系统”这样的术语(如表1)。我们下文更多以MCU或微控制器来指代这一产品。

基于TI-RTOS的CC2650DK开发(14)---邮箱

Mailboxes(邮箱)

ti.sysbios.knl.Mailbox模块提供了一系列函数管理mailboxes。Mailboxes可用于在相同处理器的两个task中传递缓冲。一个Mailbox实例可用于多个readers和writers。

Mailbox模块拷贝缓冲到合适尺寸的内部缓冲。这些缓冲的尺寸和个数在Mailbox实例创建时指定。拷贝在通过Mailbox_post()发送缓冲时建立。另外一份拷贝在通过Mailbox_pend()接收缓冲时建立。

Mailbox_create()和Mailbox_delete()分别用于创建和删除mailboxes。你也可以静态地创建mailbox对象。Mailbox可用于确保输入缓冲流不会超过系统处理那些缓冲的能力。本节稍后给出的例子演示了这种设计。

在创建mailbox时,你可以为每个缓冲指定其尺寸以及内部mailbox缓冲的个数。在创建Mailbox时确定尺寸之后,所有Mailbox的发送和接收缓冲必须使用这个相同的尺寸。

基于TI-RTOS的CC2650DK开发(13)---门

Gates(门)

Gates是用于防止并发访问代码关键区域的设备。各种门关于如何锁住关键区域的实现并不一样。

线程可以被更高优先级线程抢占,一些代码段在被另一个线程执行前需要被一个线程执行完毕。使用代码改变关键区域的全局变量这样的普通应用需要通过Gate来进行保护。

Gates通常用于禁用一些级别的抢占,如禁用task切换或甚至硬件中断,或用于二元semaphore。通过使用一个key,所有Gate实现支持嵌套。

对于禁止函数抢占的门来说,有可能多个线程调用Gate_enter(),但在所有线程调用Gate_leave()之后,才能重新载入抢占。这个功能通过使用一个key来实现。调用Gate_enter()时返回的key必须在之后传递回Gate_leave()。只有最外层调用的Gate_enter()返回正确的key才会重新载入抢占。

基于TI-RTOS的CC2650DK开发(11)---信号量

信号量(Semaphores)

SYS/BIOS在semaphores的基础上提供了一系列用于任务间同步和通信的函数。Semaphore通常用于协调访问一系列竞争任务间的共享资源。Semaphore模块提供的函数通过Semaphore_Handle类型句柄来操作semaphore对象的访问。参阅video introducing Semaphores进行概览。

无论是简单的(FIFO)或是优先级semaphores,Semaphore对象即可声明为计数semaphore,也可声明为二元semaphore。Semaphores可被用于task同步或互斥。相同的APIs可同时用于计数和二元semaphores。

基于TI-RTOS的CC2650DK开发(10)---空闲循环

The Idle Loop

dle Loop是 SYS/BIOS中的后台线程,在没有Hwi、Swi或Task时持续运行。任何其它线程在任何时间可抢占Idle Loop。

Idle管理器允许你在Idle Loop中插入函数运行。在configured. Idle_loop中会调用的每个Idle对象所相联的函数。Idle Loop每次调用一个函数,并在一个连续循环中往复调用所有函数。

所有Idle线程都按顺序运行于相同的优先级。函数按照创建的顺序依次运行。一个Idle函数必须完成后才会开始另一个Idle函数。当最后一个Idle函数完成,则又重新运行第一个Idle函数。

Idle Loop函数经常用于轮询那些不会(或不能)产生中断的非时实设备,用于监测系统状态或执行其它后台活动。

在SYS/BIOS应用程序中,Idle Loop的优先级最低,仅在没有Hwis、Swis或Tasks时运行。

CPU和线程的载入是在Idle Loop函数中计算完成的(目标和主机间的数据传送由一个低优先级task完成)。