关于单片机那些事?

周期

时钟周期:也叫振荡周期,就是单片机外接晶振的倒数,如12Mhz,周期就是1/12us,最小的时间单位。频率越高,速度越快

指令周期:执行一条指令需要的时间,一般由若干个机器周期组成

机器周期:一个指令的基本操作(取指,分析,执指)所需要的时间为机器周期,一般由12个时钟周期组成 机器周期 = 12/晶振频率

总线周期:CPU通过总线对外部进行一次访问需要的时间 一个总线周期一般包含4个时钟周期

主频(时钟频率):1秒钟,时钟周期的个数为主频

关于定时器的使用

1、滴答定时器,用于单一定时

cpp 复制代码
rt_tick_t start;
start = rt_tick_get()

if(rt_tick_get() - start < 3*1000)
{


}
else
{


}

2、使用rt_thread_mdelay(),用于多个定时处理

需要创建一个独立的任务,如果需要重新定时,需要删除改线程

cpp 复制代码
rt_thread_t ruigang_output3_thread = RT_NULL; // 用于保存RUIGANG_OUTPUT3线程的句柄
void RUIGANG_OUTPUT3(void *param)
{
    while(1)
    {
        if(!pi_in.pi_close && !pi_in.pi_reset && RUIGANG_Flag)
        {
            contrl_pin(_24V_CNTL3, PIN_HIGH, PenFaTime5Sec);
            contrl_pin(_24V_CNTL3, PIN_LOW, PenFaTime3Min); 

            contrl_pin(_24V_CNTL3, PIN_HIGH, PenFaTime3Sec);
            contrl_pin(_24V_CNTL3, PIN_LOW, PenFaTime5Min);
            
            rt_pin_write(_24V_CNTL3, PIN_HIGH);
            rt_thread_mdelay(PenFaTime5Min*60);
        }
        else
        {
            continue;
        }
        rt_thread_mdelay(10);
    }
}



if (ruigang_output3_thread != RT_NULL)
    {
        rt_thread_delete(ruigang_output3_thread); // 删除当前线程
    }
    ruigang_output3_thread = rt_thread_create("RUIGANG_OUTPUT3",
                                              RUIGANG_OUTPUT3,
                                              RT_NULL,
                                              1024,
                                              PRIORITY_OUT3,
                                              10);
    if (ruigang_output3_thread != RT_NULL)
    {
        rt_thread_startup(ruigang_output3_thread); // 启动新线程
    }

3、软件定时器 1秒定时器 时间到了 会自用调用 回调函数

用于单一定时

cpp 复制代码
#include <rtthread.h>

// 定时器的回调函数
static void timer_callback(void* parameter)
{
    rt_kprintf("Timer tick\n");
}

int main(void)
{
    // 定义定时器句柄
    rt_timer_t timer;
    
    // 创建软件定时器
    timer = rt_timer_create("mytimer",    // 定时器名称
                            timer_callback,  // 定时器到期时调用的回调函数
                            RT_NULL,    // 传给回调函数的参数
                            rt_tick_from_millisecond(1000),  // 定时周期,单位为tick。这里使用1秒作为周期。
                            RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER); // 定时器标志:周期性和软件定时器

    // 判断定时器是否创建成功
    if (timer != RT_NULL)
    {
        // 启动定时器
        rt_timer_start(timer);
    }
    
    return 0;
}
相关推荐
不能跑的代码不是好代码11 小时前
STM32窗口看门狗(WWDG)知识点及标准库使用指南
stm32·单片机·嵌入式硬件
bingquan333311 小时前
在 Ghidra 中分析STM32裸机固件
stm32·单片机·嵌入式硬件
羽获飞11 小时前
从零开始学嵌入式之STM32——11.STM32---USART串行通讯
stm32·单片机·嵌入式硬件
宵时待雨13 小时前
STM32笔记归纳9:定时器
笔记·stm32·单片机·嵌入式硬件
逐步前行13 小时前
STM32_新建工程(寄存器版)
stm32·单片机·嵌入式硬件
bai54593613 小时前
STM32 CubeIDE 通过PWM占空比控制舵机角度
stm32·单片机·嵌入式硬件
松涛和鸣15 小时前
72、IMX6ULL驱动实战:设备树(DTS/DTB)+ GPIO子系统+Platform总线
linux·服务器·arm开发·数据库·单片机
简单中的复杂15 小时前
【避坑指南】RK3576 Linux SDK 编译:解决 Buildroot 卡死在 host-gcc-final 的终极方案
linux·嵌入式硬件
上海合宙LuatOS15 小时前
LuatOS核心库API——【audio 】
java·网络·单片机·嵌入式硬件·物联网·音视频·硬件工程
Hhh __灏16 小时前
stm32的SRAM内存不足如何分析和优化?堆栈空间如何优化?
单片机