当前位置:   article > 正文

arduino支持的内核版本_STM32 ARDUINO HALMX  进阶(二)和官方构架、函数、宏的兼容和增强...

arduino stm32 官方

STM32 ARDUINO HALMX 起步

http://bbs.mydigit.cn/read.php?tid=2168292

STM32 ARDUINO HALMX  进阶(一)

http://bbs.mydigit.cn/read.php?tid=2198666

STM32 ARDUINO HALMX  进阶(二)

http://bbs.mydigit.cn/read.php?tid=2207473

STM32 ARDUINO HALMX  进阶(三)

http://bbs.mydigit.cn/read.php?tid=2228640

ARDUINO HALMX 兼容性和官方函数的功能增强

一、与arduino官方实现的兼容性:

ARDUINO  HALMX 是基于STM32 arm 构架的arduino风格实现,主要针对ST官方板子如NUCLEO DISCOVERY及应用较为广泛的板子如ATKMINI等,而非官方ARDUINO stm32板子,因此尽管大部分兼容于arduino官方的实现,由于硬件的差异,在构架、函数和返回值、宏定义等还是有些差异,没有完全兼容于官方arduino,这些差异依据本说明,可以很方便的使用和移植arduio的例子应用和库:

(以下 avr指官方arduino  due指arduino due  otto  halmx 指本系统,all 指以上构架全部支持实现)

二、halmx 实现的兼容性原则:

1 最大限度兼容并增强官方代码,即如果不影响代码效率和运行速度的前提下,增强和兼容官方实现;

2 通用易用性原则,考虑面向初学者,实现通用和易用,用arduin风格来封装底层驱动;

3 用户可配置性;stm32 包含了L0 1 4 F0 1 2 3 4 7 8个系列,数百种芯片,再加上官方和非官方的的各种板子外设,几乎超过了千种,确实一个程序要在每个板子上不加修改就能正确运行是件工作量巨大的事,就像我们的pc机,几乎不用我们考虑那些硬件配置,而对单片机,刻意追求通用和可移植性会导致资源的浪费和效率的低下,但我们仍然能力求做到方便移植,这方面ST已经给我们提供了很好的基础:ST的halmx库、CubMX的可视化配置工具;还有ST的中间件如FreeRTOS STemWIN,其实从中我们能学到非常好的单片机编程方法和理念:通过配置文件宏可以实现高度可移植性!

三、构架:

我们先来看官方代码(在main.cpp):

setup();   //all

for(;;)

{

loop();    //all

if (serialEventRun) serialEventRun();  //avr/due

}

而在 我们这个实现中:

setup();   //all

for(;;)

{

loop();    //all

}

区别:

官方针对AVR构架采用了在每次执行loop后通过查询方式来确定是否有串口事件,显然这是效率低下的实现方法,而且不能及时响应,stm32有着更多的中断源和时钟源,能够更好地采用事件驱动,因此在ARM实现抛弃了if (serialEventRun) serialEventRun(); 如energia、KODUIN、teensy3、maple等;

编程中,可以将原来放在serialEventRun函数中的内容移动到loop的末尾即可;

四、官方函数和宏(仅列出区别和增强部分):

--------------------------------------  digital -------------------------------------------

1 pinMode(pin,mode):

mode:  INPUT   //高阻输入(all),在STM中如按钮;

OUPUT   //推挽输出(all);

INPUT_PULLUP   //内部弱上拉输入(halmx) 如stm32按钮输入通常不设外部上下拉电阻,因此,打开内部上下拉电阻,可屏蔽电磁干扰,消除按钮未动作时的不确定性;

INPUT_PULLDOWN //内部弱下拉输入(halmx)同上

OUTPUT_OD  //开漏输出,当有外部上拉电阻时,选用

OUTPUT_PP  //推挽输出 等同 OUTPUT;用于显式表达输出模式;

2 digitalRead(pin)/digitalWrite(pin,val)     //(all)

区别在于stm工作电压是3.3V, 因此高电平为3.3V,而avr为5V

3 digitalToggle(pin)   // 翻转端口电平(halmx) ,直接使用hal 的翻转电平功能,更加高效和方便;

对于脚号,官方arduino通常 13号是LED,   我们用过stm板子的都知道,几乎不同的板子会放在不同位置,没有办法统一,也没必要统一,但为了使用方便,有个和官方兼容的宏:LED_BUILTIN;

--------------------------------------- analogWrite-----------------------------------------

4 analogWrite(pin,val)   // 8bit(all)  16bit(halmx) ,stm即使在设定8bit方式,但内部也是16bit分辨率;

5 analogWriteResolution(bits)  //(halmx,due) STM32 pwm是16bit,因此可通过analogWriteResolution(8)或analogWriteResolution(16)来告诉系统采用8或16bit

6 setPwmFrequency(f)  //(halmx) 设定analogwrite的频率,满足特定需要缺省为1000hz

7 pwmWrite(pin,dutyCycle16Bits,frequency, durationMillis) ,事实上 analogWrite是用缺省频率和持续时间为0来调用该函数的。

相比analogWrite 更为精细控制pwm,包含了16bit的输出值dutyCycle16Bits, 频率和持续时间(0为连续)

8 Streaming 在官方版本中需要作为库引入,在halmx已内置,一点区别:endl 需要改为_endl,这是因为和Fat库endl冲突;

---------------------------------------analogRead---------------------------------------

9 analogRea(pin)  //(all)   缺省和官方一样10位精度,为发挥stm32 ADC12bit精度,可设定12bit,此外,基准电压是3.3v

10  analogReadResolution(resolution)   //(halmx)  缺省10, analogReadResolution(12)用来设定为12bit精度

关于模拟输入脚号:Ax 在官方arduino上有模拟脚编号,在stm32板子上除nucleo有兼容arduino的接口,我们也提供了这个兼容性的模拟脚编号,但对非arduino兼容接口板子,则不提供这样的编号,因此需要直接用脚号代替;

---------------------------------------SerialUART---------------------------------------------

11  STM32 部分芯片有多达6个串口,因此已内定义SerialUART1`6  共6个 SerialUART的实例;

12 stm32SetRX/stm32SetTX   // (halmx) 因为stm32 串口 rx tx可以remap到其他脚,当rx tx不是缺省的情形,需要用这两个函数设置,使系统按你remap的情形来初始化,这2个函数需要在  Serialx.begin(xxxxx) 前调用;

。。。。。。。。。。待续。。。。。。。。。。。。。

其他arduino内置函数详见:https://www.arduino.cc/en/Reference/HomePage

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/67663
推荐阅读
相关标签
  

闽ICP备14008679号