设为首页 | 加入收藏 | 联系我们

新闻资讯

当前位置:澳利国际 > 澳利动态 >

无源蜂鸣器作为一种板载资源该如何使用?

  周立功教授新书《面向AMetal框架与接口的编程(上)》,对AMetal框架进行了详细介绍,通过阅读这本书,你可以学到高度复用的软件设计原则和面向接口编程的开发思想,聚焦自己的“核心域”,改变自己的编程思维,实现企业和个人的共同进步。经周立功教授授权,即日起,致远电子公众号将对该书内容进行连载,愿共勉之。

  第七章为面向通用接口的编程,本文内容为7.1 LED 控制接口、7.2 HC595 接口、7.3 蜂鸣器控制接口。

  虽然面向接口的编程简单易懂,但无法做到最大程度上地重用应用程序,这是导致软件开发成本居高不下的原因之一。而面向通用接口的编程就是基于AMetal 框架的应用程序设计,其核心是制定统一的接口规范,使程序员脱离非核心域的束缚聚焦于核心竞争力。

  为了实现跨平台开发应用软件,AMetal 提供了操作LED 的通用接口,详见表7.1。

  其中,led_id 为LED 编号,其相应的范例程序详见程序清单7.2。

  其中,led_id 为LED 编号,其相应的范例程序详见程序清单7.3。

  翻转LED 的状态就是使LED 由点亮状态转变为熄灭状态或由熄灭状态转变为点亮状态。

  其中,led_id 为LED 编号,其相应的范例程序详见程序清单7.4。

  通过LED 通用接口控制AM824-Core 板载的两个LED,使两灯交替点亮(2 个LED 的流水灯效果),其相应的范例详见程序清单7.5。

  显然,如果要想使用通用接口操作LED,则必须为具体的LED 设备提供相应的驱动。基于此,AMetal 提供了相应的驱动初始化函数。当使用该函数初始化一个LED 实例后,即可使用通用LED 接口操作LED。其函数原型为:

  其中,g_led_gpio 为用户自定义的实例,其地址作为p_dev 的实参传递。

  实例信息主要描述了LED 的相关信息,比如,使用的GPIO 引脚号,LED 为低电平点亮与相应的LED 编号等信息。其类型am_led_gpio_info_t 的定义(am_key_gpio.h)如下:

  当引脚输出低电平时,则点亮LED,因此active_low 的值为AM_TRUE。实例信息定义如下:

  当完成初始化后,即可调用通用LED 接口操作LED0 和LED1。为了便于配置LED(修改实例信息),基于模块化编程思想,将初始化相关的实例和实例信息等定义存放在LED 配置文件中,通过头文件引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单7.6 和程序清单7.7。

  AM824-Core 的LED0 和LED1 作为一种板载资源,在系统启动时默认进行了初始化操作,因此应用程序无需再调用实例初始化函数,即可直接使用LED0 和LED1。

  如果用户不需要使用LED,为了节省内存空间,可以将工程配置文件(am_prj_config.h)中的AM_CFG_LED_ENABLE 宏值修改为0,裁掉LED 程序,该宏本质上控制了板级初始化函数中的一段程序,详见程序清单7.8。

  为了避免与板载LED 编号冲突,Miniport-LED 应该使用与板载LED 不同的编号,比如,将编号定义为2~9。如果系统不使用板载LED0 和LED1(已将工程配置文件中的AM_CFG_LED_ENABLE 宏值修改为0),仅使用MiniPort-LED,则编号定义为 0~7。其实例信息定义如下:

  当完成初始化后,即可调用通用LED 接口操作LED2~LED9。为了便于配置(修改实例信息)Miniport-LED,澳利国际注册基于模块化编程思想,将初始化相关的实例和实例信息等定义存放在Miniport-LED 的配置文件中,通过头文件引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单7.9 和程序清单7.10。

  后续只需要使用无参数的实例初始化函数,即可完成Miniport-LED 实例的初始化:

  当完成初始化后,即可使用通用LED 接口操作LED2~LED9。在AM824-Core 中,MiniPort-LED 作为可选的配板资源,在系统启动时没有像板载LED0 和LED1 那样默认执行初始化操作。如果要使用MiniPort-LED,则必须调用MiniPort-LED 实例初始化函数。

  未使能时,HC595 的输出处于高阻状态,使能后才能正常输出0 或1,范例程序详见程序清单7.11。

  其中,hc595_handle 可以通过具体的HC595 驱动获得,若HC595 使用SPI 驱动,则可以通过如下语句获得:

  其中,handle 为HC595 的实例句柄,范例程序详见程序清单7.12。

  其中,handle 为HC595 的实例句柄,p_data 为指向待输出数据的缓冲区,nbytes 指定了输出数据的字节数。对于单个HC595,其只能并行输出8 位数据,即只能输出单字节数据,其范例程序详见程序清单7.13。

  当需要并行输出超过8 位数据时,可以使用多个HC595 级联,此时即可输出多字节数据,范例程序详见程序清单7.14。

  对于MiniPort-HC595,仅包含一个HC595,因此每次只能输出1 字节数据。

  AMetal 已经提供基于SPI 的HC595 的驱动,该驱动提供了一个初始化函数,使用该函数初始化一个HC595 实例后,即可得到一个通用的HC595 实例句柄。其函数原型为:

  其中,g_miniport_595 为用户自定义的实例,其地址作为p_dev 的实参传递。

  实例信息主要描述了HC595 的相关信息,比如,锁存引脚、输出使能引脚以及SPI 速率等,其类型am_hc595_spi_info_t 的定义(am_hc595_spi.h)如下:

  pin_oe 指定了HC595 的输出使能引脚,该引脚未与LPC824 连接,固定为低电平,因此pin_oe 的值应设置为-1。

  clk_speed 指定了SPI 的速率,可根据实际需要设定,若HC595 的输出用于驱动LED 或数码管等设备,则对速率要求并不高,可设置为 300000(300KHz)。

  lsb_first 决定了一个8 位数据在输出时,输出位的顺序,若该值为AM_TRUE,则表明最低位先输出,最高位后输出,若该值为AM_FALSE,则表明最低位后输出,最高位先输出,最先输出的位决定了HC595 输出端Q7 的电平,最后输出的位决定了HC595 输出端Q0的电平。如设置为AM_TRUE,当后续发现输出顺序与期望输出的顺序相反时,可再将该值修改为AM_FALSE。基于以上信息,实例信息可以定义如下:

  若返回值为NULL,说明初始化失败;若返回值不为NULL,说明返回了有效的handle。

  基于模块化编程思想,将初始化相关的实例和实例信息等定义存放在对应的配置文件中,通过头文件引出实例初始化函数接口,源文件和头文件的程序范例分别详见程序清单7.15和程序清单7.16。

  后续只需要使用无参数的实例初始化函数,即可获取到HC595 的实例句柄:

  通过控制HC595的输出,可以达到控制LED 点亮和熄灭的效果,范例详见程序清单7.17。

  由此可见,通用接口的好处就是屏蔽了底层的差异性,使得无论底层硬件怎么变化,应用程序都可以使用同一套接口操作LED。显然,无论是使用GPIO 直接驱动MiniPort-LED还是使用HC595 驱动MiniPort-LED,对于用户来说,都可以使用标准接口访问。AMeatl 提供了使用HC595 控制LED 的驱动,使用初始化函数完成相应实例的初始化后,即可使用通用接口操作LED。

  AMetal 已经提供了使用HC595 控制LED 的驱动,该驱动提供了一个初始化函数,使用该函数初始化一个LED 实例后,即可使用通用LED 接口操作LED。其函数原型为:

  serv_info 包含了通用接口访问LED 的编号信息,当使用HC595 驱动时,编号信息可以保持不变,同样为2~9。

  p_buf 是指向一个大小为hc595_num 的缓冲区的指针,用于缓存各个595 当前的输出值。由于hc595_num 的值设置为1,因此缓存的大小也为1,缓存定义如下:

  HC595 句柄即可直接作为handle 的实参传递,基于实例、实例信息和HC595 句柄,即可完成LED 实例的初始化:

  后续只需要使用无参数的实例初始化函数,即可完成Miniport-LED 实例的初始化:

  当完成初始化后,即可调用通用LED 接口操作LED~LED9。MiniPort-LED 有两种驱动方式:GPIO 驱动和HC595 驱动,当使用MiniPort-LED 时,应该根据实际情况选择对应的实例初始化函数。但无论何种驱动方式,在完成初始化后,对于应用程序来说都是调用通用LED 接口操作LED2~LED9。

  为了实现跨平台开发应用软件,AMetal 提供了操作蜂鸣器的通用接口,详见表7.3。

  该函数用于打开蜂鸣器,使蜂鸣器鸣叫指定时间后自动关闭,该函数会一直等到蜂鸣器鸣叫结束后返回。其函数原型为:

  注意,由于该函数会一直等到蜂鸣器鸣叫结束后才会返回,因此主程序调用该函数后,会阻塞50ms。

  该函数用于打开蜂鸣器,使蜂鸣器鸣叫指定时间后自动关闭,与am_buzzer_beep()函数不同的是,该函数会立即返回,不会等待蜂鸣器鸣叫结束。其函数原型为:

  注意,由于该函数不会等待蜂鸣器鸣叫结束,因此,主程序调用该函数后,会立即返回,不会被阻塞。显然,要使应用程序可以使用通用接口操作蜂鸣器,就需要为具体的蜂鸣器设备提供相应的驱动。

  无源蜂鸣器内部没有震荡源,需要外部使用一定频率的方波信号驱动才能发声。AMetal已经提供了无源蜂鸣器的驱动,直接输出PWM 驱动无源蜂鸣器发声。其函数原型为:

  其中,pwm_handle 为标准的PWM 服务句柄,chan 为PWM 通道号,duty_ns 为和period_ns分别指定了输出PWM 波形的脉宽和周期,决定了蜂鸣器鸣叫的响度和频率。AM824-Core板载了一个无源蜂鸣器。只要短接J7_1 与J7_2,则蜂鸣器接入PIO0_24。

  若需使用SCT 输出PWM,只需调用其对应的实例初始化函数即可获取标准的PWM 服务句柄:

  由于无源蜂鸣器使用的引脚为PIO0_24,其对应的通道为1,因此,chan 参数的值应设置为1。duty_ns 为和period_ns 分别指定了输出PWM波形的脉宽和周期,若频率设置为2500Hz,则对应的周期时间为:400000ns(1000000000 / 2500),占空比通常为50%(脉宽时间为周期时间的一半),即脉宽时间为:200000ns。实际中,可以根据实际发声效果修改脉宽时间和周期时间。

  基于对各个参数的分析,即可调用am_buzzer_pwm_init()完成无源蜂鸣器的初始化:

  无源蜂鸣器作为一种板载资源,在系统启动时已经默认进行了初始化操作,因此应用程序无需再手动调用无源蜂鸣器初始化函数,就可以直接使用通用接口操作蜂鸣器。

  若用户不需要使用蜂鸣器,为了节省内存空间,可以将工程配置文件(am_prj_config.h)中的AM_CFG_BUZZER_ENABLE 宏值修改为0,以裁剪掉蜂鸣器,该宏本质上控制了板级初始化函数中的一段程序,详见程序清单7.24。

  注:板级初始化函数在系统启动时自动调用,初始化完毕后才会进入应用程序入口,即am_main()。

相关新闻: