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

[复制链接]
 楼主| 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
  1. /*--------------文件信息---------------------------------------------------------
  2. * 文 件 名: main.c
  3. * 创 建 人: lixiaoxu
  4. * 创建日期: 2011年11月16日
  5. * 描 述: 主程序C语言入口
  6. *
  7. *---------- 版本信息------------------------------------------------------------
  8. * 版 本: V1.0
  9. *
  10. *-------------------------------------------------------------------------------*/
  11. #include "includes.h"

  12. /******************************************************************************
  13. * 本工程实现功能:1.LED 2.串口输出 3.定时器中断 4.端口中断(key)
  14. * 注意:使用中断一定要在 Startup.s启动文件中 修改和添加 需要使用的中断
  15. *
  16. ******************************************************************************/
  17. int main(void)
  18. {
  19. u8 count = 0;
  20. u32 time_count = 0;
  21. Set_System();
  22. while(1)
  23. {
  24. //查询按键中断
  25. if(KEY_ID)
  26. {
  27. //LED闪烁
  28. GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,~GPIO_PIN_0); //熄灭LED3
  29. GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED4
  30. GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0,~GPIO_PIN_0); //熄灭LED5
  31. GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED6
  32. GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0,~GPIO_PIN_0); //熄灭LED7
  33. GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1,~GPIO_PIN_1); //熄灭LED8

  34. switch(count)
  35. {
  36. case 0: GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_0,GPIO_PIN_0); //点亮LED3
  37. break;
  38. case 1: GPIOPinWrite(GPIO_PORTD_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED4
  39. break;
  40. case 2: GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0,GPIO_PIN_0); //点亮LED5
  41. break;
  42. case 3: GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED6
  43. break;
  44. case 4: GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0,GPIO_PIN_0); //点亮LED7
  45. break;
  46. case 5: GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1,GPIO_PIN_1); //点亮LED8
  47. break;
  48. default: break;
  49. }
  50. Delay_Ms(100); //100ms延时
  51. count++;
  52. if(count >= 6) count = 0;
  53. }
  54. //查询定时器中断
  55. if(TIMER_ID)
  56. {
  57. TIMER_ID = 0;
  58. //串口输出
  59. time_count++;
  60. UARTprintf("定时器中断第%d次",time_count);
  61. }
  62. }
  63. }
