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

查看: 2226|回复: 6

转发:ARM®mbed OS入门开发(四)Timer

[复制链接]

61

主题

1071

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2016-10-10 08:37:10 | 显示全部楼层 |阅读模式
本帖最后由 anywill 于 2016-10-19 10:21 编辑

ARM®mbed OS入门开发(四)2016-09-27 Summerian [url=]小白学嵌入式[/url]
【五】Timer
这一部分说Timer,应该说是时钟系统。当我们在设计程序用到时钟系统的时候,我们在用什么?事实上,相比意义不大的系统的时间点,我们更关注时间间隔——interval。举个栗子,我们希望有些任务可以在固定时间间隔发生;或者后续任务在前面任务发生后的一定时间间隔后发生;或者根据两个任务发生的时间间隔,系统做出下一步判断等。

mbed提供了三个对象用来完成和时间相关的功能:
1. Timer,用来给系统计时,包括:
Timer();//构造函数,实例化Timer对象
void start();//开始计时
void stop();//停止计时
void reset();//重新计时
float read();
//读取计时开始后,即从执行start()后过去的时间,单位是秒
int read_us();
//读取计时开始后过去的时间,单位是微秒
2. Ticker,用来在固定时间间隔执行特定函数;
3. Timeout,用来在给定的时间执行特定函数(倒计时执行,相当于只执行一次的Ticker)
由于2和3基本类似,就Ticker的使用方法描述:
Ticker();
//构造函数,实例化Ticker对象,可以隐式调用
void attach(void (*fptr)(void), float t);
//设定每t秒的时间间隔,需要执行的函数,用函数指针作为参数
void attach_us(void (*fptr)(void), unsigned int t);
//同理,设定每t微妙的时间间隔

对于开始说的栗子,如果是固定时间间隔,我们可以使用Ticker:
每隔0.5秒,led闪烁一次:
DigitalOut led1(LED1);
Ticker timer_led;
void led_flip(){
    led1=!led1;
}
int main() {
    timer_led.attach(&led_flip,0.5);
    while (1);
}

如果是希望根据一段时间间隔的长度进行操作:
距离上次led闪烁的时间超过2s,再次闪烁
Timer timer;
DigitalOut led(LED1);
int blinky(){
    led =! led;
}
int main(){
    timer.start();
    while(1){
        if(timer.read()>2){
            blinky();
            timer.reset();
        }
    }
}


【六】UART communication
Uart(Universal Asynchronous Receiver/Transmitter)通用异步收发器。用来进行异步串口通信的设备,全双工方式。发送“TX”,接受“RX”,地陷“GND”,异步总线,没有时钟同步线。硬件实现上有RS-232通信接口和USB转串口通信接口。

UART将传输数据的每个字符以串行方式一位接一位的传输。UART首先将接收到的并行数据转换成串行数据(parallel-to-serial converter)来传输。从一个低位起始位开始,后面是5~8个数据位,一个可用的奇偶位和一个或几个高位停止位。在接收过程中,UART从消息帧中去掉起始位和结束位,对进来的字节进行奇偶校验,并将数据字节从串行转换成并行。通过波特率Baud来控制传送数据的速率(Baud本身已是速率,所以不需要写成 Baud Rate,概念上不同与比特率)。

mbed API中,使用Serial对象收发数据:
//构造函数定义:
Serial(PinName tx, PinName rx, const char *name=NULL);
//设置波特率,即一秒钟传输实际数据的比特数:
void baud(int baudrate);
//设置传输格式:比特数,奇偶校验,停止位(默认8比特,无奇偶校验位,1位停止位):
void fomat(int bits=8, Parity parity=SerialBase::None, int stop_bits=1);
// 设置 UART中断,串口只要有数据的时候通知程序,执行中断函数,IrqType决定了是哪个Serial Interrupt, 举例来说,RxIrq是接收数据中断TxIrq是发送数据中断(传送Buffer空):
void attach(void (*fptr)(void), IrqType type=RxIrq);
int getc(); //读取一个字符
int putc(int c);//发送一个字符
int readable();//判断是否有数据到达
int prinf(const char *fomat, ...);//格式化Uart的输出,参数等同标准C的printf
int scanf(const char *fomat, ...);
//中断方式读取数据:
Serial pc(SERIAL_TX,SERIAL_RX);
DigitalOut led(LED1);
void ECHO_UART() {
     pc.putc(pc.getc()); //输入回显
}
int main()
    {
        pc.baud(9600);
        pc.printf(“Please input!”);
        pc.attach(&ECHO_UART, SerialBase::RxIrq);
        //设定RxIrq,只要接收到数据,就会产生中断
        while(1) {
            led=0;
                wait(0.1);
            led=1;
               wait(0.1);
        }
    }
Serial的其他使用,可以参考Serial.h SerialBase.h.


回复

使用道具 举报

100

主题

3617

回帖

1

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-10-10 09:08:20 | 显示全部楼层
顶一下,,,,,,,,
回复 支持 反对

使用道具 举报

31

主题

1951

回帖

0

蝴蝶豆

论坛元老

最后登录
2020-12-4
发表于 2016-10-10 09:31:36 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

26

主题

1984

回帖

6

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2016-10-10 09:42:23 | 显示全部楼层
很不错的帖子,感谢分享。
回复 支持 反对

使用道具 举报

0

主题

159

回帖

0

蝴蝶豆

高级会员

最后登录
2017-3-9
发表于 2016-10-10 10:55:17 | 显示全部楼层
不错的教程
回复 支持 反对

使用道具 举报

0

主题

7

回帖

0

蝴蝶豆

初级会员

最后登录
2020-8-14
发表于 2018-4-26 14:30:33 | 显示全部楼层
顶顶顶
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
2018-8-6
发表于 2018-8-2 17:13:12 | 显示全部楼层
每一贴都有看,学习了
回复 支持 反对

使用道具 举报

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版