简化手臂®皮层®m0 +基于物联网嵌入式设计与CircuitPython开发板---凯利讯半导体

  许多嵌入式应用程序使用高级MCUs,但只需要基本的硬件控制能力,而不是高级嵌入式设计的“硬实时”要求。然而,开发人员和制造商经常沉浸在硬件设计、C / c++编程和实时操作系统的细节中。幸运的是,有一个更简单的方法。

  这篇文章将展示一个更容易接近的方法,使用一对来自Adafruit Industries的微型开发板,它结合了Python编程语言的嵌入式设计变体和基于ARM cortex- m0 +处理器的成熟的32位MCU。


  先进的单片机简化设计

  先进的MCUs通过集成强大的处理器核心的模拟和数字周边设备来简化硬件设计。例如,芯片技术ATSAMD21G18 MCU结合了ARM的cortex- m0 +核心,256 Kbytes闪存,32 Kbytes的SRAM,先进的控制子系统,以及一系列外设,所有这些都在10×10毫米薄的quad扁平包(TQFP)包中(图1)。

  微芯片技术的简图,SAM D21 MCU家族


  图1:基于超低功耗ARM®皮层®m0 +,微芯片技术山姆D21单片机家族成员都提供了一组全面的功能块和外围设备,不同的只在特定数量的内存和外围渠道。


  除了32个GPIOs,ATSAMD21G18 MCU的外围设备还包括多个高级串行通信(SERCOM)通道、波形输出通道、多通道12位模拟数字转换器(ADC)、模拟比较器和10位数字-模拟转换器(DAC)。


  设计的挑战

  这类高级MCU消除了开发人员花时间查找和连接外部外部设备的需求,但它仍然对MCU本身如何被设计成一个系统提出了严格的要求。例如,在集成多种类型的电路时,ATSAMD21G18 MCU的设计通过一个相应的单独的域集合来供电。因此,开发人员必须处理处理器核心VDDCORE、内部调节器(VDDIN)、外围设备(VDDIO)和模拟块(VDDANA)的多个电源和地脚(图2)。

  在设计过程中,开发人员需要遵循提供电源、连接地面、选择和放置解耦电容器的具体建议——对于一个经验丰富的工程师来说,这没什么特别的,但对于开发新嵌入式MCU硬件设计的开发人员来说,这是一个潜在的陷阱。

  微芯片技术ATSAMD21G18单片机的图像


  图2:Microchip技术ATSAMD21G18 MCU使用多个电源域来提供其不同的模拟和数字块,并要求提供电力到这些域。


  同样,使用这些设备的软件开发似乎势不可挡。通常情况下,新的嵌入式系统开发人员发现自己陷入了与学习C / c++有关的细节,而这些细节是嵌入的开发材料,更多的是针对硬实时需求的应用程序。这些应用程序通常对中断延迟和确定性响应具有关键的时间要求。然而,许多新出现的物联网传感器设计(物联网)需要(或可以很容易地容忍)对数据采集或执行机构操作的更宽松的要求。


  简化嵌入式开发

  为了消除嵌入式开发人员的这些硬件和软件障碍,Adafruit的一组开发板提供了跨一系列应用程序需求的特别有效的解决方案。基于ATSAMD21G18 MCU,Adafruit Metro M0 Express和Feather M0 Express提供了一个完整的嵌入式系统,包括串行接口(USB、SPI、I2C和UART)、脉宽调制(PWM)、中断输入,以及多个模拟IOs和GPIOs。板材的大小和数量各不相同:2.8“x 2.1”x 0.28“Metro M0 Express提供25个GPIOs,而略小的(2.0的x 0.9 x 0.28”)羽毛M0 Express提供20个GPIOs。

  与大多数先进的MCUs一样,SAM D21 MCU家族提供的外围通道远比物理大头针多,但提供了一个pin映射特性,用于将外围功能分配给特定的硬件引脚。因此,即使是小尺寸的,每个董事会都使用共享的大头针来交付MCU广泛的外围功能的全部范围(图3)。

  Adafruit M0 Express development board的示意图


  图3:Adafruit利用pin多路复用来提供ATSAMD21G18在其小羽毛M0 Express开发板上的一个慷慨的子集。


  然而,对于开发人员来说,这些细节是透明的。Adafruit已经在其开源软件包(清单1)中为每个特定模块提供了具体的配置。

  静态const mp_rom_map_elem_t board_global_dict_table[]

  { MP_ROM_QSTR(MP_QSTR_A0)MP_ROM_PTR(&pin_PA02)},

  { MP_ROM_QSTR(MP_QSTR_A1)MP_ROM_PTR(&pin_PB08)},

  { MP_ROM_QSTR(MP_QSTR_A2)MP_ROM_PTR(&pin_PB09)},

  { MP_ROM_QSTR(MP_QSTR_A3)MP_ROM_PTR(&pin_PA04)},

  { MP_ROM_QSTR(MP_QSTR_A4)MP_ROM_PTR(&pin_PA05)},

  { MP_ROM_QSTR(MP_QSTR_A5)MP_ROM_PTR(&pin_PB02)},

  { MP_ROM_QSTR(MP_QSTR_SCK)MP_ROM_PTR(&pin_PB11)},

  { MP_ROM_QSTR(MP_QSTR_MOSI)MP_ROM_PTR(&pin_PB10)},

  { MP_ROM_QSTR(MP_QSTR_MISO)MP_ROM_PTR(&pin_PA12)},

  { MP_ROM_QSTR(MP_QSTR_D0)MP_ROM_PTR(&pin_PA11)},

  { MP_ROM_QSTR(MP_QSTR_RX)MP_ROM_PTR(&pin_PA11)},

  { MP_ROM_QSTR(MP_QSTR_D1)MP_ROM_PTR(&pin_PA10)},

  { MP_ROM_QSTR(MP_QSTR_TX)MP_ROM_PTR(&pin_PA10)},

  { MP_ROM_QSTR(MP_QSTR_SDA)MP_ROM_PTR(&pin_PA22)},

  { MP_ROM_QSTR(MP_QSTR_SCL)MP_ROM_PTR(&pin_PA23)},

  { MP_ROM_QSTR(MP_QSTR_D5)MP_ROM_PTR(&pin_PA15)},

  { MP_ROM_QSTR(MP_QSTR_D6)MP_ROM_PTR(&pin_PA20)},

  { MP_ROM_QSTR(MP_QSTR_D9)MP_ROM_PTR(&pin_PA07)},

  { MP_ROM_QSTR(MP_QSTR_D10)MP_ROM_PTR(&pin_PA18)},

  { MP_ROM_QSTR(MP_QSTR_D11)MP_ROM_PTR(&pin_PA16)},

  { MP_ROM_QSTR(MP_QSTR_D12)MP_ROM_PTR(&pin_PA19)},

  { MP_ROM_QSTR(MP_QSTR_D13)MP_ROM_PTR(&pin_PA17)},

  { MP_ROM_QSTR(MP_QSTR_NEOPIXEL)MP_ROM_PTR(&pin_PA06)},

  };

  MP_DEFINE_CONST_DICT(board_module_globals board_global_dict_table);

  清单1:Adafruit开放源代码的电路python库抽象硬件细节,使用特定于板的pin映射,如图所示的羽毛M0 Express板。

  为了开始开发,用户可以将面板插入USB端口,并使用内置的Arduino IDE的内置USB引导加载程序。为了更简单地介绍嵌入式软件设计,开发人员可以使用内置特性轻松地将电路加载到他们的面板上,并开始构建他们的嵌入式应用程序。


  简化开发与CircuitPython

  为了帮助简化嵌入式开发学习曲线,电路Python实际上从MicroPython获得了它的特性,这是Python的一个更直接的后代。Python通过其简单、清晰的语法和广泛的支持模块而成为一种流行的语言。然而,它的代码足迹实在太大,无法适用于嵌入式系统。

  微Python减少了Python的一些更大的特性,从而使版本能够满足嵌入式系统的逻辑约束,同时保留了语言的核心特性。在创建电路的过程中,Adafruit更进一步,消除了对于新的嵌入式系统程序员来说没有必要的模块。

  Adafruit的目标是提供一种适合于教育的语言,让开发人员能够熟练地使用嵌入式设计,而不必陷入低层次的开发细节。从它的Python传统中获得的一个令人满意的特性是它的解释性本质,它允许开发人员交互式地探索外部模块的接口。例如,电路python中的一个基本模块是板模块——一个特定于板的模块,它提供对相关的板的I / O引脚的访问。开发人员可以从控制台启动电路,导入板模块,并立即查看受支持的大头针名称(清单2)。

  > > >进口板

  > > > dir(董事会)

  (A0,“发言人”,“A1”,A2、A3、A4,sci,A5,“SDA”、“A6”,“处方”,

  A7,TX”、“光”,“A8”、“温度”、“A9”,‘BUTTON_A’,‘D4’,‘BUTTON_B’,

  “D5”、“SLIDE_SWITCH”、“D7’,‘NEOPIXEL’,‘D8’,‘D13’,‘REMOTEIN’,‘IR_RX’,

  'REMOTEOUT ',' IR_TX ',' ir_UNK ',' MICROPHONE_SCK ',' MICROPHONE_DO',

  “ACCELEROMETER_INTERRUPT”、“ACCELEROMETER_SDA’,‘ACCELEROMETER_SCL’,

  “SPEAKER_ENABLE”、“SCK’,‘莫西人’,‘味噌’,‘FLASH_CS’)

  清单2:在解释器控制台提示符(> >)中,程序员可以导入板模块并输入dir(board),以查看在特定于该模块的模块中提供的pin名。

  板模块提供了与底层硬件的连接,提供了一个简单的方法来访问Metro M0 Express和Feather M0 Express board的pin。例如,A0模拟pin被简单地引用为boarda0。另一方面,特定的硬件功能驻留在类似模拟的模块中;digitalio数字;为I2C、SPI和UART而忙碌;PWM和其他基于脉冲的协议的pulseio,等等。因此,在电路python中读取A0模拟输入就像导入相关模块和读取关联设备实例的值一样简单(清单3)。

  进口板

  进口analogio

  def adc_to_voltage(val):

  返回val / 65535 * 3.3

  adc = analogio.AnalogIn(board.A0)

  pinA0voltage = adc_to_voltage(adc.value)

  清单3:与Python一样,环行Python提供了许多高级模块,这些模块是开发人员导入自己的代码的;与Python不同的是,电路Python还提供模块,让程序员可以在ADC输入pin(boarda0)上执行硬件级操作,比如读取值(ADC . value)。

  通过直接访问模拟或数字IO引脚,开发人员可以很容易地扩展他们的硬件功能。例如,他们可以通过breadboarding an来探索模拟输出,从而使其与board的A0连接(图4)相关联,并使用类似的模块导致LED的亮起和关闭(清单4)。

  Metro M0 Express board A0模拟输出图像


  图4:开发人员可以通过连接面包上的电路(如带限流电阻的LED),快速地将外部硬件原型化到Metro M0 Express board的A0模拟输出,从而引出MCU的DAC。

  进口板

  进口analogio

  = analogio.AnalogOut(board.A0)领导

  而真正的:

  领导。值= 65535 #最大亮度

  睡觉时间(0.5秒)持续1 / 2秒

  领导。值= 0 # off

  时间。睡眠(0.5)# 1/ 2秒

  清单4:在图4中所示的面包板电路中,开发人员使用电路python类似的模块,创建一个类似的类实例(led),绑定到板的A0引脚,并修改其值属性以控制led亮度。

  大多数现代的“智能”传感器和执行器提供I2C或SPI接口来读取、写入和监视外围设备。尽管开发人员可以轻松地将设备连接到面板的SPI或I2C接口,但软件接口可能需要额外的努力。

  为了减少这种努力,Adafruit为许多受欢迎的设备提供了电路python模块,如硅实验室SI7021温度/湿度传感器。与模拟I / O模块一样,SI7021电路python模块允许程序员在定义所需的I2C接口对象(清单5)后,仅仅使用对应的类对象的一个实例访问传感器。

  进口adafruit_si7021

  从busio进口I2C

  从进口SCL,SDA

  #创建I2C接口对象

  SDA i2c = i2c(sci)

  使用它来实例化传感器对象

  传感器= adafruit_si7021.SI7021(i2c)

  #并执行传感器测量

  current_temperature = sensor.temperature

  current_relative_humidity = sensor.relative_humidity

  清单5:Adafruit开源软件存储库提供了电路python模块,可以使用硅谷的SI7021传感器简化对附加硬件功能的访问,比如温度和湿度测量。

  虽然主要作为一个学习平台,Adafruit板和电路python开源库的组合可以用于创建相当复杂的物联网设备和其他嵌入式设计。与此同时,开发人员需要认识到一种解释型语言如MicroPython / CircuitPython具有显著的限制在其满足硬实时要求的能力。然而,对于许多嵌入式应用程序来说,这个学习平台提供了一个坚实的扩展基础。

  为了增加硬件功能,开发人员可以在羽毛M0 Express板上堆叠可用的Adafruit羽翼子卡,甚至可以使用羽翼Proto原型板添加他们自己的电路。为了增加对电路中额外硬件功能的支持,开发人员需要创建自定义软件来添加所需的底层驱动程序。然而,即使是这样的努力也被开源库和Python本身的本质结合在了一起。

  通过检查开源库,程序员可以研究用于实现硬件支持的关键设计模式。例如,Adafruit的SI7021模块演示了一个适当的“python”类结构,包括构造函数和helper函数(清单6),通过这种方法,开发人员可以通过最少的努力添加自己的硬件。

  从micropython进口常量

  进口ustruct

  导入系统

  从adafruit_bus_device。i2c_device进口I2CDevice

  湿度=常量(0 xf5)

  温度=常量(0 xf3)

  以_RESET =常量(0 xfe)

  _READ_USER1 =常量(0 xe7)

  _USER1_VAL =常量(0 x3a)

  def _crc(数据):

  crc = 0

  字节的数据:

  crc ^ =字节

  因为我在范围(8):

  如果crc & 0 x80:

  crc < < = 1

  crc x131 ^ = 0

  其他:

  crc < < = 1

  返回crc

  类SI7021:

  ”“”

  SI7021温度和湿度传感器的驱动程序。

  ”“”

  def __init__(自我、i2c、地址= 0 x40):

  自我。i2c_device = I2CDevice(i2c、地址)

  self.init()

  自我。_measurement = 0

  def init(自我):

  self.reset()

  确保USER1设置是正确的。

  而真正的:

  当重新启动时,传感器不会响应读取或写入。

  试一试:

  中bytearray(data =[_READ_USER1])

  与自我。i2c_device i2c:

  i2c。写(数据,停止= False)

  i2c.read_into(数据)

  值=数据[0]

  除了OSError e:

  如果e。args[0]不在(I2C总线错误,19):# errno 19 ENODEV

  升起

  其他:

  中断

  如果价值!= _USER1_VAL:

  提高运行时错误(“不好的USER1寄存器(% x!=% x)”“%(

  价值,_USER1_VAL))

  def _command(自我、命令):

  与自我。i2c_device i2c:

  i2c.write(ustruct。包(B、命令)

  def _data(自我):

  data =中bytearray(3)

  [0]= 0 xff数据

  而真正的:

  在忙碌的时候,传感器没有响应读取。

  试一试:

  与自我。i2c_device i2c:

  i2c.read_into(数据)

  除了OSError e:

  如果e。args[0]不在(I2C总线错误,19):# errno 19 ENODEV

  升起

  其他:

  如果数据[0]!= 0xff:# Check如果读取成功。

  中断

  价值,校验和= ustruct。解压缩(> HB,数据)

  如果校验和!(2):= _crc(数据):

  提高ValueError(CRC不匹配)

  返回值

  def重置(自我):

  self._command(_RESET)

  @ property

  def relative_humidity(自我):

  “以百分比来衡量相对湿度。”

  self.start_measurement(湿度)

  值= self._data()

  自我。_measurement = 0

  返回值* 125 / 65536 - 6

  @ property

  def温度(自我):

  “测量温度在摄氏温度。”

  self.start_measurement(温度)

  值= self._data()

  自我。_measurement = 0

  返回值* 175.72 / 65536 - 46.85

  def start_measurement(自我):

  ”“”

  开始测量。

  开始测量“湿度”或“温度”

  取决于“什么”的论点。立即返回,

  测量结果可与之进行检索

  “温度”和“relative_humidity“属性。这种方式

  将花费更少的时间。

  如果你想开始测量,这是很有用的,但是不要

  希望调用阻塞,直到度量就绪,例如,

  当你同时做其他事情的时候。

  ”“”

  如果没有(湿度、温度):

  提高ValueError()

  如果不是self._measurement:

  self._command(什么)

  elif自我。_measurement !=是什么:

  提高运行时错误(“其他方面的度量”)

  自我。_measurement =什么

  清单6:添加自定义硬件CircuitPython应用程序,开发人员可以把开源软件如Adafruit CircuitPython司机的SiLabs si7021,这表明关键设计模式设计一个传感器硬件类(si7021)与隐式(__init__)和显式(init)构造函数和访问硬件本身在串行总线(在这种情况下,I2C总线)。

  其他模块,特别是在库的硬件抽象层(HAL)中,提供低级的C语言服务和钩子,以实现对物理硬件的访问。在完成自定义模块之后,开发人员可以利用可获得的步骤,描述在Python、MicroPython和电路Python中使用特定的钩子,将定制的C和Python代码添加到环境中。尽管增强过程在这一点上结束于桌面或服务器Python环境,但是嵌入式环境需要使用增强的代码映像来更新板的固件。

  Adafruit提供了一个内置的引导加载程序,它可以自动加载USB闪动格式(UF2)图像。开发人员通过按两次的“重置”按钮触发引导加载程序进程,这会导致一个新的“引导”可移动驱动器出现在用户的主机文件系统中。开发人员只需要将UF2映像从主机系统拖放到表示该板的可移动驱动器上(图5),这与最初加载电路的过程是一样的。在这种情况下,开发人员只需删除使用自定义代码构建的UF2映像。引导加载程序自动进行,以使用新映像对板进行flash。

  Adafruit的图像通过提供引导加载程序来简化闪烁


  图5:Adafruit通过提供一个引导加载器来简化屏幕,当按下这个按钮时,它会启动一个可移动驱动器,以显示在他们的文件系统中(这里显示的MAC OS),开发者只需放弃他们新的UF2图像。


  结论

  对于希望在嵌入式设计中获得经验的开发人员来说,解决“硬”实时需求所需的工具和技术简直是多余的。与此同时,开发人员期望可以访问成熟的32位MCUs,以提供广泛的模拟和数字IO功能。

  Adafruit的开源电路python包提供了一个更简单的开发环境,能够满足这些更简单的需求。通过将电路与Adafruit的Metro M0 Express或Feather M0 Express开发板结合起来,新开发人员可以快速获得嵌入式系统的经验,而经验丰富的开发人员可以快速构建嵌入式应用程序原型。

  环行和Adafruit开发委员会一起为嵌入式应用程序开发提供了一个可访问但又强大的平台。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值