基于聚芯SoC北斗时钟的程序流程2(1)-Syslib.c中的SysInit初始化部分

本文详细介绍了嵌入式系统启动过程,从汇编语言入口到C语言的sysInit函数,再到系统的初始化步骤,包括GPIO控制、UART初始化、时钟配置、中断控制向量表初始化等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从init.s中跳到Syslib.c中的sysInit()C语言入口函数:

      la    t0, sysInit  

      /* Jump it */

     jal   t0

      对于volatile类型的变量,系统每次用到他的时候都是直接从对应的内存当中提取,而不会利用cache当中的原有数值,以适应它的未知何时会发生的变化,系统对这种变量的处理不会做优化——显然也是因为它的数值随时都可能变化的情况。

     进入SysInit()函数后:

    关GPIO0 。

  ROM_Timimg 以及UART初始化,在UART之后利用判断

TRAP_VALUE_1和2的值是否还是原值,如果不是原值则发现缺陷,这里用循环提示,其实可以提示后退出。

     然后得到当前时钟周期,SYS_CPUPLL是保存有当前时钟频率类型的寄存器,bus_clk_rate是cpu_clk_rate的一半,clkperusec = bus_clk_rate / 1000000;得到没微秒执行的周期数。

eraDevInit(); 初始化中断控制向量表,然后初始化TLB、Cache、各种异常向量表,还有中断处理函数向量表。

  for(i = 0; i < IV_ERASOC_MAX; i++)
        eraIntTbl[i] = (U32 *)sysReservedHandler;

  将每个中断处理函数都指向   sysReservedHandler系统保留的默认的中断处理函数,继而针对每个特定的中断处理函数单独初始化。然后使能特定中断2~7。

然后初始化Uart,虚拟内存图(Initialise "virtual memory" maps)vminit(), 内存分配kmeminit(),

   eraTimerInit(); 设置中断事件周期数,eraTimerClkPerTick = (bus_clk_rate / OS_TICKS_PER_SEC);eraTimerIntEnable();    eraTimerClkPerTick周期中响应一次中断,也就是没秒钟有OS_TICKS_PER_SEC时钟中断。

    然后start floating point function

    read_32bit_cp1_register(uiFCR,R_C1_FCSR);        //start floating point function
   sysPrintf("The default R_C1_FCSR: 0x%x/n", uiFCR);
   //uiFCR &= (~M_FCSREnaI);
   uiFCR = M_FCSRFS | M_FCSRImpl;
   write_32bit_cp1_register(R_C1_FCSR, uiFCR);

   然后开GPIO0,era_writel(era_readl(ERASOC_GPIO0_MUXEN) &~ 0x00000028, ERASOC_GPIO0_MUXEN);  从3端口输出,5端口输入。

        erasoc_gpio_set_output(3);
        erasoc_gpio_write(3, 0);
        erasoc_gpio_set_input(5);

----------------

然后初始化LCD液晶屏显示,LCD接的的GPIO2端口,在PSB_PIN信号口些0然后写1,(先清屏,再置屏亮)

lcd_set_gpio(PSB_PIN, S_MODE);
    delay(300);
cd_set_gpio(PSB_PIN, P_MODE);

然后lcdreset();                    //初始化LCD屏

void lcdreset()    
{
    //int i;
    //int temp;
    delay(2000);
    write_com(0x30);     // 0011 0000
    delay(10);             //选择基本指令集
    write_com(0x30);       //选择8bit数据流
    delay(5);
    write_com(0x0c/*0x0F*/);       //开显示(无游标、不反白)
    delay(10);
    write_com(0x01);       //清除显示,并且设定地址指针为00H
    delay(500);
    write_com(0x06);//指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位
    delay(10);    

}
最后ds_rtc_init()初始化时钟Real-Time Clock,完成基本的配置。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值