📄 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 <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 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(SSI0CLK_PERIPH); // 使能SSI0模块所在的GPIO端口
SysCtlPeriEnable(SYSCTL_PERIPH_SSI0); // 使能SSI0模块
GPIOPinTypeSSI(SSI0CLK_PORT , SSI0CLK_PIN | // 将相关GPIO设置为SSI功能
SSI0FSS_PIN |
SSI0RX_PIN |
SSI0TX_PIN);
SSIConfig(SSI0_BASE , // 配置SSI模块
SSI_FRF_MOTO_MODE_0 , // Freescale格式,模式0
SSI_MODE_MASTER , // 主模式
ulBitRate , // 设置位速率
8); // 设置数据宽度
// SSIIntEnable(SSI0_BASE , SSI_TXFF);
SSIDMAEnable(SSI0_BASE , SSI_DMA_TX);
SSIEnable(SSI0_BASE); // 使能SSI收发
}
void uDMAInit(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA); // 使能DMA时钟
uDMAEnable(); // 使能DMA模块
uDMAControlBaseSet(&ucDMAControlTable[0]); // 对DMA的控制表进行设置
uDMAChannelAttributeDisable(UDMA_CHANNEL_SSI0TX , // 清除通道属性
UDMA_ATTR_USEBURST |
UDMA_ATTR_ALTSELECT |
UDMA_ATTR_REQMASK);
uDMAChannelAttributeEnable(UDMA_CHANNEL_SSI0TX ,
UDMA_ATTR_HIGH_PRIORITY); // 通道为高优先级
uDMAChannelControlSet(UDMA_CHANNEL_SSI0TX | // 通道为SSI0TX
UDMA_PRI_SELECT, // 数据结构
UDMA_SIZE_8 | // 数据长度8位
UDMA_SRC_INC_8 | // 源地址累加
UDMA_DST_INC_NONE | // 目的地址不累加
UDMA_ARB_8); // 仲裁大小为8
uDMAChannelTransferSet(UDMA_CHANNEL_SSI0TX | // 通道为SSI0TX
UDMA_PRI_SELECT , // 数据结构
UDMA_MODE_BASIC , // 基本DMA模式
(void*)(pulData), // 源地址
(void*)0x40008008 , // 目的地址为SSI0的数据寄存器
8); // 一次传输为8个数据
uDMAChannelEnable(UDMA_CHANNEL_SSI0TX); // 使能UDMA_CHANNEL_SSI0TX通道
uDMAChannelIsEnabled(UDMA_CHANNEL_SSI0TX);
IntEnable(INT_UDMA); // 使能uDMA软件中断
}
// 系统初始化
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 long data;
//JTAG_Wait(); // 防止JTAG失效,重要!
SystemInit();
TheSysClock = SysCtlClockGet(); // 获取系统时钟,单位:Hz
uDMAInit();
ssiInit();
Delay(1000 * (TheSysClock / 4000));
while(1)
{
if(uDMAChannelIsEnabled(UDMA_CHANNEL_SSI0TX)); // 启用一次DMA传输后必需重新使能DMA
else uDMAChannelEnable(UDMA_CHANNEL_SSI0TX);
uDMAChannelTransferSet(UDMA_CHANNEL_SSI0TX | // 重新设置DMA传输的参数
UDMA_PRI_SELECT ,
UDMA_MODE_BASIC ,
(void*)(pulData),
(void*)0x40008008 ,
8);
uDMAChannelRequest(UDMA_CHANNEL_SSI0TX); // 软件请求一次DMA传输
Delay(500 * (TheSysClock / 4000));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -