【龙芯1c库】封装软件延时接口和使用示例

龙芯1c库是把龙芯1c的常用外设的常用功能封装为一个库,类似于STM32库。Git地址:https://gitee.com/caogos/OpenLoongsonLib1c

程序中难免会用到延时函数,一般通过执行n个nop指令实现延时。为此封装了delay_us(i), delay_ms(i), delay_s(i)三个函数,分别延时ius, ims, is。并测试了几个函数的延时精度,除了延时时间为几微秒时,精度稍微差一些之外,其它延时时间长度,误差都尽量控制在了一两个单位之内。

本文先讲解封装的延时接口函数如何使用,再展示测试的效果,再分析延时函数的源码,最后再尝试着优化并给出优化后的代码和测试结果。

龙芯1c库中软件延时接口使用示例

软件延时接口简介

共提供三个接口,微秒,毫秒,秒三个级别的延时各一个,如下

/*
 * 延时指定时间,单位ms
 * @j 延时时间,单位ms
 */
void delay_ms(int j);


/*
 * 延时指定时间,单位us
 * @n 延时时间,单位us
 */
void delay_us(int n);


/*
 * 延时指定时间,单位s
 * @i 延时时间,单位s
 */
void delay_s(int i);

比如,延时50us,调用语句为delay_us(50);

延时50ms,调用语句为delay_ms(50);

延时1s,调用语句为delay_s(1);

为每个接口设计了一个测试用例,通过延时指定时间将gpio拉低拉高,用示波器观察波形的方式来测试,微秒和毫秒的用例里面依次产生占空比为0.5,周期为2个单位,10个单位,100个单位和500个单位的pwm波形。秒的测试用例里只产生周期2s和10s的pwm。

测试delay_ms()

测试代码

// 测试延时函数delay_1ms()
void test_delay_1ms(void)
{
    unsigned int gpio = 6;
    int time = 0;

    gpio_init(gpio, gpio_mode_output);
    gpio_set(gpio, gpio_level_high);

    // 产生不同宽度的高低电平,用示波器观察高低电平宽度是否正确
    while (1)
    {
        // 2ms
        time = 2/2;
        delay_ms(time);
        gpio_set(gpio, gpio_level_low);
        delay_ms(time);
        gpio_set(gpio, gpio_level_high);

        // 10ms
        time = 10/2;
        delay_ms(time);
        gpio_set(gpio, gpio_level_low);
        delay_ms(time);
        gpio_set(gpio, gpio_level_high);

        // 100ms
        time = 100/2;
        delay_ms(time);
        gpio_set(gpio, gpio_level_low);
        delay_ms(time);
        gpio_set(gpio, gpio_level_high);

        // 500ms
        time = 500/2;
        delay_ms(time);
        gpio_set(gpio, gpio_level_low);
        delay_ms(time);
        gpio_set(gpio, gpio_level_high);        
    }
}

测试结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值