关于单片机那些事?

关于周期时间

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

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

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

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

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

关于定时器的使用

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

rt_tick_t start;
start = rt_tick_get()

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


}
else
{


}

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

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

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秒定时器  时间到了  会自用调用 回调函数   

用于单一定时

#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;
}

关于单片机中内存使用情况

每个工程文件编译后都会有一个.map的文件,如图

Total RO  Size (Code + RO Data)                98900 (  96.58kB)

表示flash大小  如图二最大为256KB

Total RW  Size (RW Data + ZI Data)              9608 (   9.38kB) 

表示SRAM的大小,表示已经初始化和未初始化的

Total ROM Size (Code + RO Data + RW Data)      99168 (  96.84kB)
表示存储在ROM中,上电后会运行到RAM中运行的大小,就是存放到flash中的数据运行到SRAM中

关于map文件的其他分析见:

KEIL Map文件解析以及如何从Map文件还原内存分布-CSDN博客

keil5 分析map文件_.map文件-CSDN博客

关于单片机中堆栈分配

每个工程都会有一个启动文件.S,这里面包含堆栈的分配情况

或者持续追踪堆栈指针sp的地址情况,观察是否有溢出

更多内容见:

STM32的启动过程 — startup_xxxx.s文件解析(MDK和GCC双环境)_stm32 .s文件-CSDN博客

使用MDK观察单片机堆栈使用情况_keil5中如何查看使用了多少堆栈-CSDN博客

关于单片机中那些晶振时钟源的使用

时钟源:

  • 内部时钟源: 单片机内部集成的振荡器,通常是RC振荡器或晶体振荡器。内部时钟源方便,但可能精度不如外部晶振。

  • 外部时钟源: 外部连接的晶振或其他外部时钟信号。外部时钟源通常提供更高的精度和稳定性

HSI(High Speed Internal Clock)高速内部时钟:

HSI时钟信号由内部8MHz的RC振荡器产生。
HSI时钟可以直接作为系统时钟(SYSCLK),或者在2分频后作为PLL(锁相环)的输入

HSE(High Speed External Clock)高速外部时钟:

HSE时钟来自外部的无源晶振,其频率范围通常在4MHz到16MHz之间,但常用的是8MHz。HSE时钟可以不分频或进行2分频(频率/2)后作为PLL的输入,也可以直接作为系统时钟(SYSCLK),或进行128分频后作为外设RTC(实时时钟)的时钟输入

LSE(Low Speed External Clock)和LSI(Low Speed Internal Clock)低速时钟:

LSE是一个低速的外部时钟源,通常由一个32.768kHz的低速外部晶体或陶瓷谐振器提供。它为实时时钟(RTC)或其他需要低功耗且精确时钟的定时功能提供时钟源。
LSI是一个低功耗的内部时钟源,它可以在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。LSI的时钟频率大约在30kHz到60kHz之间,但通常约为40kHz

PLL(Phase Locked Loop)锁相环时钟:

PLL时钟的源可以是HSI/2或HSE。PLL可以对输入的时钟信号进行倍频,以产生更高频率的时钟信号,从而提高系统的性能

关于flash中的分配使用情况

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值