打印

分享TI LM3S811开发板使用心得——LED-USART-TIMER-GPIOINT

[复制链接]
8990|45
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lixiaoxu2meng|  楼主 | 2011-11-17 15:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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文件 库自带的只需添加到工程中即可
评分
参与人数 1威望 +10 收起 理由
hotpower + 10

相关帖子

沙发
lixiaoxu2meng|  楼主 | 2011-11-17 15:10 | 只看该作者
本帖最后由 lixiaoxu2meng 于 2011-11-17 15:18 编辑

下面上图 :工程模板
串口输出

板子艳照

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
hlmdd + 1
板凳
lixiaoxu2meng|  楼主 | 2011-11-17 15:13 | 只看该作者
本帖最后由 lixiaoxu2meng 于 2011-11-17 15:15 编辑

最后工程 完整版 包括库函数 及头文件 编译下载即可 LM3S811 Projiect.rar (2.18 MB)
首次在这个论坛发帖 不对的地方希望大家指正

使用特权

评论回复
地板
hotpower| | 2011-11-17 15:25 | 只看该作者
不错,手法未变,一看就是楼主的烙印。

使用特权

评论回复
5
lixiaoxu2meng|  楼主 | 2011-11-17 15:31 | 只看该作者
再附上 收集的资料:1.LM3S811中文数据手册 LM3S811中文数据手册.part1.rar (2.5 MB) LM3S811中文数据手册.part2.rar (2.5 MB) LM3S811中文数据手册.part3.rar (289.24 KB)
                           2.LM3S811中文库函数使用手册 Stellaris驱动库用户指南_cn.rar (2.63 MB)
                           3.板子电路图 LM3S811_SCH.rar (53.18 KB)

使用特权

评论回复
6
lixiaoxu2meng|  楼主 | 2011-11-17 15:33 | 只看该作者
4# hotpower   
:lol 谢谢菜农老师

使用特权

评论回复
7
dsl1784| | 2011-11-17 15:51 | 只看该作者
楼主程序风格没的说。但是楼主我有一个小问题,下面这句我发现不要也能中断,我看官方的例子里面没用这个呢。
IntMasterEnable(); //打开全局中断

使用特权

评论回复
8
lixiaoxu2meng|  楼主 | 2011-11-17 16:05 | 只看该作者
7# dsl1784
你好 我刚刚试了一下 发现的确如你所说,我将其去掉 好用  然后我在刚开始加上禁止总中断 这回不要好用了 所以我想 这个全局中断 默认为使能的

使用特权

评论回复
9
dsl1784| | 2011-11-17 22:00 | 只看该作者
呵呵 楼主 GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0X10   JtagWait那里  你看看  期待楼主更多分享  哈哈

使用特权

评论回复
10
lixiaoxu2meng|  楼主 | 2011-11-18 07:47 | 只看该作者
9# dsl1784
GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0X10    我的例程里 是GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0X00   难道不对吗
呵呵你的例程也很好相互学习

使用特权

评论回复
11
nongfuxu| | 2011-11-18 08:05 | 只看该作者
不知道M3S811在可靠性,性能,价格这几方面怎么样,参照物STM32F

使用特权

评论回复
12
dsl1784| | 2011-11-18 11:32 | 只看该作者
0x00的话.......条件正好相反,当按下按键的话就保持住........,不按键就继续执行了。我不是拍砖的啦....我的东西不怎么好哟。楼主一看就是从事很久的人啦。

使用特权

评论回复
13
G21372| | 2011-11-18 11:50 | 只看该作者
太详细了,还有源码

使用特权

评论回复
14
lixiaoxu2meng|  楼主 | 2011-11-18 11:56 | 只看该作者
13# G21372
方便和我一样刚入门的朋友们

使用特权

评论回复
15
lixiaoxu2meng|  楼主 | 2011-11-18 12:02 | 只看该作者
本帖最后由 lixiaoxu2meng 于 2011-11-18 12:07 编辑

12# dsl1784

使用特权

评论回复
16
lixiaoxu2meng|  楼主 | 2011-11-18 12:09 | 只看该作者
12# dsl1784
呵呵欢迎讨论  我也是新手(实话) 呵呵 针对你说的 按键问题 我们要达到的目的是一样的 就是防止JTAG口锁死  你的方法是:没有锁死的时候 每次开机 都需要按一下按键 锁死的时候就不需要了
我的方法是(也是在论坛上看别人这么用的):平时不按 当锁死时 按一下按键 再按下复位 然后进入死循环 等待 JTAG
好像是这么回事

使用特权

评论回复
17
永远的不知| | 2011-11-18 13:29 | 只看该作者
不错,楼主以后多来讨论stellarisware。

使用特权

评论回复
18
永远的不知| | 2011-11-18 13:30 | 只看该作者
11# nongfuxu

性能比stm32f101要强,价格吗,如果有量的话,相比于st会有惊喜。

使用特权

评论回复
19
lixiaoxu2meng|  楼主 | 2011-11-18 13:32 | 只看该作者
17# 永远的不知
谢谢斑竹给裤子穿

使用特权

评论回复
20
永远的不知| | 2011-11-18 14:26 | 只看该作者
19# lixiaoxu2meng

期待以后能给您更多的裤子穿。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1679

帖子

2

粉丝