[关闭]
@floatsd 2016-01-02T09:25:22.000000Z 字数 2391 阅读 1002

实验四 中断

CM4实验报告


实验目的

  • 了解单片机里中断的概念。
  • 懂得声明中断向量,中断函数,改变中断优先级,最终学会使用中断。

实验原理

实现功能

实验代码

中断的配置及初始化

  1. /*******************************************************************
  2. * 函数: Handler_Init()
  3. * 描述: 开启中断
  4. * 输入值:无
  5. * 返回值:无
  6. *****************************************************************/
  7. void Handler_Init()
  8. {
  9. SysCtlGPIOAHBEnable(SYSCTL_PERIPH_GPIOD);
  10. //矩阵按键第四行
  11. SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
  12. GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,GPIO_PIN_0);
  13. GPIOIntTypeSet(GPIO_PORTD_BASE,GPIO_PIN_0,GPIO_LOW_LEVEL);
  14. GPIOIntEnable(GPIO_PORTD_BASE,GPIO_INT_PIN_0);
  15. //定时器
  16. SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
  17. TimerConfigure(TIMER0_BASE, TIMER_CFG_SPLIT_PAIR | TIMER_CFG_B_PERIODIC);
  18. TimerIntEnable(TIMER0_BASE, TIMER_TIMB_TIMEOUT);
  19. TimerEnable(TIMER0_BASE, TIMER_B);
  20. TimerLoadSet(TIMER0_BASE, TIMER_B, sysClock_Fr/2000 );
  21. //优先级设置,如下所示,优先级越高数字上越小
  22. IntPrioritySet(INT_GPIOD,0x20);
  23. IntPrioritySet(INT_TIMER0B,0x00);
  24. IntEnable(INT_GPIOD); //开启相应中断向量
  25. /*3.开启总中断*/
  26. IntMasterEnable();
  27. }

呼吸灯实现

  1. /*******************************************************************
  2. * 函数: GPIOD_Handler()
  3. * 描述: 矩阵按键第四行的中断函数
  4. * 输入值:无
  5. * 返回值:无
  6. *****************************************************************/
  7. void GPIOD_Handler()
  8. {
  9. uint32_t Status;
  10. Status=GPIOIntStatus(GPIO_PORTD_BASE,true);
  11. if(Status==GPIO_INT_PIN_0)
  12. {
  13. ledclose();
  14. //ledon(0);
  15. }
  16. GPIOIntClear(GPIO_PORTD_BASE,Status);
  17. }

Timer的中断函数

  1. /*******************************************************************
  2. * 函数: GPIOD_Handler()
  3. * 描述: 利用Timer实现一毫秒扫描一次键盘减轻cpu负担
  4. * 输入值:无
  5. * 返回值:无
  6. *****************************************************************/
  7. void Timer_Handler(){
  8. unsigned long status;
  9. status=TimerIntStatus(TIMER0_BASE,true);
  10. if(status==TIMER_TIMB_TIMEOUT)
  11. {
  12. counter++;
  13. if(counter==10)
  14. {
  15. counter=1;
  16. switch(Row_Scan()){
  17. case 0:{
  18. LED_ON(1);Delay(24); break;
  19. }
  20. case 1:{
  21. LED_ON(2);Delay(24); break;
  22. }
  23. case 2:{
  24. LED_ON(3);Delay(24); break;
  25. }
  26. case 3:{
  27. LED_ON(4);Delay(24); break;
  28. }
  29. default:ledclose(); break;
  30. }
  31. }
  32. TimerIntClear(TIMER0_BASE, TIMER_TIMB_TIMEOUT);
  33. }
  34. }

遇到的问题和解决办法

实验结论

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注