本帖最后由 lixiaoxu2meng 于 2011-11-29 09:29 编辑
非常感谢TI,感谢21IC,感谢这次活动的举办者。
首先非常抱歉,拿到板子已经快一个礼拜了,但是由于个人原因没有时间学习这个板子,昨天下午才开始弄,由于以前没有用过TI的产品,所以昨天主要收集资料,然后看光盘资料,一步步建立并配置工程模板,建立及配置工程在这里就不多说了,建立好工程编译通过后,发现如果想要查看每个功能函数操作不了,因为以前用ST的习惯了,所以个人把一些.C库文件还是添加了进来,如果大家觉得没必要或者减少编译时间也可以去掉,但是必须要添加driverlib.lib文件。
其他的不说了,上例程,本例程主要包括:1.LED 2.USART 3.TIMER0溢出中断 4.GPIO端口中断
1.LED 主要实现六个小灯的轮流闪烁
2.USART 主要是为了能够输出 以便于以后调试(这里调用了UARTprintf函数)
3.TIMER0溢出中断 主要是为了练习中断的操作
首先要打开启动文件Startup.s文件 然后找到那个你想要设置的中断
然后命名,假如你想用TIMER0中断 那么你在Startup.s文件中找到
DCD IntDefaultHandler ; Timer 0 subtimer A这一行,
将IntDefaultHandler 更换为你想要命名的中断函数名xxxx,
最后在这一行下面在另起一行声明你用的中断函数 extern xxxx
这样你配置玩中断就可以使用了
4.GPIO端口中断 主要是为了使用按键 实现的功能 每当键按下小灯变成流水灯,再按一下停止,依次反复。
下面上代码 main.c/*--------------文件信息---------------------------------------------------------
* 文 件 名: main.c
* 创 建 人: lixiaoxu
* 创建日期: 2011年11月16日
* 描 述: 主程序C语言入口
*
*---------- 版本信息------------------------------------------------------------
* 版 本: V1.0
*
*-------------------------------------------------------------------------------*/
#include "includes.h"
/******************************************************************************
* 本工程实现功能:1.LED 2.串口输出 3.定时器中断 4.端口中断(key)
* 注意:使用中断一定要在 Startup.s启动文件中 修改和添加 需要使用的中断
*
******************************************************************************/
int main(void)
{
u8 count = 0;
u32 time_count = 0;
Set_System();
while(1)
{
//查询按键中断
if(KEY_ID)
{
//LED闪烁
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,~GPIO_PIN_0); //熄灭LED3
GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED4
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0,~GPIO_PIN_0); //熄灭LED5
GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED6
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0,~GPIO_PIN_0); //熄灭LED7
GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED8
switch(count)
{
case 0: GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,GPIO_PIN_0); //点亮LED3
break;
case 1: GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED4
break;
case 2: GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0,GPIO_PIN_0); //点亮LED5
break;
case 3: GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED6
break;
case 4: GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0,GPIO_PIN_0); //点亮LED7
break;
case 5: GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED8
break;
default: break;
}
Delay_Ms(100); //100ms延时
count++;
if(count >= 6) count = 0;
}
//查询定时器中断
if(TIMER_ID)
{
TIMER_ID = 0;
//串口输出
time_count++;
UARTprintf("定时器中断第%d次",time_count);
}
}
}
hw_config.c#include "includes.h" //包含所需的头文件
/*************************************************************************************
** Function name: Set_System
** Descriptions: 封装一些初始化模块
** input parameters: count
** output parameters: 无
** Returned value: 无
*************************************************************************************/
void Set_System(void)
{
JTAG_Wait(); //以防止JTAG锁死
RCC_Configuration(); //配置系统时钟
GPIO_Configuration(); //配置GPIO
USART_Configuration(); //配置USART
TIMER_Configuration(); //配置TIMER
}
/*************************************************************************************
** Function name: JTAG_Wait
** Descriptions: 防止芯片的JTAG引脚锁死
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void JTAG_Wait(void)
{
u32 i;
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能KEY、LED所在的PC端口
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4); // 设置KEY所在管脚PC4为输入
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5 ); // 设置LED所在管脚PC5为输出
if (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0x00) // 若复位或上电时按下KEY,则进入
{
while(1) //死循环,以等待JTAG连接,LED闪烁
{
for(i=0;i<200000;i++);
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,GPIO_PIN_5); //点亮LED
for(i=0;i<200000;i++);
GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,~GPIO_PIN_5); //熄灭LED
}
}
SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC); // 禁止KEY所在的GPIO端口
}
/*************************************************************************************
** Function name: RCC_Configuration
** Descriptions: 系统时钟源设置
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void RCC_Configuration(void)
{
SysCtlClockSet(SYSCTL_SYSDIV_1 | // SysCtlClockSet函数()系统时钟设置 采用主振荡器 外接6MHz晶振 不分频
SYSCTL_USE_OSC |
SYSCTL_OSC_MAIN |
SYSCTL_XTAL_6MHZ);
//如果用其他功能模块如PWM等 也需要设置其时钟
}
/*************************************************************************************
** Function name: GPIO_Configuration
** Descriptions: GPIO配置
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void GPIO_Configuration()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // 使能LED所在的PB端口
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能LED所在的PC端口
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // 使能LED所在的PD端口
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); // 使能LED所在的PE端口
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0 ); // 设置LED所在管脚PB0为输出
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_1 ); // 设置LED所在管脚PB1为输出
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0 ); // 设置LED所在管脚PD0为输出
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_1 ); // 设置LED所在管脚PD1为输出
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_0 ); // 设置LED所在管脚PE0为输出
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_1 ); // 设置LED所在管脚PE1为输出
/* 配置user按键端口为上升沿触发中断*/
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4); //KEY IO 设置
GPIOIntTypeSet(GPIO_PORTC_BASE,GPIO_PIN_4,GPIO_FALLING_EDGE); //KEY 中断设置,配置为下降沿触发。
GPIOPinIntEnable(GPIO_PORTC_BASE,GPIO_PIN_4); //使能指定管脚的中断
IntEnable(INT_GPIOC); //打开端口C中断
IntMasterEnable(); //打开全局中断
}
/*************************************************************************************
** Function name: USART_Configuration
** Descriptions: USART配置
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void USART_Configuration()
{
//
// Enable GPIO port A which is used for UART0 pins.
// TODO: change this to whichever GPIO port you are using.
//
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
//
// Configure the pin muxing for UART0 functions on port A0 and A1.
// This step is not necessary if your part does not support pin muxing.
// TODO: change this to select the port/pin you are using.
//
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
//
// Select the alternate (UART) function for these pins.
// TODO: change this to select the port/pin you are using.
//
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//
// Initialize the UART for console I/O.
//
UARTStdioInit(0);
}
/*************************************************************************************
** Function name: TIMER_Configuration
** Descriptions: GPIO配置
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void TIMER_Configuration()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); //使能定时器0外设
TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER); //设置定时器0为32位周期定时器
TimerLoadSet(TIMER0_BASE, TIMER_A,6000000 ); //设置定时器装载值(时钟为6MHZ)定时1秒
TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT); //使能定时器 A 超时中断 (即溢出)
TimerEnable(TIMER0_BASE, TIMER_A); //使能定时器0模块
IntEnable(INT_TIMER0A); //使能单个定时器中断源
IntMasterEnable(); //使能处理器总中断
}
/*************************************************************************************
** Function name: Timer_0A_IRS
** Descriptions: TIMER中断
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void Timer_0A_IRS()
{
TIMER_ID = 1;
TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT); //清标志
}
/*************************************************************************************
** Function name: GPIO_Port_C_ISR
** Descriptions: GPIO中断
** input parameters: none
** output parameters: none
** Returned value: none
*************************************************************************************/
void GPIO_Port_C_ISR()
{
u32 ulStatus = GPIOPinIntStatus(GPIO_PORTC_BASE,1); //获取所指定GPIO端口的中断状态
GPIOPinIntClear(GPIO_PORTC_BASE,GPIO_PIN_4); //清除指定管脚的中断
if(ulStatus == GPIO_PIN_4)
{
if(KEY_ID == 0) KEY_ID = 1;
else KEY_ID = 0;
}
}
/*************************************************************************************
** Function name: Delay_Ms()
** Descriptions: Ms级延时(Sysclk = 6MHZ)
** input parameters: count
** output parameters: none
** Returned value: none
*************************************************************************************/
void Delay_Ms(u32 count)
{
while(count--)
{
SysCtlDelay(Sysclk / 3000);
}
}
hw_config.h#ifndef __HW_CONFIG_H__
#define __HW_CONFIG_H__
void Set_System(void);
void JTAG_Wait(void);
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART_Configuration(void);
void TIMER_Configuration(void);
void Timer_0A_IRS(void);
void GPIO_Port_C_ISR(void);
void Delay_Ms(u32 count);
#endif
includes.h封装一些头文件#include "hw_types.h" //一些类型的宏定义
#include "hw_memmap.h" //定义内存的地址,如寄存器,程序,数据段
#include "hw_ints.h" //中断序列号的宏定义
#include "lm3s811.h" //LM3S811的各种寄存器设置
#include "gpio.h" //GPIO的操作
#include "timer.h" //TIMER的操作
#include "sysctl.h" //系统各寄存器的操作宏定义
#include "uartstdio.h" //串口输出函数
#include "interrupt.h" //中断函数头文件
#include "de_type.h" //自己定义的数据类型的宏定义
#include "hw_config.h" //封装一些函数的头文件
#include "variables.h" //变量
de_type.h 定义数据类型#ifndef __DE_TYPE_H__
#define __DE_TYPE_H__
typedef signed long s32;
typedef signed short s16;
typedef signed char s8;
typedef signed long const sc32; /* Read Only */
typedef signed short const sc16; /* Read Only */
typedef signed char const sc8; /* Read Only */
typedef volatile signed long vs32;
typedef volatile signed short vs16;
typedef volatile signed char vs8;
typedef volatile signed long const vsc32; /* Read Only */
typedef volatile signed short const vsc16; /* Read Only */
typedef volatile signed char const vsc8; /* Read Only */
typedef unsigned long u32;
typedef unsigned short u16;
typedef unsigned char u8;
typedef unsigned long const uc32; /* Read Only */
typedef unsigned short const uc16; /* Read Only */
typedef unsigned char const uc8; /* Read Only */
typedef volatile unsigned long vu32;
typedef volatile unsigned short vu16;
typedef volatile unsigned char vu8;
typedef volatile unsigned long const vuc32; /* Read Only */
typedef volatile unsigned short const vuc16; /* Read Only */
typedef volatile unsigned char const vuc8; /* Read Only */
#endif
variables.c定义全局变量/* Includes ------------------------------------------------------------------*/
#include "includes.h"
u8 TIMER_ID =0;
u8 KEY_ID =0;
variables.h声明全局变量#ifndef __VARIABLES_H__
#define __VARIABLES_H__
/* Includes ------------------------------------------------------------------*/
#include "includes.h"
#define Sysclk 6000000
extern u8 TIMER_ID;
extern u8 KEY_ID;
#endif /* __VARIABLES_H__ */
uartstdio.c文件 库自带的只需添加到工程中即可 |