• ARM day9


    src/key_it.c

    1. #include "key_it.h"
    2. #include "led.h"
    3. void key_it_config()
    4. {
    5. //RCC使能GPIOF时钟
    6. RCC->MP_AHB4ENSETR |= (0x1<<5);
    7. //设置PF9 PF7 PF8GPIO输入
    8. //PF9
    9. GPIOF->MODER &= (~(0x3<<18));
    10. //PF8
    11. GPIOF->MODER &= (~(0x3<<16));
    12. //PF7
    13. GPIOF->MODER &= (~(0x3<<14));
    14. //设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx
    15. //PF7
    16. EXTI->EXTICR2 &= (~(0xFF<<24));
    17. EXTI->EXTICR2 |= (0x5<<24);
    18. //PF8
    19. EXTI->EXTICR3 &= (~(0xFF<<0));
    20. EXTI->EXTICR3 |= (0x5<<0);
    21. //PF9
    22. EXTI->EXTICR3 &= (~(0xFF<<8));
    23. EXTI->EXTICR3 |= (0x5<<8);
    24. //设置事件触发方式为下降沿触发EXTI_FTSR1
    25. //PF7
    26. EXTI->FTSR1 |= (0x1<<7);
    27. //PF8
    28. EXTI->FTSR1 |= (0x1<<8);
    29. //PF9
    30. EXTI->FTSR1 |= (0x1<<9);
    31. //设置EXTI事件触发不屏蔽EXTI_IMR1
    32. //PF7
    33. EXTI->C1IMR1 |= (0x1<<7);
    34. //PF8
    35. EXTI->C1IMR1 |= (0x1<<8);
    36. //PF9
    37. EXTI->C1IMR1 |= (0x1<<9);
    38. //使能组0转发中断GICD_CTLR
    39. GICC->CTRL |= 0x1;
    40. //使能中断能转发到待定的CPU接口层GICD_ISENABLERx
    41. //PF7 97中断
    42. GICD->ISENABLER[3] |= (0x1<<1);
    43. //PF7 98中断
    44. GICD->ISENABLER[3] |= (0x1<<2);
    45. //PF7 99中断
    46. GICD->ISENABLER[3] |= (0x1<<3);
    47. //GICD_ISENABLERx设置中断优先级
    48. //PF7
    49. GICD->IPRIORITYR[24] &= (~(0x1F<<11));
    50. //PF8
    51. GICD->IPRIORITYR[24] &= (~(0x1F<<19));
    52. //PF9
    53. GICD->IPRIORITYR[24] &= (~(0x1F<<27));
    54. //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx
    55. //PF7 97中断
    56. GICD->ITARGETSR[24] &= (~(0x3<<8));
    57. GICD->ITARGETSR[24] |= (0x1<<8);
    58. //PF8 98中断
    59. GICD->ITARGETSR[24] &= (~(0x3<<16));
    60. GICD->ITARGETSR[24] |= (0x1<<16);
    61. //PF9 99中断
    62. GICD->ITARGETSR[24] &= (~(0x3<<24));
    63. GICD->ITARGETSR[24] |= (0x1<<24);
    64. //使能CPU可以处理组0转发的中断GICC_CTLR
    65. GICD->CTRL |= 0x1;
    66. //设置中断优先级掩码GICC_CTLR
    67. GICC->PMR |= (0x1F<<3);
    68. }
    69. //延时函数
    70. /*void delay(int ms)
    71. {
    72. int i,j;
    73. for(i=0;i
    74. {
    75. for(j=0;j<2000;j++);
    76. }
    77. }*/
    78. //灯 GPIO初始化
    79. void all_led_init()
    80. {
    81. //RCC使能
    82. RCC->MP_AHB4ENSETR |= (0x3<<4);
    83. //设置PE10
    84. //PE10
    85. GPIOE->MODER &=(~(0x3f<<16));
    86. GPIOE->MODER |=(0x15<<16);
    87. //PB6
    88. GPIOB->MODER &=(~(0x3<<12));
    89. GPIOB->MODER |=(0x1<<12);
    90. //设置推挽输出
    91. //PE10
    92. GPIOE->OTYPER &=(~(0x1<<10));
    93. //PB6
    94. GPIOB->OTYPER &=(~(0x1<<6));
    95. //设置2个管脚低速输出
    96. //PE10
    97. GPIOE->OSPEEDR &=(~(0x3<<20));
    98. //PB6
    99. GPIOB->OSPEEDR &=(~(0x3<<12));
    100. //PE10
    101. GPIOE->PUPDR &=(~(0x3<<20));
    102. //PB6
    103. GPIOB->PUPDR &=(~(0x3<<12));
    104. }

    src/do_irq.c

    1. #include "key_it.h"
    2. #include "myuart.h"
    3. #include "led.h"
    4. extern void printf(const char *fmt, ...);
    5. unsigned int i = 0;
    6. int num1=0,num2=0,num3=0;
    7. void do_irq(void)
    8. {
    9. int irqno;//保存中断号
    10. irqno = GICC->IAR&0X3FF;
    11. switch(irqno)
    12. {
    13. case 99://key1
    14. //按键1中断处理
    15. printf("KEY INT1\n");
    16. //风扇转
    17. if(num3==0)
    18. {
    19. GPIOE->ODR |=(0x1<<9);
    20. num3++;
    21. }
    22. //风扇停
    23. else if(num3>0)
    24. {
    25. GPIOE->ODR &=(~(0x1<<9));
    26. num3=0;
    27. }
    28. //清除挂起中断标志位GICD_ICPENDRx
    29. GICD->ICPENDR[3] |= (0x1<<3);
    30. //清除中断触发标志位EXTI_FRR1
    31. EXTI->FPR1 |= (0x1<<9);
    32. break;
    33. case 97://key2
    34. //按键2中断处理
    35. printf("KEY INT2\n");
    36. //蜂鸣器响
    37. if(num2==0)
    38. {
    39. GPIOB->ODR |=(0x1<<6);
    40. num2++;
    41. }
    42. //蜂鸣器停
    43. else if(num2>0)
    44. {
    45. GPIOB->ODR &=(~(0x1<<6));
    46. num2=0;
    47. }
    48. //清除挂起中断标志位GICD_ICPENDRx
    49. GICD->ICPENDR[3] |= (0x1<<1);
    50. //清除中断触发标志位EXTI_FRR1
    51. EXTI->FPR1 |= (0x1<<7);
    52. break;
    53. case 98://key3
    54. //按键3中断处理
    55. printf("KEY INT3\n");
    56. //LED1亮
    57. if(num1==0)
    58. {
    59. GPIOE->ODR |=(0x1<<10);
    60. num1++;
    61. }
    62. else if(num1>0)
    63. {
    64. GPIOE->ODR &=(~(0x1<<10));
    65. num1=0;
    66. }
    67. //清除挂起中断标志位GICD_ICPENDRx
    68. GICD->ICPENDR[3] |= (0x1<<2);
    69. //清除中断触发标志位EXTI_FRR1
    70. EXTI->FPR1 |= (0x1<<8);
    71. break;
    72. }
    73. //清除处理完的中断号GICC_EOIR
    74. GICC->EOIR=irqno;
    75. }

    include/led.h

    1. #ifndef __LED_H__
    2. #define __LED_H__
    3. //创建寄存器组织结构体
    4. /*
    5. typedef struct
    6. {
    7. unsigned int moder;
    8. unsigned int otyper;
    9. unsigned int ospeedr;
    10. unsigned int pupdr;
    11. unsigned int idr;
    12. unsigned int odr;
    13. }gpio_t;
    14. #define GPIOE (*(gpio_t)0x50006000)
    15. #define GPIOE (*(gpio_t)0x50007000)
    16. #define RCC (*(unsigned int *)0x50000A28)
    17. */
    18. void deley(int ms);
    19. void all_led_init();
    20. #endif

    include/key_it.h

    1. #ifndef __KEY_IT_H__
    2. #define __KEY_IT_H__
    3. #include "stm32mp1xx_rcc.h"
    4. #include "stm32mp1xx_gpio.h"
    5. #include "stm32mp1xx_exti.h"
    6. #include "stm32mp1xx_gic.h"
    7. void key_it_config();
    8. #endif

    main.c

    1. #include "myuart.h"
    2. #include "key_it.h"
    3. #include "led.h"
    4. int main()
    5. {
    6. //char c;
    7. //char *s;
    8. uart4_init();//串口初始化
    9. //中断初始化
    10. key_it_config();
    11. //初始化
    12. all_led_init();
    13. while(1)
    14. {
    15. //保证主程序不结束
    16. //串口数据收发
    17. //接受一个字符
    18. //c=getchar();
    19. //发送字符
    20. //putchar(c+1);
    21. //接受一个字符串
    22. //s=my_gets();
    23. //发送一个字符串
    24. //my_puts(s);
    25. }
    26. return 0;
    27. }

    结果:

  • 相关阅读:
    k8s网络插件之Flannel
    跨域的解决方法
    嵌入式移植jpeglib--Linux交叉编译ARM平台
    MIPI CSI接口调试方法: data rate计算
    成像雷达量产突破:木牛携手全球合作伙伴突破智驾瓶颈
    Set和Map及哈希表介绍
    [基础服务] 常用邮箱服务地址
    Nodejs+vue体育用品商城商品购物推荐系统_t81xg
    Maven系列第2篇:安装、配置、mvn运行过程详解
    数字孪生在工业制造中的应用领域及技术体系构建
  • 原文地址:https://blog.csdn.net/m0_59031281/article/details/133798802