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

[Nucleo 开发日志 ] + 最新的Nucleo-F091RC 例程大放送(1)  

[复制链接]
harvardx 发布时间:2015-1-24 14:27
阅读主题, 点击返回1楼
收藏 6 评论47 发布时间:2015-1-24 14:27
47个回答
damiaa 回答时间:2015-1-24 22:27:38
ST目前推广力度和新品发布速度都比较快。大家有福了。哈哈。
harvardx 回答时间:2015-1-24 22:45:10
插播一下啊, 关于mbed来开发nucleo 091的基础知识补充.什么是mbed, 大家可以去 mbed中国 了解详情:

关于例程中的ticker 其实就是定时器,大家可以看下面的详细说明:
mbed 时钟系统

微处理器的大量应用都和时间相关,如我们前面代码中多次出现的wait函数就是最常用的时间等待函数,显然,精确的时间等待必须建立在精确的计时技术上,这就需要用到计数器系统。

计数器的工作原理非常简单,就是每当它接收到一个脉冲时,它的计数值加一,一旦它的计数值达到用户设定的阈值,计数器就会产生一个中断信号让系统处理并重新从0开始计数。根据计数器可设定阈值的大小,我们可以把计数器分成8位计数器,16位计数器等,8位计数器可设定的最大阈值为2^8-1即255,16位则为65535。如果我们给定的脉冲信号频率为1M,而给定的计数器阈值为0,那么计数器就会每1us产生1个中断信号,这就为系统计时产生了依据。对于xbed LPC1768来说,它有四个通用计时器,它们可以用来计时、PWM输出等。



除了wait相关的等待函数以外,mbed还提供了三个对象用来完成和时间相关的功能,分别是Timeout,用来在给定的时间执行特定函数;Ticker,用来定时执行特定函数;Timer,用来给系统计时,它们可用的方法描述如下:

类名

方法

用途

Timer

Timer();

构造函数,实例化Timer对象

void start();

开始计时

void stop();

停止计时

void reset();

重新计时,即把时间计数恢复从0,如果原来处于start状态,那么计时继续

float read();

读取计时开始后过去的时间,单位是秒

int read_ms();

读取计时开始后过去的时间,单位是毫秒

int read_us();

读取计时开始后过去的时间,单位是微秒

operator float();

操作符重载,相当于read

Ticker

Ticker();

构造函数,实例化Ticker对象

void attach(void (*fptr)(void), float t)

设定每t秒需要执行的函数

void attach_us(void (*fptr)(void), unsigned int t)

设定每t微秒需要执行的函数

void detach();

取消本对象需要定时执行的函数

Timeout

Timeout();

构造函数,实例化Timeout对象

void attach(void (*fptr)(void), float t)

设定t秒后需要执行的函数

void attach_us(void (*fptr)(void), unsigned int t)

设定t微秒后需要执行的函数

void detach();

取消本对象需要执行的函数

mbed Timer的应用

mbed的Timer对象主要用来计算用户关心的时间间隔,下面是一个简单的示例,可以计算用户按下按钮的时间,主要代码如下:

Serial pc(USBTX,USBRX);

InterruptIn btn(P2_8);

Timer mytimer;

int falltime;

int risetime;

void fallfunc()

{

    falltime=mytimer.read_us();

}

void risefunc()

{

    risetime=mytimer.read_us();

    pc.printf("You press button for %d us \n",risetime-falltime);

}

int main() {

    mytimer.start();

    btn.fall(&fallfunc);

    btn.rise(&risefunc);

    while (1);



}

程序运行的结果如下,当然,我们需要理解,任何中断的处理都有一定的延迟时间,所以此结果还是会有一定的误差,但绝对在us级别。

You press button for 330410 us

You press button for 137603 us

You press button for 122679 us

You press button for 140683 us

有时候我们需要利用多个Timer来计算不同的时间,这只需要定义多个Timer对象即可:

Timer timer_led;

Timer timer_serial;

DigitalOut led1(LED1);

Serial pc(USBTX,USBRX);

