赞
踩
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。