• arm实验


    设置按键中断,按键1按下,LED亮,再次按下,灭

    按键2按下,蜂鸣器叫,再次按下,停

    按键3按下,风扇转,再次按下,停

    头文件

    1. #ifndef __CTRL_KEY_H__
    2. #define __CTRL_KEY_H__
    3. #include "stm32mp1xx_gpio.h"
    4. #include "stm32mp1xx_rcc.h"
    5. #include "stm32mp1xx_exti.h"
    6. #include "stm32mp1xx_gic.h"
    7. void all_led_init(); //初始化灯
    8. void fan_init(); //初始化风扇
    9. void voice_init(); //初始化蜂鸣器
    10. void key_config(); //初始化中断
    11. #endif

    异常处理文件

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

    初始化文件

    1. #include "ctrl_key.h"
    2. void key_config()
    3. {
    4. //RCC使能GPIOF时钟 第5位置1
    5. RCC->MP_AHB4ENSETR |=(0x1<<5);
    6. //设置PF9、PF7、PF8的GPIOF输入模式 将[14:19]位置0
    7. GPIOF->MODER &= (~(0x3f<<14));
    8. //设置PF9、PF7、PF8产生EXTI事件
    9. //key2
    10. EXTI->EXTICR2 &=(~(0xff<<24));
    11. EXTI->EXTICR2 |=(0x5<<24);
    12. //key3
    13. EXTI->EXTICR3 &=(~(0xff));
    14. EXTI->EXTICR3 |=(0x05);
    15. //key1
    16. EXTI->EXTICR3 &=(~(0xff<<8));
    17. EXTI->EXTICR3 |=(0x05<<8);
    18. //设置事件触发方式为下降沿触发
    19. EXTI->FTSR1 |= (0x7<<7);
    20. //设置EXTI事件触发不屏蔽
    21. EXTI->C1IMR1 |=(0x7<<7);
    22. //使能组0转发中断
    23. GICD->CTRL |=(0x1);
    24. //使能中断能转发到指定的cpu接口层GICD_ISENABLERx
    25. //key1
    26. GICD->ISENABLER[3] |=(0x1<<3);
    27. //key2
    28. GICD->ISENABLER[3] |=(0x1<<1);
    29. //key3
    30. GICD->ISENABLER[3] |=(0x1<<2);
    31. //GICD_IPRIORITYRx寄存器 设置中断优先级
    32. //key1优先级
    33. GICD->IPRIORITYR[24] &= (~(0x1f<<27));
    34. //Key2优先级
    35. GICD->IPRIORITYR[24] &= (~(0x1f<<11));
    36. //key3优先级
    37. GICD->IPRIORITYR[24] &= (~(0x1f<<19));
    38. //设置当前中断被转发到哪一个cpu处理GICD_ITARGETSRx
    39. GICD->ITARGETSR[24] &= (~(0x3<<24));
    40. GICD->ITARGETSR[24] |= (0x1<<24);
    41. GICD->ITARGETSR[24] &= (~(0x3<<8));
    42. GICD->ITARGETSR[24] |= (0x1<<8);
    43. GICD->ITARGETSR[24] &= (~(0x3<<16));
    44. GICD->ITARGETSR[24] |= (0x1<<16);
    45. //使能cpu可以处理组0转发的中断GICC_CTLR
    46. GICC->CTRL |=(0x1);
    47. //设置中断优先级掩码GICC_PMR
    48. GICC->PMR |=(0x1f<<3); //设置最低优先级
    49. }
    50. //初始化灯、
    51. void all_led_init()
    52. {
    53. //RCC使能
    54. RCC->MP_AHB4ENSETR |= (0x3<<4);
    55. //设置为输出模式
    56. GPIOE->MODER &= (~(0x3<<20));
    57. GPIOE->MODER |= (0x1<<20);
    58. GPIOF->MODER &= (~(0x3<<20));
    59. GPIOF->MODER |= (0x1<<20);
    60. GPIOE->MODER &= (~(0x3<<16));
    61. GPIOE->MODER |= (0x1<<16);
    62. //设置为推挽输出
    63. GPIOE->OTYPER &= (~(0x1<<10));
    64. GPIOF->OTYPER &= (~(0X1<<10));
    65. GPIOE->OTYPER &= (~(0X1<<8));
    66. //设置输出速度
    67. GPIOE->OSPEEDR &= (~(0X3<<20));
    68. GPIOF->OSPEEDR &= (~(0X3<<20));
    69. GPIOE->OSPEEDR &= (~(0X3<<16));
    70. //不设置上拉、下拉
    71. GPIOE->PUPDR &= ~((0X3<<20));
    72. GPIOF->PUPDR &= ~((0X3<<20));
    73. GPIOE->PUPDR &= ~((0X3<<16));
    74. }
    75. //初始化风扇
    76. void fan_init() //PE9
    77. {
    78. //RCC使能GPIOE
    79. RCC->MP_AHB4ENSETR |= (0x1<<4);
    80. //设置为输出模式
    81. GPIOE->MODER &= (~(0x3<<18));
    82. GPIOE->MODER |= (0x1<<18);
    83. //设置推挽输出
    84. GPIOE->OTYPER &= (~(0x1<<9));
    85. }
    86. //初始化蜂鸣器
    87. void voice_init() //PB6
    88. {
    89. //RCC使能GPIOB
    90. RCC->MP_AHB4ENSETR |=(0x1<<1);
    91. //设置输出模式
    92. GPIOB->MODER &= (~(0x3<<12));
    93. GPIOB->MODER |= (0x1<<12);
    94. //设置推挽输出
    95. GPIOB->OTYPER &=(~(0x1<<6));
    96. }

    调试主文件

    1. #include "ctrl_key.h"
    2. int main()
    3. {
    4. //初始化灯
    5. all_led_init();
    6. //初始化风扇
    7. fan_init();
    8. //初始化蜂鸣器
    9. voice_init();
    10. //中断初始化
    11. key_config();
    12. while(1)
    13. {
    14. //保证程序不结束
    15. }
    16. return 0;
    17. }

    实验效果:

  • 相关阅读:
    【C++ STL】-- priority_queue底层原理、使用、模拟实现
    springboot---优雅永不过时
    Yolov5 v7.0目标检测——详细记录环境配置、自定义数据处理、模型训练与常用错误解决方法(数据集为河道漂浮物)
    分享一点PDF中获取表格的探索过程
    p2p银行充值功能模块 支付宝调用
    025——日期与时间
    【分布式】高并发下如何防重?
    网页被劫持跳转怎么办?发布网修复方法
    C/C++结构体给函数传参
    Kubernetes(k8s)的三种资源管理方式
  • 原文地址:https://blog.csdn.net/cscssacd/article/details/133798494