📄 main.c
字号:
// 包含必要的头文件
#include <hw_types.h>
#include <hw_memmap.h>
#include <hw_sysctl.h>
#include <hw_udma.h>
#include <hw_ints.h>
#include <hw_gpio.h>
#include <sysctl.h>
#include <gpio.h>
#include <ssi.h>
#include <udma.h>
#include <uart.h>
#include <interrupt.h>
// 将较长的标识符定义为较短的形式
#define SysCtlPeriEnable SysCtlPeripheralEnable
#define SysCtlPeriDisable SysCtlPeripheralDisable
#define GPIOPinTypeIn GPIOPinTypeGPIOInput
#define GPIOPinTypeOut GPIOPinTypeGPIOOutput
#define GPIOPinTypeOD GPIOPinTypeGPIOOutputOD
// 定义KEY
#define KEY_PERIPH SYSCTL_PERIPH_GPIOG
#define KEY_PORT GPIO_PORTG_BASE
#define KEY_PIN GPIO_PIN_5
#define UART0_SYSCTL SYSCTL_PERIPH_GPIOA
#define UART0_GPIO_PORT GPIO_PORTA_BASE
#define UART0_PIN GPIO_PIN_0|GPIO_PIN_1
#define UART1_SYSCTL SYSCTL_PERIPH_GPIOD
#define UART1_GPIO_PORT GPIO_PORTD_BASE
#define UART1_PIN GPIO_PIN_2|GPIO_PIN_3
#define PART_LM3S5749
#include <pin_map.h>
// 定义全局的系统时钟变量
unsigned long TheSysClock = 12000000UL;
unsigned char pulData[8]={8,2,3,4,5,6,7,1};
unsigned long ucDMAControlTable[1024];
// 延时
void Delay(unsigned long ulVal)
{
while ( --ulVal != 0 );
}
// 防止JTAG失效
void JTAG_Wait(void)
{
SysCtlPeriEnable(KEY_PERIPH); // 使能KEY所在的GPIO端口
GPIOPinTypeIn(KEY_PORT , KEY_PIN); // 设置KEY所在管脚为输入
if ( GPIOPinRead(KEY_PORT , KEY_PIN) == 0x00 ) // 如果复位时按下KEY,则进入
{
for (;;); // 死循环,以等待JTAG连接
}
SysCtlPeriDisable(KEY_PERIPH); // 禁止KEY所在的GPIO端口
}
// SSI初始化
void ssiInit(void)
{
unsigned long ulBitRate = SysCtlClockGet() / 20;
SysCtlPeriEnable(SSI1CLK_PERIPH); // 使能SSI1模块所在的GPIO端口
SysCtlPeriEnable(SYSCTL_PERIPH_SSI1); // 使能SSI1模块
GPIOPinTypeSSI(SSI1CLK_PORT , SSI1CLK_PIN | // 将相关GPIO设置为SSI功能
SSI1FSS_PIN |
SSI1RX_PIN |
SSI1TX_PIN);
SSIConfig(SSI1_BASE , // 配置SSI模块
SSI_FRF_MOTO_MODE_0 , // Freescale格式,模式0
SSI_MODE_SLAVE , // 主模式
ulBitRate , // 设置位速率
8); // 设置数据宽度
SSIIntEnable(SSI1_BASE , SSI_RXFF);
IntPrioritySet(INT_SSI1 , 0x01);
SSIDMAEnable(SSI1_BASE , SSI_DMA_RX);
SSIEnable(SSI1_BASE); // 使能SSI收发
IntEnable(INT_SSI1);
IntMasterEnable();
}
void UART0Init(void)
{
SysCtlPeripheralEnable(UART0_SYSCTL);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinTypeUART(UART0_GPIO_PORT , UART0_PIN);
GPIODirModeSet(UART0_GPIO_PORT ,
UART0_PIN ,
GPIO_DIR_MODE_HW);
UARTConfigSet(UART0_BASE , // 配置UART 为 00波特率, 8-N-1模式发送数据。
9600 ,
UART_CONFIG_WLEN_8 |
UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE);
UARTFIFOLevelSet(UART0_BASE ,
UART_FIFO_TX4_8 ,
UART_FIFO_RX4_8);
}
void UART1Init(void)
{
SysCtlPeripheralEnable(UART1_SYSCTL);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART1);
GPIOPinTypeUART(UART1_GPIO_PORT, UART1_PIN);
GPIODirModeSet(UART1_GPIO_PORT ,
UART1_PIN ,
GPIO_DIR_MODE_HW);
UARTConfigSet(UART1_BASE , // 配置UART 为 00波特率, 8-N-1模式发送数据。
9600 ,
UART_CONFIG_WLEN_8 |
UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE);
UARTFIFOLevelSet(UART1_BASE ,
UART_FIFO_TX4_8 ,
UART_FIFO_RX4_8);
}
void uDMAInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); // 使能DMA时钟
uDMAEnable(); // 使能DMA模块
uDMAControlBaseSet(&ucDMAControlTable[0]); // 对DMA的控制表进行设置
uDMAChannelAttributeDisable(UDMA_CHANNEL_SSI1RX , // 清除通道属性
UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORITY |
UDMA_ATTR_ALTSELECT |
UDMA_ATTR_REQMASK);
//uDMAChannelAttributeEnable(UDMA_CHANNEL_SSI1TX,UDMA_ATTR_USEBURST);//通道优先级设置
uDMAChannelControlSet(UDMA_CHANNEL_SSI1RX | // 通道为SSI1RX
UDMA_PRI_SELECT, // 主结构
UDMA_SIZE_8 | // 数据长度8位
UDMA_SRC_INC_NONE | // 源地址不累加
UDMA_DST_INC_NONE | // 目的地址不累加
UDMA_ARB_8); // 仲裁长度为8
uDMAChannelControlSet(UDMA_CHANNEL_SSI1RX | // 通道为SSI1RX
UDMA_ALT_SELECT, // 交替结构
UDMA_SIZE_8 | // 数据长度8位
UDMA_SRC_INC_NONE | // 源地址不累加
UDMA_DST_INC_NONE | // 目的地址不累加
UDMA_ARB_8); // 仲裁长度为8
uDMAChannelTransferSet(UDMA_CHANNEL_SSI1RX | // 通道为SSI1RX
UDMA_PRI_SELECT , // 主结构
UDMA_MODE_PINGPONG , // PingPang模式
(void*)0x40009008 , // 源地址为SSI1的数据寄存器
(void*)0x4000C000 , // 目的地址为UART0的数据寄存器
8); // 一次传输为8个数据
uDMAChannelTransferSet(UDMA_CHANNEL_SSI1RX | // 通道为SSI1RX
UDMA_ALT_SELECT , // 交替结构
UDMA_MODE_PINGPONG , // PingPang模式
(void*)0x40009008 , // 源地址为SSI1的数据寄存器
(void*)0x4000D000 , // 目的地址为UART1的数据寄存器
8); // 一次传输为8个数据
uDMAChannelEnable(UDMA_CHANNEL_SSI1RX); //使能UDMA_CHANNEL_SSI1RX通道
// uDMAChannelIsEnabled(UDMA_CHANNEL_SSI1RX);
}
// 系统初始化
void SystemInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_50V); // 设置LDO输出电压
SysCtlClockSet(SYSCTL_USE_OSC | // 系统时钟设置,采用主振荡器
SYSCTL_OSC_MAIN |
SYSCTL_XTAL_8MHZ |
SYSCTL_SYSDIV_1);
/*
SysCtlLDOSet(SYSCTL_LDO_2_75V); // 配置PLL前须将LDO电压设置为2.75V
SysCtlClockSet(SYSCTL_USE_PLL | // 系统时钟设置,采用PLL
SYSCTL_OSC_MAIN | // 主振荡器
SYSCTL_XTAL_6MHZ | // 外接6MHz晶振
SYSCTL_SYSDIV_10); // 分频结果为20MHz
*/
}
// 主函数(程序入口)
int main(void)
{
// unsigned char P;
//JTAG_Wait(); // 防止JTAG失效,重要!
SystemInit();
TheSysClock = SysCtlClockGet(); // 获取系统时钟,单位:Hz
uDMAInit();
ssiInit();
UART0Init();
UART1Init();
Delay(1000 * (TheSysClock / 4000));
while(1)
{
}
}
void SSI1_ISR(void)
{
unsigned long ulMode;
ulMode = uDMAChannelModeGet(UDMA_CHANNEL_SSI1RX | UDMA_PRI_SELECT); // 获取SSI1RX通道的模式
if(ulMode == UDMA_MODE_STOP) // 判断是否为停止模式
{
uDMAChannelTransferSet(UDMA_CHANNEL_SSI1RX | // 重新设置主结构的通道参数
UDMA_PRI_SELECT ,
UDMA_MODE_PINGPONG ,
(void*)0x40009008 ,
(void*)0x4000C000 ,
8);
}
ulMode = uDMAChannelModeGet(UDMA_CHANNEL_SSI1RX | UDMA_ALT_SELECT); // 获取SSI1RX通道的模式
if(ulMode == UDMA_MODE_STOP) // 判断是否为停止模式
{
uDMAChannelTransferSet(UDMA_CHANNEL_SSI1RX | // 重新设置主结构的通道参数
UDMA_ALT_SELECT ,
UDMA_MODE_PINGPONG ,
(void*)0x40009008 ,
(void*)0x4000D000 ,
8);
}
while(uDMAChannelIsEnabled(UDMA_CHANNEL_SSI1RX)==0)
{
uDMAChannelEnable(UDMA_CHANNEL_SSI1RX); // 使能UDMA_CHANNEL_UART0TX通道
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -