[原创] LM3S811学习体会—LED-USART-TIMER-GPIOINT

lixiaoxu2meng   2011-11-29 10:23 楼主

上例程,本例程主要包括: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)

谢谢,学习了!!
点赞  2011-11-30 20:11
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复