面向接口的编程——平台技术、开关量信号
置为输入且不被外部驱动,那么它可以令输入引脚保持上一种已知状态。
在默认情况下,除I2C 总线P0_10 和P0_11 没有可编程的上拉/下拉电阻和中继模式外,其它所有GPIO 的上拉电阻都被使能。在默认情况下,每个GPIO 仅分配给一个且仅一个外部引脚,外部引脚随后便由其固定引脚GPIO 功能来标识。但通过开关矩阵可将内部功能分配给除电源和接地引脚外的任意外部引脚,这些功能称为可转移功能。而晶体振荡器引脚(XTALIN/XTALOUT)或模拟比较器输入等某些功能仅可分配给具有适当电气特性的特定外部引脚,这些功能称为固定引脚功能。如果某个固定引脚功能未被使用,则可将其替换为任意可转移功能。对于固定引脚模拟功能,开关矩阵可使能模拟输入或输出并禁用数字端口。
>>> 4.2.2 新建工程
在编程之前,必须先建立工程,然后才能将程序下载到开发板上运行。由于AMetal 已经提供了模板工程,所以"新建工程"只需拷贝一下即可。
模板工程就是位于projects_keil5\applications 目录下的 template 文件夹。新建工程即将该文件夹重新复制一份,命名为led_blinking。接着打开led_blinking 文件夹,将工程文件命名为led_blinking,然后双击led_blinking.uvprojx 工程文件打开工程,更详细的操作详见配套开发资料中的《快速入门手册》。
打开工程后,虽然在工程视图的左侧有很多分组(user_config 和user_code 等),每个分组下都有相应的文件。但先不用理会,只需要关心user_code 分组下的main.c 文件,就在该文件中的am_main()函数中添加应用程序。当MCU 无事可做时,不能让它闲下来,因为am_main()函数结束标志整个应用程序结束,从而导致MCU 跑飞。因此,am_main()函数中通常都存在一个while(1)死循环。当工程建好后,即可编程了。
>>> 4.2.3 输出控制
如图4.6 所示为AM824-Core 板载的2 个LED发光二极管,与MCU 的I/O 引脚通过J9 和J10 相连,其中的LED0 通过J9 与MCU 的PIO0_20 相连,LED1 通过J10 与MCU 的PIO0_21 相连。当I/O 输出低电平0 时,由于LED 阳极加了3.3V 电压(高电平1),因而形成了电位差,所以有电流流动,则LED 发光二极管导通,即LED 发光;当I/O 输出高电平1 时,由于无法形成电位差,则LED二极管不导通,即LED 熄灭。
图4.6 板载LED 电路
电阻R3、R4 的作用是防止产生过电流而烧坏LED,这是由电源电压和LED 的额定电流决定的LED 电学特性而接入的,当LED 的电压超过1.5V 时,电流将急剧增加,所以必须避免出现这样的情况。在数字电路中,当输出为高电位时,则电流流到负载上;当输出为低电位时,则从负载一侧吸入电流。前者的电流叫作源电流,后者叫作吸收电流。显然LED只有点亮、熄灭和翻转3 种操作,可以直接调用接口函数实现,led.h 接口文件的内容详见程序清单4.1(各接口具体的实现在第4 章中会详细介绍)。
程序清单4.1 led.h 接口
其中,led_id 是LED 的编号,AM824-Core 板载LED 的编号分别为0 和1。事实上程序设计的依赖倒置原则不一定要包含函数指针或抽象类型数据,当调用led_on()和led_off()点亮或熄灭LED 时,就使用了依赖倒置原则。它本来可以与I/O 的内存映射直接交互,却将直接访问抽象成了接口。那么针对接口的编程不妨就从点亮LED 开始,详见程序清单4.2。
程序清单4.2 点亮LED 范例程序
LED 闪烁就是让LED 不停的亮灭,因为计算机指令的执行速度非常快,其执行时间是微秒级的,所以在微秒之间点亮和熄灭LED,眼睛是看不到闪烁现象的。如果想让人眼看到LED 闪烁,就必须将LED 点亮和熄灭的停顿时间扩大近秒级别。如何实现停顿呢?点亮LED 后,先不要熄灭LED,而是先延时一会儿,让"点亮LED 后,再保持一段时间",然后再熄灭LED。在实验之前,我们需要延时函数,它在C 语言中是怎么实现呢?很简单,就是让MCU 执行一些没有任何实际意义的空循环指令,进而等效于延时。延时范例程序详见程序清单4.3,该程序中,MCU 大约就要执行1000000 条空指令。
程序清单4.3 延时范例程序
这样的延时函数好用吗?由于MCU 运行速率不同,因而导致实际的延时结果不同。如果要求不同的延时时间,则又需要不同的延时函数。显然,该延时函数不仅通用性太差,而且延时时间也不精确。幸运的是,AMetal 提供了使用定时器实现的高精度标准延时函数,主要包含了2 个延时函数,其函数原型(am_delay.h)如下:
按照前面的思路,在点亮灯之后,延时一段时间,让"亮灯状态"保持一段时间,再熄灭LED 灯,再
编程 相关文章:
- 基于单片机的可编程直流稳压电源设计(08-17)
- 利用可编程电源平衡输入纹波电流的解决方案(09-11)
- 可编程电源设计(01-12)
- NXP (Freescale) i.MX7 96Board(05-17)
- 可编程逻辑控制器(PLC)基本操作及功能简介(03-07)
- 分析机器人离线编程误差来源(06-28)