hw_config.c
  1. #include "includes.h" //包含所需的头文件

  2. /*************************************************************************************
  3. ** Function name: Set_System
  4. ** Descriptions: 封装一些初始化模块
  5. ** input parameters: count
  6. ** output parameters: 无
  7. ** Returned value: 无
  8. *************************************************************************************/
  9. void Set_System(void)
  10. {
  11. JTAG_Wait(); //以防止JTAG锁死

  12. RCC_Configuration(); //配置系统时钟

  13. GPIO_Configuration(); //配置GPIO

  14. USART_Configuration(); //配置USART

  15. TIMER_Configuration(); //配置TIMER
  16. }
  17. /*************************************************************************************
  18. ** Function name: JTAG_Wait
  19. ** Descriptions: 防止芯片的JTAG引脚锁死
  20. ** input parameters: none
  21. ** output parameters: none
  22. ** Returned value: none
  23. *************************************************************************************/
  24. void JTAG_Wait(void)
  25. {
  26. u32 i;
  27. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能KEY、LED所在的PC端口
  28. GPIOPinTypeGPIOInput(GPIO_PORTC_BASE, GPIO_PIN_4); // 设置KEY所在管脚PC4为输入
  29. GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE, GPIO_PIN_5 ); // 设置LED所在管脚PC5为输出
  30. if (GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0x00) // 若复位或上电时按下KEY,则进入
  31. {
  32. while(1) //死循环,以等待JTAG连接,LED闪烁
  33. {
  34. for(i=0;i<200000;i++);
  35. GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,GPIO_PIN_5); //点亮LED
  36. for(i=0;i<200000;i++);
  37. GPIOPinWrite(GPIO_PORTC_BASE, GPIO_PIN_5,~GPIO_PIN_5); //熄灭LED
  38. }
  39. }
  40. SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC); // 禁止KEY所在的GPIO端口
  41. }
  42. /*************************************************************************************
  43. ** Function name: RCC_Configuration
  44. ** Descriptions: 系统时钟源设置
  45. ** input parameters: none
  46. ** output parameters: none
  47. ** Returned value: none
  48. *************************************************************************************/
  49. void RCC_Configuration(void)
  50. {
  51. SysCtlClockSet(SYSCTL_SYSDIV_1 | // SysCtlClockSet函数()系统时钟设置 采用主振荡器 外接6MHz晶振 不分频
  52. SYSCTL_USE_OSC |
  53. SYSCTL_OSC_MAIN |
  54. SYSCTL_XTAL_6MHZ);
  55. //如果用其他功能模块如PWM等 也需要设置其时钟
  56. }
  57. /*************************************************************************************
  58. ** Function name: GPIO_Configuration
  59. ** Descriptions: GPIO配置
  60. ** input parameters: none
  61. ** output parameters: none
  62. ** Returned value: none
  63. *************************************************************************************/
  64. void GPIO_Configuration()
  65. {
  66. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // 使能LED所在的PB端口
  67. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC); // 使能LED所在的PC端口
  68. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD); // 使能LED所在的PD端口
  69. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); // 使能LED所在的PE端口
  70. GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0 ); // 设置LED所在管脚PB0为输出
  71. GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_1 ); // 设置LED所在管脚PB1为输出
  72. GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_0 ); // 设置LED所在管脚PD0为输出
  73. GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE, GPIO_PIN_1 ); // 设置LED所在管脚PD1为输出
  74. GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_0 ); // 设置LED所在管脚PE0为输出
  75. GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_1 ); // 设置LED所在管脚PE1为输出
  76. /* 配置user按键端口为上升沿触发中断*/
  77. GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4); //KEY IO 设置
  78. GPIOIntTypeSet(GPIO_PORTC_BASE,GPIO_PIN_4,GPIO_FALLING_EDGE); //KEY 中断设置,配置为下降沿触发。
  79. GPIOPinIntEnable(GPIO_PORTC_BASE,GPIO_PIN_4); //使能指定管脚的中断
  80. IntEnable(INT_GPIOC); //打开端口C中断
  81. IntMasterEnable(); //打开全局中断
  82. }
  83. /*************************************************************************************
  84. ** Function name: USART_Configuration
  85. ** Descriptions: USART配置
  86. ** input parameters: none
  87. ** output parameters: none
  88. ** Returned value: none
  89. *************************************************************************************/
  90. void USART_Configuration()
  91. {

  92. //
  93. // Enable GPIO port A which is used for UART0 pins.
  94. // TODO: change this to whichever GPIO port you are using.
  95. //
  96. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

  97. //
  98. // Configure the pin muxing for UART0 functions on port A0 and A1.
  99. // This step is not necessary if your part does not support pin muxing.
  100. // TODO: change this to select the port/pin you are using.
  101. //
  102. GPIOPinConfigure(GPIO_PA0_U0RX);
  103. GPIOPinConfigure(GPIO_PA1_U0TX);

  104. //
  105. // Select the alternate (UART) function for these pins.
  106. // TODO: change this to select the port/pin you are using.
  107. //
  108. GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

  109. //
  110. // Initialize the UART for console I/O.
  111. //
  112. UARTStdioInit(0);
  113. }
  114. /*************************************************************************************
  115. ** Function name: TIMER_Configuration
  116. ** Descriptions: GPIO配置
  117. ** input parameters: none
  118. ** output parameters: none
  119. ** Returned value: none
  120. *************************************************************************************/
  121. void TIMER_Configuration()
  122. {
  123. SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); //使能定时器0外设
  124. TimerConfigure(TIMER0_BASE,TIMER_CFG_32_BIT_PER); //设置定时器0为32位周期定时器
  125. TimerLoadSet(TIMER0_BASE, TIMER_A,6000000 ); //设置定时器装载值(时钟为6MHZ)定时1秒
  126. TimerIntEnable(TIMER0_BASE,TIMER_TIMA_TIMEOUT); //使能定时器 A 超时中断 (即溢出)
  127. TimerEnable(TIMER0_BASE, TIMER_A); //使能定时器0模块
  128. IntEnable(INT_TIMER0A); //使能单个定时器中断源
  129. IntMasterEnable(); //使能处理器总中断
  130. }
  131. /*************************************************************************************
  132. ** Function name: Timer_0A_IRS
  133. ** Descriptions: TIMER中断
  134. ** input parameters: none
  135. ** output parameters: none
  136. ** Returned value: none
  137. *************************************************************************************/
  138. void Timer_0A_IRS()
  139. {
  140. TIMER_ID = 1;
  141. TimerIntClear(TIMER0_BASE,TIMER_TIMA_TIMEOUT); //清标志
  142. }
  143. /*************************************************************************************
  144. ** Function name: GPIO_Port_C_ISR
  145. ** Descriptions: GPIO中断
  146. ** input parameters: none
  147. ** output parameters: none
  148. ** Returned value: none
  149. *************************************************************************************/
  150. void GPIO_Port_C_ISR()
  151. {
  152. u32 ulStatus = GPIOPinIntStatus(GPIO_PORTC_BASE,1); //获取所指定GPIO端口的中断状态
  153. GPIOPinIntClear(GPIO_PORTC_BASE,GPIO_PIN_4); //清除指定管脚的中断
  154. if(ulStatus == GPIO_PIN_4)
  155. {
  156. if(KEY_ID == 0) KEY_ID = 1;
  157. else KEY_ID = 0;
  158. }
  159. }
  160. /*************************************************************************************
  161. ** Function name: Delay_Ms()
  162. ** Descriptions: Ms级延时(Sysclk = 6MHZ)
  163. ** input parameters: count
  164. ** output parameters: none
  165. ** Returned value: none
  166. *************************************************************************************/
  167. void Delay_Ms(u32 count)
  168. {
  169. while(count--)
  170. {
  171. SysCtlDelay(Sysclk / 3000);
  172. }
  173. }
