上传下这两天写的驱动程序----ARM Cortex-M3 驱动 并行IO口 RTC

    技术2026-06-12  0

       这是我第一次看元器件的数据手册,按数据手册上的时序图,一步步写出来的驱动程序,搞了我2天时间了。我用的主芯片是LM3S9B92,时钟模块是BQ3287,(这驱动也可以驱动DS12C887 RTC模块)!

     

    #include<inc/lm3s9b92.h>#include"HC204Llcd.h"#include"Sys_init.h"#include"define_init.h"#include"BQ3287.h"

    static void Delay_1um(void){    asm("nop");}

    static void BQ3287_Delay(unint delayTime){    unsigned int i=0;    for(i = 0; i < delayTime; i++)    {        Delay_1um();    }    }static void BQ3287_checkbusy(void){  unchar temp;  GPIOPinWrite(GPIO_PORTB_BASE, CS, 0x00);  GPIOPinWrite(GPIO_PORTD_BASE, RD, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, WD, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, AS, 0xFF);  Delay_1um();    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);       //使能J口

      GPIOPinTypeGPIOOutput(GPIO_PORTJ_BASE,0xFF);   //定义J口为输出

      GPIOPinWrite(GPIO_PORTJ_BASE,0xFF,ds_reg_a);  BQ3287_Delay(10);

      GPIOPinWrite(GPIO_PORTD_BASE, AS, 0x00);  GPIOPinWrite(GPIO_PORTD_BASE, RD, 0x00);  Delay_1um();   do  {    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);           //    GPIOPinTypeGPIOInput(GPIO_PORTJ_BASE,ds_reg_a);  //    temp=GPIOPinRead(GPIO_PORTJ_BASE,0xFF);    GPIOPinTypeGPIOOutput(GPIO_PORTJ_BASE,0xFF);       //    BQ3287_Delay(10);  }  while(0x80 == (temp & 0x80));    Delay_1um();    GPIOPinWrite(GPIO_PORTB_BASE, CS, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, AS, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, RD, 0xFF);   Delay_1um();

    }

    void BQ3287_writecmd(unchar ds_data,unchar data){  BQ3287_checkbusy();  Delay_1um();    GPIOPinWrite(GPIO_PORTB_BASE, CS, 0x00);  GPIOPinWrite(GPIO_PORTD_BASE, RD, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, WD, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, AS, 0xFF);  Delay_1um();    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);        //  GPIOPinTypeGPIOOutput(GPIO_PORTJ_BASE,0xFF);    //  GPIOPinWrite(GPIO_PORTJ_BASE,0xFF,ds_data);  Delay_1um();       GPIOPinWrite(GPIO_PORTD_BASE, AS, 0x00);   GPIOPinWrite(GPIO_PORTD_BASE, WD, 0x00);

      GPIOPinWrite(GPIO_PORTJ_BASE,0xFF,data);  BQ3287_Delay(10); 

      GPIOPinWrite(GPIO_PORTB_BASE, CS, 0xFF);    GPIOPinWrite(GPIO_PORTD_BASE, AS, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, WD, 0xFF);  Delay_1um();}

    unchar BQ3287_gettime(unchar ds_data){  unchar temp;    GPIOPinWrite(GPIO_PORTB_BASE, CS, 0x00);  GPIOPinWrite(GPIO_PORTD_BASE, RD, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, WD, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, AS, 0xFF);  Delay_1um();    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);      //  GPIOPinTypeGPIOOutput(GPIO_PORTJ_BASE,0xFF);   //  GPIOPinWrite(GPIO_PORTJ_BASE,0xFF,ds_data);  BQ3287_Delay(10);

      GPIOPinWrite(GPIO_PORTD_BASE, AS, 0x00);  GPIOPinWrite(GPIO_PORTD_BASE, RD, 0x00);  Delay_1um();     SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOJ);    //

      GPIOPinTypeGPIOInput(GPIO_PORTJ_BASE,0xFF);   //  temp=GPIOPinRead(GPIO_PORTJ_BASE,0xFF);  BQ3287_Delay(10);    GPIOPinWrite(GPIO_PORTB_BASE, CS, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, AS, 0xFF);  GPIOPinWrite(GPIO_PORTD_BASE, RD, 0xFF);   Delay_1um();    return temp;  }

    void Init_BQ3287(void){  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);  GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, WD|RD|AS);  GPIOPinWrite(GPIO_PORTD_BASE, WD, 0x00);  GPIOPinWrite(GPIO_PORTD_BASE, RD, 0x00);  GPIOPinWrite(GPIO_PORTD_BASE, AS, 0x00);  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);  GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, CS);//CS

     

      BQ3287_writecmd(0x0a,0x20);             //打开振荡器    BQ3287_writecmd(ds_reg_b,0xa2);           BQ3287_writecmd(ds_sec_warn,0x00);    BQ3287_writecmd(ds_min_warn,0xee);    BQ3287_writecmd(ds_hour_warn,0xee);   BQ3287_writecmd(ds_reg_c,0x00);     //清状态寄存器    BQ3287_writecmd(ds_reg_b,0x22);     //禁止方波输出,24小时制,BCD码  BQ3287_Delay(5);  BQ3287_writecmd(ds_reg_b,0x22);    BQ3287_Delay(5);}

    最新回复(0)