上例程,本例程主要包括: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文件 库自带的只需添加到工程中即可