hw_config.h
  1. #ifndef __HW_CONFIG_H__
  2. #define __HW_CONFIG_H__
  3. void Set_System(void);
  4. void JTAG_Wait(void);
  5. void RCC_Configuration(void);
  6. void GPIO_Configuration(void);
  7. void USART_Configuration(void);
  8. void TIMER_Configuration(void);
  9. void Timer_0A_IRS(void);
  10. void GPIO_Port_C_ISR(void);
  11. void Delay_Ms(u32 count);
  12. #endif
includes.h封装一些头文件
  1. #include "hw_types.h" //一些类型的宏定义
  2. #include "hw_memmap.h" //定义内存的地址,如寄存器,程序,数据段
  3. #include "hw_ints.h" //中断序列号的宏定义
  4. #include "lm3s811.h" //LM3S811的各种寄存器设置
  5. #include "gpio.h" //GPIO的操作
  6. #include "timer.h" //TIMER的操作

  7. #include "sysctl.h" //系统各寄存器的操作宏定义
  8. #include "uartstdio.h" //串口输出函数
  9. #include "interrupt.h" //中断函数头文件
  10. #include "de_type.h" //自己定义的数据类型的宏定义
  11. #include "hw_config.h" //封装一些函数的头文件
  12. #include "variables.h" //变量

de_type.h 定义数据类型
  1. #ifndef __DE_TYPE_H__
  2. #define __DE_TYPE_H__

  3. typedef signed long s32;
  4. typedef signed short s16;
  5. typedef signed char s8;

  6. typedef signed long const sc32; /* Read Only */
  7. typedef signed short const sc16; /* Read Only */
  8. typedef signed char const sc8; /* Read Only */

  9. typedef volatile signed long vs32;
  10. typedef volatile signed short vs16;
  11. typedef volatile signed char vs8;

  12. typedef volatile signed long const vsc32; /* Read Only */
  13. typedef volatile signed short const vsc16; /* Read Only */
  14. typedef volatile signed char const vsc8; /* Read Only */

  15. typedef unsigned long u32;
  16. typedef unsigned short u16;
  17. typedef unsigned char u8;

  18. typedef unsigned long const uc32; /* Read Only */
  19. typedef unsigned short const uc16; /* Read Only */
  20. typedef unsigned char const uc8; /* Read Only */

  21. typedef volatile unsigned long vu32;
  22. typedef volatile unsigned short vu16;
  23. typedef volatile unsigned char vu8;

  24. typedef volatile unsigned long const vuc32; /* Read Only */
  25. typedef volatile unsigned short const vuc16; /* Read Only */
  26. typedef volatile unsigned char const vuc8; /* Read Only */

  27. #endif