void task_led(void)

{

    led1=!led1;

}

void task_serial(void)

{

    pc.printf("Timer passed %d ms \n",timer_serial.read_ms());

}

int main()

{

    timer_led.start();

    timer_serial.start();

    while (1)

    {

        if (timer_led.read()>0.5)

        {

            task_led();

            timer_led.reset();

        }

        if (timer_serial.read()>1)

        { //test Timer value

            task_serial();

            timer_serial.reset();

        }

    }



}

mbed Timeout的应用

mbed的Timeout对象主要用来在给定的时间后执行给定的函数,如下面的测试代码,运行后你会发现xbed LPC1768的四个led分别点亮,由于timeout只会被执行一次,所以点亮后会保持不变:

DigitalOut led1(LED1);

DigitalOut led2(LED2);

DigitalOut led3(LED3);

DigitalOut led4(LED4);

Timeout timer_led1;

Timeout timer_led2;

Timeout timer_led3;

Timeout timer_led4;

void led1flip()

{

    led1=!led1;

}

void led2flip()

{

    led2=!led2;

}

void led3flip()

{

    led3=!led3;

}

void led4flip()

{

    led4=!led4;

}

int main() {

    timer_led1.attach(&led1flip,0.5);

    timer_led2.attach(&led2flip,0.5*2);

    timer_led3.attach(&led3flip,0.5*4);

    timer_led4.attach(&led4flip,0.5*8);

    while (1);



}

mbed Ticker的应用

mbed的Ticker对象主要用来执行各类需要定期执行的函数,它和Timeout的唯一不同就是Timeout相关的函数只会被执行一次,而Ticker相关的则会被定期执行,如下面的测试代码,运行后你会发现xbed LPC1768的四个led将按照不同的频率变换:

DigitalOut led1(LED1);

DigitalOut led2(LED2);

DigitalOut led3(LED3);

DigitalOut led4(LED4);

Ticker timer_led1;

Ticker timer_led2;

Ticker timer_led3;

Ticker timer_led4;

void led1flip()

{

    led1=!led1;

}

void led2flip()

{

    led2=!led2;

}

void led3flip()

{

    led3=!led3;

}

void led4flip()

{

    led4=!led4;

}

int main() {

    timer_led1.attach(&led1flip,0.5);

    timer_led2.attach(&led2flip,0.5*2);

    timer_led3.attach(&led3flip,0.5*4);

    timer_led4.attach(&led4flip,0.5*8);

    while (1);



}

我们在使用Ticker对象的过程中还可以随时对Ticker设定的间隔进行更改,更改后的时间是即时生效的,如下面的代码,我们发现,用户每按一次按钮,led1的闪烁频率就会加快一倍。

DigitalOut led1(LED1);

InterruptIn btn(P2_8);

Ticker timer_led1;

float interval;

void led1flip()

{

    led1=!led1;

}

void changefred()

{

    interval=interval /2.0;

    timer_led1.attach(&led1flip,interval);

}

int main() {

    interval=2;

    btn.fall(&changefred);

    timer_led1.attach(&led1flip,interval);

    while (1);



}
harvardx 回答时间:2015-1-24 22:45:55
以上 版权归mbed中国所有.
wwff2007wwff 回答时间:2015-1-24 23:29:30
不错,学习啦,mbed的在线开发网址是 mbed.org吗?
wwff2007wwff 回答时间:2015-1-24 23:35:44
怎么知道mbed支持哪些具体的芯片呢?
harvardx 回答时间:2015-1-24 23:52:59
mbed上可以查看具体的目前已经支持的平台, platform. 目前的支持的有freescale ,nxp st,当然不是全部,以xxx开发板的名义.
拼命三郎 回答时间:2015-1-25 02:30:01
stm32.jpg
lovewyufeng 回答时间:2015-1-25 11:08:44
前来支持~~~
大秦正声 回答时间:2015-1-25 11:12:58
谢谢分享!
QianFan 回答时间:2015-1-25 11:20:35
写得很详细啊

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版