• day51


    main.c 

    1. #include "uart.h"
    2. int main(int argc, const char *argv[])
    3. {
    4. key_it_config();
    5. key3_it_config();
    6. rcc_start();
    7. gpio_start();
    8. while(1)
    9. {
    10. }
    11. return 0;
    12. }

     uart.c

    1. #include "uart.h"
    2. void key3_it_config()
    3. {
    4. RCC->MP_AHB4ENSETR |= (0x1<<5);
    5. GPIOF->MODER &=(~(0x3<<16));
    6. EXTI->EXTICR3 &=(~(0xFF<<0));
    7. EXTI->EXTICR3 |=(0x5<<0);
    8. EXTI->FTSR1 |=(0x1<<8);
    9. EXTI->C1IMR1 |=(0x1<<8);
    10. GICD->ISENABLER[3] |=(0x1<<2);
    11. GICD->IPRIORITYR[24] &= (~(0x1F<<19));
    12. GICD->ITARGETSR[24] &= (~(0x3<<16));
    13. GICD->ITARGETSR[24] |= (0x1<<16);
    14. }
    15. void key_it_config()
    16. {
    17. //RCC使能GPIOF时钟
    18. RCC->MP_AHB4ENSETR |=(0x1<<5);
    19. //设置PF9 PF7 PF8GPIO输入
    20. //PF9
    21. GPIOF->MODER &= (~(0x3<<18));
    22. //PF8
    23. // GPIOF->MODER &= (~(0x3<<16));
    24. //pf7
    25. GPIOF->MODER &= (~(0x3<<14));
    26. //设置PF9 PF7 PF8产生EXTI事件 EXTI_EXTICRx
    27. //pf7
    28. EXTI->EXTICR2 &=(~(0xFF<<24));
    29. EXTI->EXTICR2 |= (0x5<<24);
    30. //pf8
    31. // EXTI->EXTICR3 &=(~(0xFF<<0));
    32. // EXTI->EXTICR3 |= (0x5<<0);
    33. //pf9
    34. EXTI->EXTICR3 &=(~(0xFF<<8));
    35. EXTI->EXTICR3 |= (0x5<<8);
    36. //设置事件触发方式为下降沿触发EXTI_FTSR1
    37. //pf7
    38. EXTI->FTSR1 |= (0x1<<7);
    39. //pf8
    40. // EXTI->FTSR1 |= (0x1<<8);
    41. //pf9
    42. EXTI->FTSR1 |= (0x1<<9);
    43. //设置EXTI事件触发不屏蔽EXTI_IMR1
    44. //PF7
    45. EXTI->C1IMR1 |= (0x1<<7);
    46. //PF8
    47. // EXTI->C1IMR1 |= (0x1<<8);
    48. //PF9
    49. EXTI->C1IMR1 |= (0x1<<9);
    50. //使能中断能转发到特定的CPU接口层GICD_ISENABLERx
    51. //PF7 97号中断
    52. GICD->ISENABLER[3] |= (0X1<<1);
    53. //PF78 98号中断
    54. // GICD->ISENABLER[3] |= (0X1<<2);
    55. //PF9 99号中断
    56. GICD->ISENABLER[3] |= (0X1<<3);
    57. // GICD_ISENABLERx设置中断优先级
    58. //PF7
    59. GICD->IPRIORITYR[24] &= (~(0X1F<<11));
    60. //PF8
    61. // GICD->IPRIORITYR[24] &= (~(0X1F<<19));
    62. //PF9
    63. GICD->IPRIORITYR[24] &= (~(0X1F<<27));
    64. //设置当前中断被转发到哪一个CPU处理GICD_ITARGETSRx
    65. //pf7 97中断
    66. GICD->ITARGETSR[24] &= (~(0X3<<8));
    67. GICD->ITARGETSR[24] |= (0X1<<8);
    68. //pf8 98中断
    69. // GICD->ITARGETSR[24] &= (~(0X3<<16));
    70. // GICD->ITARGETSR[24] |= (0X1<<16);
    71. //pf9 99中断
    72. GICD->ITARGETSR[24] &= (~(0X3<<24));
    73. GICD->ITARGETSR[24] |= (0X1<<24);
    74. //使能组0转发中断GICD_CTLR
    75. GICD->CTRL |= 0X1;
    76. //设置中断优先级掩码GICC_PMR
    77. GICC->PMR |= (0x1F<<3);
    78. //使能CPU可以处理组0转发的中断GICC_CTLR
    79. GICC->CTRL |= 0X1;
    80. }
    81. //给RCC使能
    82. void rcc_start()
    83. {
    84. RCC->MP_AHB4LPENSETR |= (0x3<<4);
    85. }
    86. void gpio_start()
    87. {
    88. //PE10 PE9 PE8设置为输出模式
    89. GPIOE->MODER &= (~(0x3f<<16));
    90. GPIOE->MODER |= (0x15<<16);
    91. //PF10设置为输出模式
    92. GPIOF->MODER &= (~(0x3<<20));
    93. GPIOF->MODER |= (0x1<<20);
    94. //PB6设置为输出模式
    95. GPIOB->MODER &= (~(0x3<<12));
    96. GPIOB->MODER |= (0x1<<12);
    97. //PE10 PE9 PE8设置为推挽输出
    98. GPIOE->OTYPER &= (~(0x7<<8));
    99. //PF10设置为推挽输出
    100. GPIOF->OTYPER &= (~(0x1<<10));
    101. //PB6设置为推挽输出
    102. GPIOB->OTYPER &= (~(0x1<<6));
    103. //PE10 PE9 PE8设置为低速输出
    104. GPIOE->OSPEEDR &= (~(0x3f<<16));
    105. //PF10设置为低速输出
    106. GPIOF->OSPEEDR &= (~(0x3<<20));
    107. //PB6设置为低速输出
    108. GPIOB->OSPEEDR &= (~(0x3<<12));
    109. //PE10 PE9 PE8设置为无上拉下拉电阻
    110. GPIOE->PUPDR &= (~(0x3f<<16));
    111. //PF10设置为无上拉下拉电阻
    112. GPIOF->PUPDR &= (~(0x3<<20));
    113. //PB6设置为无上拉下拉电阻
    114. GPIOB->PUPDR &= (~(0x3<<16));
    115. }

    do_irq.c 

    1. #include "uart.h"
    2. extern void printf(const char *fmt, ...);
    3. unsigned int i = 0;
    4. int x=0,j=0,k=0;
    5. void do_irq(void)
    6. {
    7. int irqno;
    8. irqno = GICC->IAR & 0x3FF;
    9. printf("%d\n",irqno);
    10. switch (irqno)
    11. {
    12. case 99://key1
    13. if(x==0)
    14. {
    15. //灯亮
    16. GPIOF->ODR |=(0x1<<10);
    17. x=1;
    18. }else
    19. {
    20. //灯灭
    21. GPIOF->ODR &=(~(0x1<<10));
    22. x=0;
    23. }
    24. GICD->ICPENDR[3] |=(0x1<<3);
    25. EXTI->FPR1 |=(0x1<<9);
    26. break;
    27. case 97://key2
    28. if(j == 0)
    29. {
    30. //PB6
    31. GPIOB->ODR |= (0x1<<6);
    32. j=1;
    33. }
    34. //蜂鸣器停
    35. else
    36. {
    37. //PB6
    38. GPIOB->ODR &= ~(0x1<<6);
    39. j = 0;
    40. }
    41. //清除挂起中断标志位GICD_ICPENDRx
    42. GICD->ICPENDR[3] |= (0x1<<1);
    43. //清除中断触发标志位EXTI_FPR1
    44. EXTI->FPR1 |= (0x1<<7);
    45. break;
    46. case 98://key3
    47. if(k==0)
    48. {
    49. //PE9
    50. GPIOE->ODR |=(0x1<<9);
    51. k=1;
    52. }
    53. else
    54. {
    55. GPIOE->ODR &=(~(0x1<<9));
    56. k=0;
    57. }
    58. //清除挂起中断标志位GICD_ICPENDRx
    59. GICD->ICPENDR[3] |= (0x1<<1);
    60. //清除中断触发标志位EXTI_FPR1
    61. EXTI->FPR1 |= (0x1<<7);
    62. break;
    63. }
    64. GICC->EOIR =irqno;
    65. }

  • 相关阅读:
    有哪些比较好用的协同办公软件
    自定义开发odoo14的统计在线用户人数
    Servlet的生命周期
    操作系统(Operating System)知识点复习——第八章 虚拟内存
    Zynq UltraScale+ XCZU4EV 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持
    JDBC概述
    开源知识库平台Raneto
    java项目之个人健康信息管理(ssm+jsp)
    数据排序 归并排序,计数排序以及快速排序的三路优化
    c语言-将字符串转换成整数(类似atoi()函数)
  • 原文地址:https://blog.csdn.net/weixin_69452640/article/details/133798807