TIVA C Launchpad的相关程序(周计划之第五周)
[复制链接]
在main.c中包含头文件,编写中断函数KeyISR和主函数 /* * main.c */ #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "inc/hw_ints.h" #define SYS_CLOCK 50000000 //CPU时钟频率 #define KEY GPIO_PIN_4 //按键USE_SW1引脚宏定义 #define RED_LED GPIO_PIN_1 //红色LED灯宏定义 #define BLUE_LED GPIO_PIN_2 //蓝色LED灯宏定义 #define GREEN_LED GPIO_PIN_3 //绿色LED灯宏定义 long key_value = 0; //按键值 //********************************************************************** //本工程使用PF4上的按键采用中断方法依次点亮和熄灭RGB三色LED灯(PF1,PF2,PF3) //********************************************************************** void main(void) { inti = 0; long temp = 0; //使用外部16M晶振,使用PLL,系统时钟设为50MHz SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN); //使能按键和LED所在的GPIO SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //初始化LED灯引脚,设置为输出 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE,RED_LED | BLUE_LED | GREEN_LED); //配置LED灯引脚:最大输出电流2mA,推拉输出 GPIOPadConfigSet(GPIO_PORTF_BASE,RED_LED | BLUE_LED| GREEN_LED, GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD); //初始化按键引脚,设置为输入 GPIOPinTypeGPIOInput(GPIO_PORTF_BASE,KEY); //配置按键引脚:弱上拉输入 GPIOPadConfigSet(GPIO_PORTF_BASE,KEY, GPIO_STRENGTH_2MA,GPIO_PIN_TYPE_STD_WPU); //设置GPIO中断方式:上升沿触发 GPIOIntTypeSet(GPIO_PORTF_BASE,KEY,GPIO_RISING_EDGE); //使能按键引脚的GPIO中断 GPIOPinIntEnable(GPIO_PORTF_BASE,KEY); IntEnable(INT_GPIOF); while(1) { //如果按键按下进入事件处理 if(key_value & KEY) { switch(i) { case 0://红灯翻转 temp =GPIOPinRead(GPIO_PORTF_BASE,RED_LED); GPIOPinWrite(GPIO_PORTF_BASE,RED_LED,~temp); key_value&= ~KEY; i = 1; break; case 1://蓝灯翻转 temp =GPIOPinRead(GPIO_PORTF_BASE,BLUE_LED); GPIOPinWrite(GPIO_PORTF_BASE,BLUE_LED,~temp); key_value&= ~KEY; i = 2; break; case 2://绿灯翻转 temp =GPIOPinRead(GPIO_PORTF_BASE,GREEN_LED); GPIOPinWrite(GPIO_PORTF_BASE,GREEN_LED,~temp); key_value &= ~KEY; i = 0; break; } } else { } } } void KeyISR(void) { //读取中断状态 key_value =GPIOPinIntStatus(GPIO_PORTF_BASE,true); //清中断标志 GPIOPinIntClear(GPIO_PORTF_BASE,key_value); //延时约10ms SysCtlDelay(10 * (SYS_CLOCK / 3000)); } ADC多通道序列采样的程序 /* * main.c */ #include "inc/hw_types.h" #include "inc/hw_memmap.h" #include "driverlib/adc.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #define VREF 3300.0 //参考电压3.3V //****************************************************************** //本工程使用ADC0的采样序列1来实现多通道序列采样,采样序列1支持4个步进, //我们使用了三个步进,采样的通道依次为为CH0(PE3),CH1(PE2),CH2(PE1), //****************************************************************** void main(void) { unsigned long value[3]; //采样的数据 unsigned short voltage[3]; //转换后的电压 //设置PLL,ADC时钟为16MHz SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ); //使能ADC0 SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC0); //使能ADC采样通道所在管脚对应的GPIO SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); //设置GPIOE的PIN1,PIN2,PIN3为ADC功能引脚 GPIOPinTypeADC(GPIO_PORTE_BASE,GPIO_PIN_1 |GPIO_PIN_2 |GPIO_PIN_3); //配置前先禁止ADC采样序列 ADCSequenceDisable(ADC0_BASE,1); //配置ADC0,采样序列为1,采用处理器触发启动采样,优先级0 ADCSequenceConfigure(ADC0_BASE,1,ADC_TRIGGER_PROCESSOR,0); //设置ADC0的步进0(即序列的第一个采样):输入通道0 ADCSequenceStepConfigure(ADC0_BASE,1,0,ADC_CTL_CH0); //设置ADC0的步进1:输入通道1 ADCSequenceStepConfigure(ADC0_BASE,1,1,ADC_CTL_CH1); //设置ADC0的步进2:输入通道2,中断使能,并说明这是采样序列的终止(最后一步) ADCSequenceStepConfigure(ADC0_BASE,1,2,ADC_CTL_CH2 | ADC_CTL_IE |ADC_CTL_END ); //使能ADC采样序列1 ADCSequenceEnable(ADC0_BASE,1); //清ADC采样序列1中断 ADCIntClear(ADC0_BASE,1); while(1) { //触发ADC转换 ADCProcessorTrigger(ADC0_BASE,1); //等待转换完成 while(!ADCIntStatus(ADC0_BASE,1,false)) { } //读采样序列FIFO中的采样结果(一次性将所有step的数据都读出) ADCSequenceDataGet(ADC0_BASE,1,value); //延时 //SysCtlDelay(SysCtlClockGet()); //将采样数据则算成电压(单位mV) voltage[0] = value[0] / 4096.0 * VREF; voltage[1] = value[1] / 4096.0 * VREF; voltage[2] = value[2] / 4096.0 * VREF; } }
|