你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

转发;ARM®mbed OS入门开发(二)简单上手

[复制链接]
anywill 提问时间:2016-10-9 21:37 /
本帖最后由 anywill 于 2016-10-10 09:11 编辑

ARM®mbed OS入门开发(二)简单上手2016-09-13 Summerain [url=]小白学嵌入式[/url]
【首次使用】
1. 官网 mbed.org 注册一个账号。账号登陆后,点击右上角的“Compiler”便可打开mbed的web IDE。
   1.png   
2. 添加正在使用且mbed enabled的开发板到mbed:
点击“Platforms”,进入选择开发板,然后在开发板页面右侧,看到“Add to your mbed Compiler”按钮,点击即可进入IDE。

Tip:之后的应用均在STM32F103 NUCLEO的开发板上进行:
2.png
【学习计划】
为了上手使用mbed OS,可以采取如下的学习路线:
1. Digital input and output
2. Analog input and output
3. Pulse width modulation(PWM)
4. GPIO Interrupt
5. Timer
6. UART Communication
7. SPI Communication
8. I2C Communication
9. mbed RTOS
        9.1 Thread synchronization
        9.2 Thread communication
        9.3 ISR
10. Bluetooth Low Energy (BLE)
11. mbed network
12. TCP application
... ...

【一】Digital Input and Output
这部分主要是熟悉一下如何使用mbed OS的API,基本的数字输入输出。相当于第一个程序“Hello word!”。
进入IDE,在使用的开发板(NUCLEO-F103RB)下面选择New新建项目,可以选择模板 "Blinky LED Hello Word"

3.png
接着就会导入mbed目录和main.cpp.
4.png
关于mbed目录的内容上一期已经提到,项目中的结构也一一对应:

我们重点看一下这个Blinky LED的main.cpp:
#include "mbed.h"
DigitalOut myled(LED1);
int main() {
    while(1) {
        myled = 1; // LED is ON
        wait(0.2); // 200 ms
        myled = 0; // LED is OFF
        wait(1.0); // 1 sec
    }
}
上面的程序是基于mbed API写的,可以看到非常简洁。首先建立DigitalOut的对象myled,并指定LED1作为数字输出口,在main函数的while循环里分别将对象值赋值为1和0,来控制灯的亮灭。

实际上,mbed API是对mbed HAL API的进一步封装,如果读者对上一期的【mbed library的层次结构】还有印象的话,HAL API这一层是“MCU无关层”的最底层,它的接口定义对于不同的开发板是一样的,但是其HAL API的实现(mbed HAL implementation)是"MCU相关层"。为了对比上面使用mbed API接口的程序,我使用HAL层的接口写了如下具有同样功能的一段程序:
#include "mbed.h"
int main()
{
    gpio_t obj;
    gpio_init(&obj,LED1);
    if(LED1!=NC) {
        gpio_write(&obj,0);
        gpio_dir(&obj,PIN_OUTPUT);
        gpio_mode(&obj,PullNone);
    }
    while(1) {
        gpio_write(&obj,1);
        uint32_t start1=us_ticker_read();
        while((us_ticker_read()-start1)<(uint32_t)(0.2*1000000.0f));
        gpio_write(&obj,0);
        uint32_t start2=us_ticker_read();
        while((us_ticker_read()-start2)<(uint32_t)(1*1000000.0f));
    }
}
看到上面的程序依然没有直接读取寄存器,但是比起使用mbed API,代码行数增加很多,可见mbed对底层可以说是极致的封装。至于CMSIS-CORE,则是直接对硬件进行抽象,并提供了处理器和外围寄存器之间的接口。芯片厂商提供设备的同时都会包含CMSIS-CORE和CMSIS设备特定文件的源包。因此每一个MCU都有独立的CMSIS文件。如果有兴趣,还可以使用CMSIS CORE写一个Blinky程序。

总结:mbed API对底层的封装目的就是使得程序更大限度的“MCU无关”。也就是说,不需要使用CMSIS甚至是HAL API,而是直接通过mbed API设计程序就可以了。当然仍然有一些比较少见的情况需要使用CMSIS函数,例如__disable_irq()或者NVIC_SystemReset()。

附:【mbed API中部分数字输入输出接口函数和使用方法】
(1)数字输入:DigitalIn(PinName pin);
//Create a DigitalIn connected to the specified pin
例: DigitalIn Switchinput(USER_BUTTON);  
//Setting the pin USER_BUTTON as Digital input.
if(Switchinput==1)
... ...;
else
... ...;
DigitalIn(PinName pin, PinMode mode);
//其中,mode有:PullUp, PullDown, PullNone, OpenDrain
int read(); //Read the input, represented as 0 or 1 (int)
(2)数字输出:DigitalOut(PinName pin);
DigitalOut(PinName pin, PinMode mode); 其他同理。
(3)DigitalInOut(PinName pin); 数字复用口。
(4)BusOut(PinName p0, PinName p1, PinName p2, PinName p3, PinName p4, PinName p5, PinName p6, PinName p7, PinName p8, PinName p9, PinName p10, PinName p11, PinName p12, PinName p13, PinName p14, PinName p15);
BusOut(PinName pins[16]);
(6)BusIn(PinName pins[16]);
(7)BusInOut(PinName pins[16]);

作者微信:
微信截图_20161010090612.png
aa867b1.jpg
收藏 1 评论10 发布时间:2016-10-9 21:37

举报

10个回答
anywill 回答时间:2016-10-9 21:38:29
占楼,随后更改
zengyi703-16313 回答时间:2016-10-10 08:12:02
学习一下子
高二毛 回答时间:2016-10-10 08:33:39
感谢分享,学习
stary666 回答时间:2016-10-10 09:07:56
顶一下,,,,,,,,
zhangdaijin 回答时间:2016-10-10 09:32:59
slotg 回答时间:2016-10-10 09:41:50
很不错的帖子,感谢分享。
eczc2015 回答时间:2016-10-10 10:43:09
marking and thinking and making ,replying
xyx365 回答时间:2016-10-10 10:54:11
不错的教程
埃斯提爱慕 回答时间:2016-10-10 18:11:11
提示: 作者被禁止或删除 内容自动屏蔽
fdsfdsf344 回答时间:2018-9-15 15:36:20
谢谢分享

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版