- 打卡等级:常住居民III
- 打卡总天数:143
- 最近打卡:2026-03-08 08:36:28
已绑定手机
论坛元老
- 积分
- 3529
|
发表于 2025-12-27 20:16:30
|
显示全部楼层
怎么移植?
首先定义1ms的定时器中断:
set_timer_mode(Timer0, "1ms", Timer_End);//设定定时器0定时时间为1ms
// 函数介绍:设置定时器模式,支持参数乱序输入和默认值配置功能
// 默认值为1s定时,打开中断,关闭时钟输出功能。即set_timer_mode(Timer0, Timer_End);
// 等效于:set_timer_mode(Timer0, "1s", Dis_OutClk, En_Int, Timer_End);
// 下面这个例子的功能是设置Timer0为1000hz的定时器。
// set_timer_mode(Timer0, "1000hz", Timer_End);
// 下面这个例子的功能是设置Timer0为10ms的定时器。
// set_timer_mode(Timer0, "10ms", Timer_End);
void set_timer_mode(timer_num num, ...)
{
char *arg;
char enable_interrupt = 0, enable_outclk = 0, _char = 0; // 中断使能和输出时钟使能
int ct_mode = 0; // 定时器/计数器模式切换
int _sw_dat = 0; // 设置值缓存
float _set_timer_value = 0, set_timer_value = 0; // 缓存和定时器设置值
va_list args; // 可变参数列表
va_start(args, num); // 初始化可变参数列表
get_main_fosc(); // 获取当前时钟主频
enable_interrupt = 1;enable_outclk = 0;set_timer_value = 1.0f;// 默认为打开中断,关闭时钟输出,定时时间默认为1秒
while (1)
{
arg = va_arg(args, char *);
if (sscanf(arg, "en%c", &_char) == 1)break;//遇到哨兵值,结束
enable_interrupt = sscanf(arg, "\x01int%d", &_sw_dat) == 1 ? _sw_dat : enable_interrupt;//设置是否中断使能
enable_outclk = sscanf(arg, "\x01outclk%d", &_sw_dat) == 1 ? _sw_dat : enable_outclk;//设置是否时钟输出使能
ct_mode = sscanf(arg, "ct%d", &_sw_dat) == 1 ? _sw_dat : ct_mode;//设置是定时还是计数模式
if(sscanf(arg, "%f%c", &_set_timer_value, &_char) == 2){// 单位处理
if(_char == 'u')set_timer_value = _set_timer_value * 1e-6f;// 微秒
if(_char == 'm')set_timer_value = _set_timer_value * 1e-3f;// 毫秒
if(_char == 's')set_timer_value = _set_timer_value;// 秒
if(_char == 'h')set_timer_value = 1.0f/_set_timer_value;}// 赫兹转换时间单位
}
timer_setting(num, enable_outclk, enable_interrupt);// 设置定时器模式
timer_value_setting(num, set_timer_value, ct_mode); // 设置定时器值
va_end(args); // 清理可变参数列表
}
|
|