• ARM-day9


    按键控制小灯、蜂鸣器、风扇,按一次启动,第二次关闭

    key_it.c

    1. #include "key_it.h"
    2. //按键3的配置
    3. void key3_it_config()
    4. {
    5. //RCC使能GPIOF时钟
    6. RCC->MP_AHB4ENSETR |= (0x1<<5);
    7. GPIOF->MODER &= (~(0x3<<16));
    8. EXTI->EXTICR3 &= (~(0xFF<<0));
    9. EXTI->EXTICR3 |= (0x5<<0);
    10. EXTI->FTSR1 |= (0x1<<8);
    11. EXTI->C1IMR1 |= (0x1<<8);
    12. GICD->ISENABLER[3] |= (0x1<<2);
    13. GICD->IPRIORITYR[24] &= (~(0x1F<<19));
    14. GICD->ITARGETSR[24] &= (~(0x3<<16));
    15. GICD->ITARGETSR[24] |= (0x1<<16);
    16. }
    17. void key_it_config()
    18. {
    19. //RCC使能GPIOF时钟
    20. RCC->MP_APB1ENSETR |= (0x1<<5);
    21. //设置PF9 PF7 Pf8 的GPIO输入
    22. //PF9
    23. GPIOF->MODER &= (~(0x3<<18));
    24. //PF8
    25. GPIOF->MODER &= (~(0x3<<16));
    26. //PF7
    27. GPIOF->MODER &= (~(0x3<<14));
    28. //设置PF9 PF7 PF8 产生EXTI事件 EXTI_EXTICRx
    29. //PF7
    30. EXTI->EXTICR2 &= (~(0xFF<<24));
    31. EXTI->EXTICR2 |= (0x5<<24);
    32. //PF8
    33. EXTI->EXTICR3 &= (~(0xFF)<<0);
    34. EXTI->EXTICR3 |= (0x5<<0);
    35. //PF9
    36. EXTI->EXTICR3 &= (~(0xFF)<<8);
    37. EXTI->EXTICR3 |= (0x5<<8);
    38. //设置事件触发方式为下降沿触发 EXTI_FTSR1
    39. //PF7
    40. EXTI->FTSR1 |= (0x1<<7);
    41. //PF8
    42. EXTI->FTSR1 |= (0x1<<8);
    43. //PF9
    44. EXTI->FTSR1 |= (0x1<<9);
    45. //设置EXTI事件触发不屏蔽 EXTI_IMR1
    46. //PF7
    47. EXTI->C1IMR1 |= (0x1<<7);
    48. //PF8
    49. EXTI->C1IMR1 |= (0x1<<8);
    50. //PF9
    51. EXTI->C1IMR1 |= (0x1<<9);
    52. //使能中断能转发到特定的CPU接口层 GICD_ISENABLERx
    53. //PF7 97号中断
    54. GICD->ISENABLER[3] |= (0x1<<1);
    55. //PF8 98号中断
    56. GICD->ISENABLER[3] |= (0x1<<2);
    57. //PF9 99号中断
    58. GICD->ISENABLER[3] |= (0x1<<3);
    59. //设置中断优先级 GICD_ISENABLERx
    60. //PF7
    61. GICD->IPRIORITYR[24] &= (~(0x1F<<11));
    62. //PF8
    63. GICD->IPRIORITYR[24] &= (~(0x1F<<19));
    64. //PF9
    65. GICD->IPRIORITYR[24] &= (~(0x1F<<27));
    66. //设置当前中断被转发到哪一个CPU处理
    67. //PF7 97中断
    68. GICD->ITARGETSR[24] &= (~(0x3<<8));
    69. GICD->ITARGETSR[24] |= (0x1<<8);
    70. //PF8 98中断
    71. GICD->ITARGETSR[24] &= (~(0x3<<16));
    72. GICD->ITARGETSR[24] |= (0x1<<16);
    73. //PF9 99中断
    74. GICD->ITARGETSR[24] &= (~(0x3<<24));
    75. GICD->ITARGETSR[24] |= (0x1<<24);
    76. //使能组0转发中断 GICD_CTRL
    77. GICD->CTRL |= 0x1;
    78. //设置中断优先级掩码 GICC_PMR
    79. GICC->PMR |= (0x1F<<3);
    80. //使能CPU可以处理组0转发的中断GICC_CTRL
    81. GICC->CTRL |= 0x1;
    82. }

    led.c

    1. #include "led.h"
    2. //延时函数
    3. void delay(int ms)
    4. {
    5. int i,j;
    6. for(i=0; i
    7. {
    8. for(j=0; j<2000; j++);
    9. }
    10. }
    11. //GPIO初始化
    12. void all_led_init()
    13. {
    14. //RCC使能
    15. RCC |= (0x3<<4);
    16. //设置PE10 PF10 PE8为输出模式
    17. GPIOE.moder &= (~(0x3<<20));
    18. GPIOE.moder |= (0x1<<20);
    19. GPIOF.moder &= (~(0x3<<20));
    20. GPIOF.moder |= (0x1<<20);
    21. GPIOE.moder &= (~(0x3<<16));
    22. GPIOE.moder |= (0x1<<16);
    23. //设置推挽输出
    24. GPIOE.otyper &= (~(0x1<<10));
    25. GPIOF.otyper &= (~(0x1<<10));
    26. GPIOE.otyper &= (~(0x1<<8));
    27. //设置三个管脚低速输出
    28. GPIOE.ospeedr &= (~(0x3<<20));
    29. GPIOF.ospeedr &= (~(0x3<<20));
    30. GPIOE.ospeedr &= (~(0x3<<16));
    31. //设置三个管脚输出时无上拉电阻和下拉电阻
    32. GPIOE.pupdr &= (~(0x3<<20));
    33. GPIOF.pupdr &= (~(0x3<<20));
    34. GPIOE.pupdr &= (~(0x3<<16));
    35. }

    feng2.c

    1. #include "feng2.h"
    2. void buzzer_init()
    3. {
    4. //RCC使能GPIOB时钟
    5. RCC->MP_AHB4ENSETR |= (0x1<<1);
    6. //PB6
    7. GPIOB->MODER &= (~(0x3<<12));
    8. GPIOB->MODER |= (0x1<<12);
    9. GPIOB->OTYPER &= (~(0x1<<6));
    10. GPIOB->OSPEEDR &= (~(0x3<<12));
    11. GPIOB->PUPDR &= (~(0x3<<12));
    12. }
    13. void fan_init()
    14. {
    15. GPIOE->MODER &= (~(0x3<<18));
    16. //PE9
    17. GPIOE->MODER |= (0x1<<18);
    18. GPIOE->OTYPER &= (~(0x1<<9));
    19. GPIOE->OSPEEDR &= (~(0x3<<18));
    20. GPIOE->PUPDR &= (~(0x3<<18));
    21. }

    do_irq.c

    1. #include "key_it.h"
    2. extern void printf(const char *fmt, ...);
    3. unsigned int i = 0;
    4. void do_irq(void)
    5. {
    6. int irqno; //保存中断号
    7. irqno = GICC->IAR&0x3FF;
    8. switch(irqno)
    9. {
    10. case 99: //key1
    11. //按键1中断处理
    12. printf("KEY1 INT\n");
    13. if(GPIOE->ODR & (0x1<<10))
    14. {
    15. GPIOE->ODR &= (~(0x1<<10));
    16. }else
    17. {
    18. GPIOE->ODR |= (0x1<<10);
    19. }
    20. //清除挂起中断标志位 GICD_ICPENDRx
    21. GICD->ICPENDR[3] |= (0x1 << 3);
    22. //清除中断触发标志位 EXTI_FPR1
    23. EXTI->FPR1 |= (0x1 << 9);
    24. break;
    25. case 97: //key2
    26. //按键2中断处理
    27. printf("KEY2 INT\n");
    28. if(GPIOB->ODR & (0x1<<6))
    29. {
    30. GPIOB->ODR &= (~(0x1<<6));
    31. }else
    32. {
    33. GPIOB->ODR |= (0x1<<6);
    34. }
    35. //清除挂起中断标志位 GICD_ICPENDRx
    36. GICD->ICPENDR[3] |= (0x1 << 1);
    37. //清除中断触发标志位 EXTI_FPR1
    38. EXTI->FPR1 |= (0x1 << 7);
    39. break;
    40. case 98: //key3
    41. //按键3中断处理
    42. printf("KEY3 INT\n");
    43. if(GPIOE->ODR & (0x1<<9))
    44. {
    45. GPIOE->ODR &= (~(0x1<<9));
    46. }else
    47. {
    48. GPIOE->ODR |= (0x1<<9);
    49. }
    50. //清除挂起中断标志位 GICD_ICPENDRx
    51. GICD->ICPENDR[3] |= (0x1 << 2);
    52. //清除中断触发标志位 EXTI_FPR1
    53. EXTI->FPR1 |= (0x1 << 8);
    54. break;
    55. default:
    56. break;
    57. }
    58. //清除处理完的中断号 GICC_EOIR
    59. GICC->EOIR = irqno;
    60. }

    main.c

    1. #include "uart.h"
    2. int main()
    3. {
    4. // char c;
    5. // char *s;
    6. //串口初始化
    7. uart4_init();
    8. //中断初始化
    9. all_led_init();
    10. buzzer_init();
    11. fan_init();
    12. key_it_config();
    13. key3_it_config();
    14. while(1)
    15. {
    16. //保证主程序不结束
    17. }
    18. return 0;
    19. }

  • 相关阅读:
    机器人路径规划:基于Q-learning算法的移动机器人路径规划,可以自定义地图,修改起始点,提供MATLAB代码
    【hnu暑学期】数据库系统设计 准备阶段
    正则表达式匹配
    uni-app实现点击复制按钮 复制内容
    如何选择数据恢复软件:11 个最佳数据恢复软件比较
    相比Superset和Metabase,DataEase开源工具为什么更易用?
    引入Bootstrap的CSS样式后,<h>标签、<p>标签等HTML自带的标签被覆写没有?答:覆写了。
    SLAM从入门到精通(数据回放工具之rosbag)
    决策树算法
    聊聊ChatGPT是如何组织对话的
  • 原文地址:https://blog.csdn.net/Lychee_z23/article/details/133799174