gpio-bus.c

来自「LM3S系列ARM用GPIO模拟并行总线扩展32KB SRAM PF0~P」· C语言 代码 · 共 65 行

C
65
字号
#include  "GPIO-Bus.h"
#include  "LM3S-JTAG.h"
#include  <hw_types.h>
#include  <hw_memmap.h>
#include  <hw_gpio.h>
#include  <sysctl.h>
#include  <gpio.h>

#define  SysCtlPeriEnable       SysCtlPeripheralEnable
#define  GPIOPinTypeIn          GPIOPinTypeGPIOInput
#define  GPIOPinTypeOut         GPIOPinTypeGPIOOutput

//  总线初始化
//  地址总线:PA0~PA7=A0~A7,PB0~PB7=A8~A15
//  数据总线:PF0~PF7=D0~D7
//  控制总线:PC4=/WR,PC5=/RD
void busInit(void)
{
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOA);                      //  使能GPIOA端口
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB);                      //  使能GPIOB端口
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOC);                      //  使能GPIOC端口
    SysCtlPeriEnable(SYSCTL_PERIPH_GPIOF);                      //  使能GPIOF端口

    GPIOPinTypeOut(GPIO_PORTA_BASE, 0xFF);                      //  设置PA0~PA7为输出
    GPIOPinTypeOut(GPIO_PORTB_BASE, 0x7F);                      //  设置PB0~PB6为输出
    GPIOPinTypeOut(GPIO_PORTC_BASE, GPIO_PIN_4 | GPIO_PIN_5);   //  设置PC4、PC5为输出
    GPIOPinTypeIn(GPIO_PORTF_BASE, 0xFF);                       //  设置PF0~PF7为输入

    jtagPinToGPIO(GPIO_PORTB_BASE, GPIO_PIN_7);                 //  允许PB7配置为GPIO功能
    GPIOPinTypeOut(GPIO_PORTB_BASE, GPIO_PIN_7);                //  设置PB7为输出

    GPIOPinWrite(GPIO_PORTA_BASE, 0xFF, 0xFF);                  //  A0~A7=0xFF
    GPIOPinWrite(GPIO_PORTB_BASE, 0xFF, 0xFF);                  //  B0~B7=0xFF
    GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_4, 0xFF);            //  /WR=1
    GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5, 0xFF);            //  /RD=1
}

//  从总线读1个字节
//  操作时序:输出地址,/RD=0,读数据,/RD=1
char busRead(unsigned short usAddr)
{
    char cData;

    HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (0xFF << 2))) = (char)usAddr;
    HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (0xFF << 2))) = usAddr >> 8;
    HWREG(GPIO_PORTC_BASE + (GPIO_O_DATA + (GPIO_PIN_5 << 2))) = 0x00;
    cData = HWREG(GPIO_PORTF_BASE + (GPIO_O_DATA + (0xFF << 2)));
    HWREG(GPIO_PORTC_BASE + (GPIO_O_DATA + (GPIO_PIN_5 << 2))) = 0xFF;

    return(cData);
}

//  写1个字节到总线
//  操作时序:输出地址,/WR=0,数据总线切换为输出,写数据,/WR=1,数据总线切换为输入
void busWrite(unsigned short usAddr, char cData)
{
    HWREG(GPIO_PORTA_BASE + (GPIO_O_DATA + (0xFF << 2))) = (char)usAddr;
    HWREG(GPIO_PORTB_BASE + (GPIO_O_DATA + (0xFF << 2))) = usAddr >> 8;
    HWREG(GPIO_PORTC_BASE + (GPIO_O_DATA + (GPIO_PIN_4 << 2))) = 0x00;
    HWREG(GPIO_PORTF_BASE + GPIO_O_DIR) |= 0xFF;
    HWREG(GPIO_PORTF_BASE + (GPIO_O_DATA + (0xFF << 2))) = cData;
    HWREG(GPIO_PORTC_BASE + (GPIO_O_DATA + (GPIO_PIN_4 << 2))) = 0xFF;
    HWREG(GPIO_PORTF_BASE + GPIO_O_DIR) &= ~0xFF;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?