旧乡故客
发表于: 2018-6-28 11:39:02 | 显示全部楼层

基于微控制器的嵌入式设计从硬件开始,然后从低级到高级的固件开发。我们将在一个简单的程序中探索这个设计过程,该程序使用Silicon Labs EFM8微控制器在128x128像素的LCD上显示滚动水平线。


所需的硬件/软件

●    SLSTK2000A EFM8评估板

●    Simplicity Studio集成开发环境


与微控制器合作的几句话

一般来说,可以通过四个互连的功能来讨论微控制器项目:端口输入/输出,外设,固件和外部组件。最低电平由端口I / O配置表示,这可确保端口引脚正确处理用作单片机输出或输入的实际电压信号。外设(如定时器或串行通信模块)是端口I / O和固件之间的一种中介:外设既处理来自端口引脚的I / O信号,又处理端口引脚的I / O信号,并启动影响固件执行的事件。固件是管理设备整体操作的指令集合;固件可以直接与端口引脚连接,但固件通常与外设交互,通过独立完成低级硬件任务来减少处理器的负担。最后,这三个模块 - 端口I / O,外设和固件 - 一起工作,以便与系统中的其他组件成功连接。


硬件和实现细节因微控制器而异,因此当您开始使用新设备开发项目时,需要熟悉相关过程。一个精心制作的,精心说明的数据表在这里非常有用,正如经过全面评论的示例代码。但最终,你需要第一手的经验(当事情没有起作用时,要有足够的耐心),以适应新型微控制器的特性。


幸运的是,集成配置工具使这种熟悉过程更快,更轻松。 Simplicity Studio包含高度开发的硬件配置工具,可大大减少正确配置管理器件处理器内核,时钟源,电源,端口引脚和外设的各种寄存器所需的时间和精力。


项目概况

其目标是在一个128×128像素的LCD模块上显示滚动水平线。这种非常令人兴奋的功能可以作为一种便捷方式,通过Simplicity Studio探索使用EFM8实施项目的基本方面。配置微控制器的硬件可能是一个相当复杂的过程,本文不能涵盖所有涉及的概念和技术。尽管如此,我们将试图强调一些关键的实现细节,然后将来的文章将更多地关注更高级别的功能。


端口I / O

首先,我们需要将端口引脚分配给适当的外设,并在需要时将引脚配置为输出。您可能会发现,选择引脚的输入/输出状态的基本任务比预期更复杂 - 并不像将输入配置位设置为1,输出配置位设置为0那么简单。因此,了解这些引脚到底发生了什么很重要:

port_pin.jpg


该图表示端口引脚的输入/输出电路。标有“WEAK”的晶体管用作高阻值电阻(约200kΩ)。当引脚设置为“推挽”模式时,输出通过其中一个输出晶体管直接连接至VDD或地。因此,引脚“驱动”逻辑低电平或逻辑高电平,因此在该模式下,引脚为输出。如果不处于推挽模式,则引脚处于“漏极开路”模式。这意味着上驱动晶体管(不是标记为“弱”的晶体管)被禁用。这里有一个重点:你不能称之为“输入模式”,因为引脚仍然可以通过较低的晶体管驱动逻辑低电平。只有当您将其配置为漏极开路并将1写入端口引脚锁存寄存器中的相应位时,该引脚才是真正的输入。现在,两个驱动晶体管都被禁用,并通过“弱”上拉晶体管将引脚上拉至VDD。这种安排是必要的,因为有时(例如,使用I2C串行总线)引脚必须能够以开漏模式作为输入和输出工作。


复位后,所有端口引脚都默认为输入模式,因此我们可以配置几个引脚用于输出模式,并将剩余的引脚独立。首先,我们需要分配外设,以便知道哪些引脚应该是输出。 SiLabs微控制器通过称为交叉开关的东西将外设与端口引脚连接起来,这是一种有点令人困惑但也是多功能的架构。对于这个项目,唯一需要端口引脚的外设是SPI总线。

hw_cnfg.JPG


SPI_SCK(串行时钟)和SPI_MOSI(主控输出从属输入)必须配置为推挽输出;此项目中不使用SPI_MISO(主从输出)。我们还必须将P0.1设置为推挽,因为此引脚用作从机选择信号(请参见下面的SPI讨论)。请注意,必须在crossbar配置中全部“跳过”P0.0至P0.5,以确保SPI信号出现在路由至LCD串行接口引脚的引脚上。


外设

该项目使用三个外设:SPI0、Timer2和Timer4。

peripheral_cnfg.JPG


在上面的图片中,看门狗定时器只是作为硬件配置过程的一部分被禁用而被检查。 SPI是一个相当简单的串行通信接口,能够在“主”和一个或多个“从”之间进行全双工通信。

spi.JPG


SPI外设产生的从机选择信号(上图中的NSS)与LCD接口不兼容,这就是我们必须通过P0.1手动发送该信号的原因。


定时器2用于在溢出时启动LCD更新来设置帧速率。 LCD数据资料建议帧频在54到65 Hz之间,所以我们配置了Timer2在16.665 ms后溢出,这对应于60 Hz:

timer2.JPG


Timer4用于实现LCD串行接口所需的短延时。时钟源的配置使得一个Timer4计数大约为0.33μs。


中断

中断是硬件驱动的信号,它使处理器执行特定的代码段。中断是微控制器固件对内部(例如定时器溢出)和外部(例如端口引脚上的低至高电压转换)等重要事件作出响应的主要方式。在这个项目中,Timer2产生的中断用于根据预定的帧速率调度LCD更新,SPI0中断控制处理与LCD串行通信的代码。

ints.JPG


固件

幸运的是,配置微控制器和设置中断服务程序所需的代码是由硬件配置工具自动生成的。其余的代码大部分是:Interrupts.c中的SPI状态机,LCD.c中的LCD数据和地址处理,以及在SPI_Test_main.c中启动LCD写入事件的无限循环。您可以下载此页面底部的所有项目和源文件。代码使用信息变量名称编写,并包含许多解释性注释,因此它应该可以帮助您了解此项目中使用的固件的详细信息。


该流程图阐明了控制SPI传输的状态机的功能:

flowchart.jpeg

以下“全清模式”时序图说明了单片机与LCD之间串行接口的一般特性。有关其他模式,请参阅LCD模块的数据表。

timing2.jpg


LCD排列为128条水平线,每条128个像素。为了在显示器上形成水平黑线,我们将所有像素清除为白色,然后将全部零写入一行地址。要创建滚动效果,我们更新显示如下:

●    Timer2溢出,导致中断。将第一行写入全黑。

●    Timer2再次溢出。将同一行写入全白,然后递增行地址。

●    Timer2溢出,我们将新行写入全黑,然后再写入另一个溢出,并清除新行。

●    这个过程一直持续到我们到达最后一行为止,此时过程从第一行的地址开始。



跳转到指定楼层
一只菜鸟
发表于: 2021-7-15 11:17:40 | 显示全部楼层

可以下载代码吗,怎么没看见
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 29 | 回复: 32



手机版|

GMT+8, 2024-4-19 13:45 , Processed in 0.202523 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表