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

查看: 2238|回复: 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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版