variables.c定义全局变量
  1. /* Includes ------------------------------------------------------------------*/
  2. #include "includes.h"
  3. u8 TIMER_ID =0;
  4. u8 KEY_ID =0;

variables.h声明全局变量
  1. #ifndef __VARIABLES_H__
  2. #define __VARIABLES_H__
  3. /* Includes ------------------------------------------------------------------*/
  4. #include "includes.h"
  5. #define Sysclk 6000000
  6. extern u8 TIMER_ID;
  7. extern u8 KEY_ID;
  8. #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 编辑

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
hotpower 发表于 2011-11-17 15:25 | 显示全部楼层
不错,手法未变,一看就是楼主的烙印。
 楼主| lixiaoxu2meng 发表于 2011-11-17 15:31 | 显示全部楼层
再附上 收集的资料:1.LM3S811中文数据手册
                           2.LM3S811中文库函数使用手册
                           3.板子电路图

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| lixiaoxu2meng 发表于 2011-11-17 15:33 | 显示全部楼层
4# hotpower   
:lol 谢谢菜农老师
dsl1784 发表于 2011-11-17 15:51 | 显示全部楼层
楼主程序风格没的说。但是楼主我有一个小问题,下面这句我发现不要也能中断,我看官方的例子里面没用这个呢。
IntMasterEnable(); //打开全局中断
 楼主| lixiaoxu2meng 发表于 2011-11-17 16:05 | 显示全部楼层
7# dsl1784
你好 我刚刚试了一下 发现的确如你所说,我将其去掉 好用  然后我在刚开始加上禁止总中断 这回不要好用了 所以我想 这个全局中断 默认为使能的
dsl1784 发表于 2011-11-17 22:00 | 显示全部楼层
呵呵 楼主 GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0X10   JtagWait那里  你看看  期待楼主更多分享  哈哈
 楼主| lixiaoxu2meng 发表于 2011-11-18 07:47 | 显示全部楼层
9# dsl1784
GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0X10    我的例程里 是GPIOPinRead(GPIO_PORTC_BASE, GPIO_PIN_4) == 0X00   难道不对吗
呵呵你的例程也很好相互学习
nongfuxu 发表于 2011-11-18 08:05 | 显示全部楼层
不知道M3S811在可靠性,性能,价格这几方面怎么样,参照物STM32F
dsl1784 发表于 2011-11-18 11:32 | 显示全部楼层
0x00的话.......条件正好相反,当按下按键的话就保持住........,不按键就继续执行了。我不是拍砖的啦....我的东西不怎么好哟。楼主一看就是从事很久的人啦。
G21372 发表于 2011-11-18 11:50 | 显示全部楼层
太详细了,还有源码
 楼主| lixiaoxu2meng 发表于 2011-11-18 11:56 | 显示全部楼层
13# G21372
方便和我一样刚入门的朋友们
 楼主| lixiaoxu2meng 发表于 2011-11-18 12:02 | 显示全部楼层
本帖最后由 lixiaoxu2meng 于 2011-11-18 12:07 编辑

12# dsl1784
 楼主| lixiaoxu2meng 发表于 2011-11-18 12:09 | 显示全部楼层
12# dsl1784
呵呵欢迎讨论  我也是新手(实话) 呵呵 针对你说的 按键问题 我们要达到的目的是一样的 就是防止JTAG口锁死  你的方法是:没有锁死的时候 每次开机 都需要按一下按键 锁死的时候就不需要了
我的方法是(也是在论坛上看别人这么用的):平时不按 当锁死时 按一下按键 再按下复位 然后进入死循环 等待 JTAG
好像是这么回事
永远的不知 发表于 2011-11-18 13:29 | 显示全部楼层
不错,楼主以后多来讨论stellarisware。
永远的不知 发表于 2011-11-18 13:30 | 显示全部楼层
11# nongfuxu

性能比stm32f101要强,价格吗,如果有量的话,相比于st会有惊喜。
 楼主| lixiaoxu2meng 发表于 2011-11-18 13:32 | 显示全部楼层
17# 永远的不知
谢谢斑竹给裤子穿
永远的不知 发表于 2011-11-18 14:26 | 显示全部楼层
19# lixiaoxu2meng

期待以后能给您更多的裤子穿。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

1679

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部