龙芯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);
}
}