OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6623|回复: 10

stm32mp157无系统裸机之中断(GIC)初窥门径

[复制链接]

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
发表于 2020-12-5 12:57:20 | 显示全部楼层 |阅读模式
本帖最后由 sppz 于 2020-12-5 16:21 编辑

上一篇[stm32mp157裸机启动过程探寻]
本篇文章为原子stm32mp157无系统裸机,个人框架(c++)下的第二篇[记录,总结,资料汇总].
本篇文章完成了一个非常简单粗浅的中断,即uart4每接受一个字节就在uart4发送一个字节.

--------分割线,以下为资料地址--------
stm32mp157参考手册
arm gic v2
网上一篇非常好的arm-a7中断相关文章
原子mp157硬件参考手册
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
 楼主| 发表于 2020-12-5 12:57:43 | 显示全部楼层
本帖最后由 sppz 于 2020-12-5 15:52 编辑

根据资料,arm中断表有八项,而不同cpu的gic实现又有很多gic项
所以这里用链接脚本文件定义了两个表项,即arm中断向量表和stm32mp157的gic表,如下
  1. MEMORY
  2. {
  3.     _ram(rwx) : ORIGIN = 0x2ffc2400, LENGTH = 252928
  4. }

  5. ENTRY(px_interrupt_reset)
  6. SECTIONS
  7. {
  8.     /*------ sections ------*/
  9.     /* stm32 header */
  10.     .stm32 :
  11.     {
  12.         LONG(0x324D5453); /* magic number "STM"32 */
  13.         QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); /* image signature */
  14.         LONG(0); /* image checksum */
  15.         LONG(0x00010000); /* header version */
  16.         LONG(ADDR(.data) - ADDR(.text.px_interrupt_table) + SIZEOF(.data)); /* image length */
  17.         LONG(px_interrupt_reset); /* image entry */
  18.         LONG(0); /* reserved */
  19.         LONG(0x2ffc2500); /* load address of image */
  20.         LONG(0); /* reserved */
  21.         LONG(0); /* image version */
  22.         LONG(0x00000001); /* option flags */
  23.         LONG(0x00000001); /* ECDSA algorithm */
  24.         QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); /* ECDSA public key */
  25.         QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); QUAD(0); SHORT(0); BYTE(0); /* padding */
  26.         BYTE(0x0); /* binary type */
  27.     }
  28.     > _ram
  29.     /* .text.px_interrupt_table */
  30.     .text.px_interrupt_table :
  31.     {
  32.         *(.text.px_interrupt_table);
  33.     } > _ram
  34.     /* text */
  35.     .text : { *(.text); } > _ram
  36.     /* exception sections */
  37.     .ARM.exidx : { *(.ARM.exidx); } > _ram
  38.     .ARM.extab : { *(.ARM.extab); } > _ram
  39.     /* .init_array */
  40.     .init_array : { *.(init_array); } > _ram
  41.     /* .rodata.px_GIC_table */
  42.     .rodata.px_GIC_table :
  43.     {
  44.         px_GIC_table = .;
  45.         PROVIDE(px_GIC_default = 0);
  46.         PROVIDE(px_GIC_SGI0 = px_GIC_default); LONG(px_GIC_SGI0);
  47.         PROVIDE(px_GIC_SGI1 = px_GIC_default); LONG(px_GIC_SGI1);
  48.         PROVIDE(px_GIC_SGI2 = px_GIC_default); LONG(px_GIC_SGI2);
  49.         PROVIDE(px_GIC_SGI3 = px_GIC_default); LONG(px_GIC_SGI3);
  50.         PROVIDE(px_GIC_SGI4 = px_GIC_default); LONG(px_GIC_SGI4);
  51.         PROVIDE(px_GIC_SGI5 = px_GIC_default); LONG(px_GIC_SGI5);
  52.         PROVIDE(px_GIC_SGI6 = px_GIC_default); LONG(px_GIC_SGI6);
  53.         PROVIDE(px_GIC_SGI7 = px_GIC_default); LONG(px_GIC_SGI7);
  54.         PROVIDE(px_GIC_SGI8 = px_GIC_default); LONG(px_GIC_SGI8);
  55.         PROVIDE(px_GIC_SGI9 = px_GIC_default); LONG(px_GIC_SGI9);
  56.         PROVIDE(px_GIC_SGI10 = px_GIC_default); LONG(px_GIC_SGI10);
  57.         PROVIDE(px_GIC_SGI11 = px_GIC_default); LONG(px_GIC_SGI11);
  58.         PROVIDE(px_GIC_SGI12 = px_GIC_default); LONG(px_GIC_SGI12);
  59.         PROVIDE(px_GIC_SGI13 = px_GIC_default); LONG(px_GIC_SGI13);
  60.         PROVIDE(px_GIC_SGI14 = px_GIC_default); LONG(px_GIC_SGI14);
  61.         PROVIDE(px_GIC_SGI15 = px_GIC_default); LONG(px_GIC_SGI15);
  62.         LONG(px_GIC_default);
  63.         LONG(px_GIC_default);
  64.         LONG(px_GIC_default);
  65.         LONG(px_GIC_default);
  66.         LONG(px_GIC_default);
  67.         LONG(px_GIC_default);
  68.         LONG(px_GIC_default);
  69.         LONG(px_GIC_default);
  70.         LONG(px_GIC_default);
  71.         PROVIDE(px_GIC_PPI6 = px_GIC_default); LONG(px_GIC_PPI6);
  72.         PROVIDE(px_GIC_PPI5 = px_GIC_default); LONG(px_GIC_PPI5);
  73.         PROVIDE(px_GIC_PPI4 = px_GIC_default); LONG(px_GIC_PPI4);
  74.         PROVIDE(px_GIC_PPI0 = px_GIC_default); LONG(px_GIC_PPI0);
  75.         PROVIDE(px_GIC_PPI1 = px_GIC_default); LONG(px_GIC_PPI1);
  76.         PROVIDE(px_GIC_PPI2 = px_GIC_default); LONG(px_GIC_PPI2);
  77.         PROVIDE(px_GIC_PPI3 = px_GIC_default); LONG(px_GIC_PPI3);
  78.         PROVIDE(px_GIC_WWDG1_IT = px_GIC_default); LONG(px_GIC_WWDG1_IT);
  79.         PROVIDE(px_GIC_EXTI16 = px_GIC_default); PROVIDE(px_GIC_PVD_AVD = px_GIC_EXTI16); LONG(px_GIC_PVD_AVD); /* TODO 如此条添加EXTI */
  80.         PROVIDE(px_GIC_TAMP = px_GIC_default); LONG(px_GIC_TAMP);
  81.         PROVIDE(px_GIC_RTC_WKUP_ALARM = px_GIC_default); LONG(px_GIC_RTC_WKUP_ALARM);
  82.         PROVIDE(px_GIC_TZC_IT = px_GIC_default); LONG(px_GIC_TZC_IT);
  83.         PROVIDE(px_GIC_RCC = px_GIC_default); LONG(px_GIC_RCC);
  84.         PROVIDE(px_GIC_EXTI0 = px_GIC_default); LONG(px_GIC_EXTI0);
  85.         PROVIDE(px_GIC_EXTI1 = px_GIC_default); LONG(px_GIC_EXTI1);
  86.         PROVIDE(px_GIC_EXTI2 = px_GIC_default); LONG(px_GIC_EXTI2);
  87.         PROVIDE(px_GIC_EXTI3 = px_GIC_default); LONG(px_GIC_EXTI3);
  88.         PROVIDE(px_GIC_EXTI4 = px_GIC_default); LONG(px_GIC_EXTI4);
  89.         PROVIDE(px_GIC_DMA1_STR0 = px_GIC_default); LONG(px_GIC_DMA1_STR0);
  90.         PROVIDE(px_GIC_DMA1_STR1 = px_GIC_default); LONG(px_GIC_DMA1_STR1);
  91.         PROVIDE(px_GIC_DMA1_STR2 = px_GIC_default); LONG(px_GIC_DMA1_STR2);
  92.         PROVIDE(px_GIC_DMA1_STR3 = px_GIC_default); LONG(px_GIC_DMA1_STR3);
  93.         PROVIDE(px_GIC_DMA1_STR4 = px_GIC_default); LONG(px_GIC_DMA1_STR4);
  94.         PROVIDE(px_GIC_DMA1_STR5 = px_GIC_default); LONG(px_GIC_DMA1_STR5);
  95.         PROVIDE(px_GIC_DMA1_STR6 = px_GIC_default); LONG(px_GIC_DMA1_STR6);
  96.         PROVIDE(px_GIC_ADC1 = px_GIC_default); LONG(px_GIC_ADC1);
  97.         PROVIDE(px_GIC_FDCAN1_IT0 = px_GIC_default); LONG(px_GIC_FDCAN1_IT0);
  98.         PROVIDE(px_GIC_FDCAN2_IT0 = px_GIC_default); LONG(px_GIC_FDCAN2_IT0);
  99.         PROVIDE(px_GIC_FDCAN1_IT1 = px_GIC_default); LONG(px_GIC_FDCAN1_IT1);
  100.         PROVIDE(px_GIC_FDCAN2_IT1 = px_GIC_default); LONG(px_GIC_FDCAN2_IT1);
  101.         PROVIDE(px_GIC_EXTI5 = px_GIC_default); LONG(px_GIC_EXTI5);
  102.         PROVIDE(px_GIC_TIM1_BRK = px_GIC_default); LONG(px_GIC_TIM1_BRK);
  103.         PROVIDE(px_GIC_TIM1_UP = px_GIC_default); LONG(px_GIC_TIM1_UP);
  104.         PROVIDE(px_GIC_TIM1_TRG_COM = px_GIC_default); LONG(px_GIC_TIM1_TRG_COM);
  105.         PROVIDE(px_GIC_TIM1_CC = px_GIC_default); LONG(px_GIC_TIM1_CC);
  106.         PROVIDE(px_GIC_TIM2 = px_GIC_default); LONG(px_GIC_TIM2);
  107.         PROVIDE(px_GIC_TIM3 = px_GIC_default); LONG(px_GIC_TIM3);
  108.         PROVIDE(px_GIC_TIM4 = px_GIC_default); LONG(px_GIC_TIM4);
  109.         PROVIDE(px_GIC_I2C1_EVT = px_GIC_default); LONG(px_GIC_I2C1_EVT);
  110.         PROVIDE(px_GIC_I2C1_ERR = px_GIC_default); LONG(px_GIC_I2C1_ERR);
  111.         PROVIDE(px_GIC_I2C2_EVT = px_GIC_default); LONG(px_GIC_I2C2_EVT);
  112.         PROVIDE(px_GIC_I2C2_ERR = px_GIC_default); LONG(px_GIC_I2C2_ERR);
  113.         PROVIDE(px_GIC_SPI1 = px_GIC_default); LONG(px_GIC_SPI1);
  114.         PROVIDE(px_GIC_SPI2 = px_GIC_default); LONG(px_GIC_SPI2);
  115.         PROVIDE(px_GIC_USART1 = px_GIC_default); LONG(px_GIC_USART1);
  116.         PROVIDE(px_GIC_USART2 = px_GIC_default); LONG(px_GIC_USART2);
  117.         PROVIDE(px_GIC_USART3 = px_GIC_default); LONG(px_GIC_USART3);
  118.         PROVIDE(px_GIC_EXTI10 = px_GIC_default); LONG(px_GIC_EXTI10);
  119.         PROVIDE(px_GIC_RTC_TS = px_GIC_default); LONG(px_GIC_RTC_TS);
  120.         PROVIDE(px_GIC_EXTI11 = px_GIC_default); LONG(px_GIC_EXTI11);
  121.         PROVIDE(px_GIC_TIM8_BRK = px_GIC_default); LONG(px_GIC_TIM8_BRK);
  122.         PROVIDE(px_GIC_TIM8_UP = px_GIC_default); LONG(px_GIC_TIM8_UP);
  123.         PROVIDE(px_GIC_TIM8_TRG_COM = px_GIC_default); LONG(px_GIC_TIM8_TRG_COM);
  124.         PROVIDE(px_GIC_TIM8_CC = px_GIC_default); LONG(px_GIC_TIM8_CC);
  125.         PROVIDE(px_GIC_DMA1_STR7 = px_GIC_default); LONG(px_GIC_DMA1_STR7);
  126.         PROVIDE(px_GIC_FMC = px_GIC_default); LONG(px_GIC_FMC);
  127.         PROVIDE(px_GIC_SDMMC1 = px_GIC_default); LONG(px_GIC_SDMMC1);
  128.         PROVIDE(px_GIC_TIM5 = px_GIC_default); LONG(px_GIC_TIM5);
  129.         PROVIDE(px_GIC_SPI3 = px_GIC_default); LONG(px_GIC_SPI3);
  130.         PROVIDE(px_GIC_EXTI30 = px_GIC_default); PROVIDE(px_GIC_UART4 = px_GIC_EXTI30); LONG(px_GIC_UART4);
  131.         PROVIDE(px_GIC_UART5 = px_GIC_default); LONG(px_GIC_UART5);
  132.         PROVIDE(px_GIC_TIM6 = px_GIC_default); LONG(px_GIC_TIM6);
  133.         PROVIDE(px_GIC_TIM7 = px_GIC_default); LONG(px_GIC_TIM7);
  134.         PROVIDE(px_GIC_DMA2_STR0 = px_GIC_default); LONG(px_GIC_DMA2_STR0);
  135.         PROVIDE(px_GIC_DMA2_STR1 = px_GIC_default); LONG(px_GIC_DMA2_STR1);
  136.         PROVIDE(px_GIC_DMA2_STR2 = px_GIC_default); LONG(px_GIC_DMA2_STR2);
  137.         PROVIDE(px_GIC_DMA2_STR3 = px_GIC_default); LONG(px_GIC_DMA2_STR3);
  138.         PROVIDE(px_GIC_DMA2_STR4 = px_GIC_default); LONG(px_GIC_DMA2_STR4);
  139.         PROVIDE(px_GIC_ETH1 = px_GIC_default); LONG(px_GIC_ETH1);
  140.         PROVIDE(px_GIC_ETH1_WKUP = px_GIC_default); LONG(px_GIC_ETH1_WKUP);
  141.         PROVIDE(px_GIC_FDCAN_CAL = px_GIC_default); LONG(px_GIC_FDCAN_CAL);
  142.         PROVIDE(px_GIC_EXTI6 = px_GIC_default); LONG(px_GIC_EXTI6);
  143.         PROVIDE(px_GIC_EXTI7 = px_GIC_default); LONG(px_GIC_EXTI7);
  144.         PROVIDE(px_GIC_EXTI8 = px_GIC_default); LONG(px_GIC_EXTI8);
  145.         PROVIDE(px_GIC_EXTI9 = px_GIC_default); LONG(px_GIC_EXTI9);
  146.         PROVIDE(px_GIC_DMA2_STR5 = px_GIC_default); LONG(px_GIC_DMA2_STR5);
  147.         PROVIDE(px_GIC_DMA2_STR6 = px_GIC_default); LONG(px_GIC_DMA2_STR6);
  148.         PROVIDE(px_GIC_DMA2_STR7 = px_GIC_default); LONG(px_GIC_DMA2_STR7);
  149.         PROVIDE(px_GIC_USART6 = px_GIC_default); LONG(px_GIC_USART6);
  150.         PROVIDE(px_GIC_I2C3_EVT = px_GIC_default); LONG(px_GIC_I2C3_EVT);
  151.         PROVIDE(px_GIC_I2C3_ERR = px_GIC_default); LONG(px_GIC_I2C3_ERR);
  152.         PROVIDE(px_GIC_USBH_OHCI = px_GIC_default); LONG(px_GIC_USBH_OHCI);
  153.         PROVIDE(px_GIC_USBH_EHCI = px_GIC_default); LONG(px_GIC_USBH_EHCI);
  154.         PROVIDE(px_GIC_EXTI12 = px_GIC_default); LONG(px_GIC_EXTI12);
  155.         PROVIDE(px_GIC_EXTI13 = px_GIC_default); LONG(px_GIC_EXTI13);
  156.         PROVIDE(px_GIC_DCMI = px_GIC_default); LONG(px_GIC_DCMI);
  157.         PROVIDE(px_GIC_CRYP1 = px_GIC_default); LONG(px_GIC_CRYP1);
  158.         PROVIDE(px_GIC_HASH1 = px_GIC_default); LONG(px_GIC_HASH1);
  159.         LONG(px_GIC_default);
  160.         PROVIDE(px_GIC_UART7 = px_GIC_default); LONG(px_GIC_UART7);
  161.         PROVIDE(px_GIC_UART8 = px_GIC_default); LONG(px_GIC_UART8);
  162.         PROVIDE(px_GIC_SPI4 = px_GIC_default); LONG(px_GIC_SPI4);
  163.         PROVIDE(px_GIC_SPI5 = px_GIC_default); LONG(px_GIC_SPI5);
  164.         PROVIDE(px_GIC_SPI6 = px_GIC_default); LONG(px_GIC_SPI6);
  165.         PROVIDE(px_GIC_SAI1 = px_GIC_default); LONG(px_GIC_SAI1);
  166.         PROVIDE(px_GIC_LTDC = px_GIC_default); LONG(px_GIC_LTDC);
  167.         PROVIDE(px_GIC_LTDC_ER = px_GIC_default); LONG(px_GIC_LTDC_ER);
  168.         PROVIDE(px_GIC_ADC2 = px_GIC_default); LONG(px_GIC_ADC2);
  169.         PROVIDE(px_GIC_SAI2 = px_GIC_default); LONG(px_GIC_SAI2);
  170.         PROVIDE(px_GIC_QUADSPI = px_GIC_default); LONG(px_GIC_QUADSPI);
  171.         PROVIDE(px_GIC_LPTIM1 = px_GIC_default); LONG(px_GIC_LPTIM1);
  172.         PROVIDE(px_GIC_CEC = px_GIC_default); LONG(px_GIC_CEC);
  173.         PROVIDE(px_GIC_I2C4_EVT = px_GIC_default); LONG(px_GIC_I2C4_EVT);
  174.         PROVIDE(px_GIC_I2C4_ERR = px_GIC_default); LONG(px_GIC_I2C4_ERR);
  175.         PROVIDE(px_GIC_SPDIFRX = px_GIC_default); LONG(px_GIC_SPDIFRX);
  176.         PROVIDE(px_GIC_OTG = px_GIC_default); LONG(px_GIC_OTG);
  177.         LONG(px_GIC_default);
  178.         PROVIDE(px_GIC_IPCC_RX0 = px_GIC_default); LONG(px_GIC_IPCC_RX0);
  179.         PROVIDE(px_GIC_IPCC_TX0 = px_GIC_default); LONG(px_GIC_IPCC_TX0);
  180.         PROVIDE(px_GIC_DMAMUX1_OVR_REQ = px_GIC_default); LONG(px_GIC_DMAMUX1_OVR_REQ);
  181.         PROVIDE(px_GIC_IPCC_RX1 = px_GIC_default); LONG(px_GIC_IPCC_RX1);
  182.         PROVIDE(px_GIC_IPCC_TX1 = px_GIC_default); LONG(px_GIC_IPCC_TX1);
  183.         PROVIDE(px_GIC_CRYP2 = px_GIC_default); LONG(px_GIC_CRYP2);
  184.         PROVIDE(px_GIC_HASH2 = px_GIC_default); LONG(px_GIC_HASH2);
  185.         PROVIDE(px_GIC_I2C5_EVT = px_GIC_default); LONG(px_GIC_I2C5_EVT);
  186.         PROVIDE(px_GIC_I2C5_ERR = px_GIC_default); LONG(px_GIC_I2C5_ERR);
  187.         PROVIDE(px_GIC_GPU_IT = px_GIC_default); LONG(px_GIC_GPU_IT);
  188.         PROVIDE(px_GIC_DFSDM1_FLT0 = px_GIC_default); LONG(px_GIC_DFSDM1_FLT0);
  189.         PROVIDE(px_GIC_DFSDM1_FLT1 = px_GIC_default); LONG(px_GIC_DFSDM1_FLT1);
  190.         PROVIDE(px_GIC_DFSDM1_FLT2 = px_GIC_default); LONG(px_GIC_DFSDM1_FLT2);
  191.         PROVIDE(px_GIC_DFSDM1_FLT3 = px_GIC_default); LONG(px_GIC_DFSDM1_FLT3);
  192.         PROVIDE(px_GIC_SAI3 = px_GIC_default); LONG(px_GIC_SAI3);
  193.         PROVIDE(px_GIC_DFSDM1_FLT4 = px_GIC_default); LONG(px_GIC_DFSDM1_FLT4);
  194.         PROVIDE(px_GIC_TIM15 = px_GIC_default); LONG(px_GIC_TIM15);
  195.         PROVIDE(px_GIC_TIM16 = px_GIC_default); LONG(px_GIC_TIM16);
  196.         PROVIDE(px_GIC_TIM17 = px_GIC_default); LONG(px_GIC_TIM17);
  197.         PROVIDE(px_GIC_TIM12 = px_GIC_default); LONG(px_GIC_TIM12);
  198.         PROVIDE(px_GIC_MDIOS = px_GIC_default); LONG(px_GIC_MDIOS);
  199.         PROVIDE(px_GIC_EXTI14 = px_GIC_default); LONG(px_GIC_EXTI14);
  200.         PROVIDE(px_GIC_MDMA = px_GIC_default); LONG(px_GIC_MDMA);
  201.         PROVIDE(px_GIC_DSI = px_GIC_default); LONG(px_GIC_DSI);
  202.         PROVIDE(px_GIC_SDMMC2 = px_GIC_default); LONG(px_GIC_SDMMC2);
  203.         PROVIDE(px_GIC_HSEM_IT1 = px_GIC_default); LONG(px_GIC_HSEM_IT1);
  204.         PROVIDE(px_GIC_DFSDM1_FLT5 = px_GIC_default); LONG(px_GIC_DFSDM1_FLT5);
  205.         PROVIDE(px_GIC_EXTI15 = px_GIC_default); LONG(px_GIC_EXTI15);
  206.         PROVIDE(px_GIC_MDMA_SEC_IT = px_GIC_default); LONG(px_GIC_MDMA_SEC_IT);
  207.         PROVIDE(px_GIC_SYSRESETQ = px_GIC_default); LONG(px_GIC_SYSRESETQ);
  208.         PROVIDE(px_GIC_TIM13 = px_GIC_default); LONG(px_GIC_TIM13);
  209.         PROVIDE(px_GIC_TIM14 = px_GIC_default); LONG(px_GIC_TIM14);
  210.         PROVIDE(px_GIC_DAC = px_GIC_default); LONG(px_GIC_DAC);
  211.         PROVIDE(px_GIC_RNG1 = px_GIC_default); LONG(px_GIC_RNG1);
  212.         PROVIDE(px_GIC_RNG2 = px_GIC_default); LONG(px_GIC_RNG2);
  213.         PROVIDE(px_GIC_I2C6_EVT = px_GIC_default); LONG(px_GIC_I2C6_EVT);
  214.         PROVIDE(px_GIC_I2C6_ERR = px_GIC_default); LONG(px_GIC_I2C6_ERR);
  215.         PROVIDE(px_GIC_SDMMC3 = px_GIC_default); LONG(px_GIC_SDMMC3);
  216.         PROVIDE(px_GIC_LPTIM2 = px_GIC_default); LONG(px_GIC_LPTIM2);
  217.         PROVIDE(px_GIC_LPTIM3 = px_GIC_default); LONG(px_GIC_LPTIM3);
  218.         PROVIDE(px_GIC_LPTIM4 = px_GIC_default); LONG(px_GIC_LPTIM4);
  219.         PROVIDE(px_GIC_LPTIM5 = px_GIC_default); LONG(px_GIC_LPTIM5);
  220.         PROVIDE(px_GIC_ETH1_LPI = px_GIC_default); LONG(px_GIC_ETH1_LPI);
  221.         PROVIDE(px_GIC_WWDG1_RST_IT = px_GIC_default); LONG(px_GIC_WWDG1_RST_IT);
  222.         PROVIDE(px_GIC_MCU_SEV = px_GIC_default); LONG(px_GIC_MCU_SEV);
  223.         PROVIDE(px_GIC_RCC_WAKEUP = px_GIC_default); LONG(px_GIC_RCC_WAKEUP);
  224.         PROVIDE(px_GIC_SAI4 = px_GIC_default); LONG(px_GIC_SAI4);
  225.         PROVIDE(px_GIC_DTS = px_GIC_default); LONG(px_GIC_DTS);
  226.         LONG(px_GIC_default);
  227.         PROVIDE(px_GIC_MPU_WAKEUP_PIN = px_GIC_default); LONG(px_GIC_MPU_WAKEUP_PIN);
  228.         PROVIDE(px_GIC_IWDG1_IT = px_GIC_default); LONG(px_GIC_IWDG1_IT);
  229.         PROVIDE(px_GIC_IWDG2_IT = px_GIC_default); LONG(px_GIC_IWDG2_IT);
  230.         LONG(px_GIC_default);
  231.         LONG(px_GIC_default);
  232.         LONG(px_GIC_default);
  233.         LONG(px_GIC_default);
  234.         LONG(px_GIC_default);
  235.         LONG(px_GIC_default);
  236.         LONG(px_GIC_default);
  237.         LONG(px_GIC_default);
  238.         LONG(px_GIC_default);
  239.         LONG(px_GIC_default);
  240.         LONG(px_GIC_default);
  241.         LONG(px_GIC_default);
  242.         LONG(px_GIC_default);
  243.         LONG(px_GIC_default);
  244.         LONG(px_GIC_default);
  245.         LONG(px_GIC_default);
  246.         LONG(px_GIC_default);
  247.         LONG(px_GIC_default);
  248.         LONG(px_GIC_default);
  249.         LONG(px_GIC_default);
  250.         LONG(px_GIC_default);
  251.         LONG(px_GIC_default);
  252.         LONG(px_GIC_default);
  253.         LONG(px_GIC_default);
  254.         LONG(px_GIC_default);
  255.         LONG(px_GIC_default);
  256.         LONG(px_GIC_default);
  257.         LONG(px_GIC_default);
  258.         LONG(px_GIC_default);
  259.         LONG(px_GIC_default);
  260.         LONG(px_GIC_default);
  261.         LONG(px_GIC_default);
  262.         LONG(px_GIC_default);
  263.         LONG(px_GIC_default);
  264.         LONG(px_GIC_default);
  265.         LONG(px_GIC_default);
  266.         LONG(px_GIC_default);
  267.         LONG(px_GIC_default);
  268.         LONG(px_GIC_default);
  269.         LONG(px_GIC_default);
  270.         LONG(px_GIC_default);
  271.         LONG(px_GIC_default);
  272.         LONG(px_GIC_default);
  273.         LONG(px_GIC_default);
  274.         LONG(px_GIC_default);
  275.         PROVIDE(px_GIC_TAMP_S = px_GIC_default); LONG(px_GIC_TAMP_S);
  276.         PROVIDE(px_GIC_RTC_WKUP_ALARM_S = px_GIC_default); LONG(px_GIC_RTC_WKUP_ALARM_S);
  277.         PROVIDE(px_GIC_RTC_TS_S = px_GIC_default); LONG(px_GIC_RTC_TS_S);
  278.         PROVIDE(px_GIC_PMUIRQ0 = px_GIC_default); LONG(px_GIC_PMUIRQ0);
  279.         PROVIDE(px_GIC_PMUIRQ1 = px_GIC_default); LONG(px_GIC_PMUIRQ1);
  280.         LONG(px_GIC_default);
  281.         LONG(px_GIC_default);
  282.         PROVIDE(px_GIC_COMMRX0 = px_GIC_default); LONG(px_GIC_COMMRX0);
  283.         PROVIDE(px_GIC_COMMRX1 = px_GIC_default); LONG(px_GIC_COMMRX1);
  284.         LONG(px_GIC_default);
  285.         LONG(px_GIC_default);
  286.         PROVIDE(px_GIC_COMMTX0 = px_GIC_default); LONG(px_GIC_COMMTX0);
  287.         PROVIDE(px_GIC_COMMTX1 = px_GIC_default); LONG(px_GIC_COMMTX1);
  288.         LONG(px_GIC_default);
  289.         LONG(px_GIC_default);
  290.         PROVIDE(px_GIC_AXIERRIRQ = px_GIC_default); LONG(px_GIC_AXIERRIRQ);
  291.         PROVIDE(px_GIC_DDRPERFM = px_GIC_default); LONG(px_GIC_DDRPERFM);
  292.         LONG(px_GIC_default);
  293.         LONG(px_GIC_default);
  294.         PROVIDE(px_GIC_nCTIIRQ0 = px_GIC_default); LONG(px_GIC_nCTIIRQ0);
  295.         PROVIDE(px_GIC_nCTIIRQ1 = px_GIC_default); LONG(px_GIC_nCTIIRQ1);
  296.         LONG(px_GIC_default);
  297.         LONG(px_GIC_default);
  298.         LONG(px_GIC_default);
  299.         LONG(px_GIC_default);
  300.         LONG(px_GIC_default);
  301.         LONG(px_GIC_default);
  302.         LONG(px_GIC_default);
  303.         LONG(px_GIC_default);
  304.         LONG(px_GIC_default);
  305.         LONG(px_GIC_default);
  306.         LONG(px_GIC_default);
  307.         LONG(px_GIC_default);
  308.         LONG(px_GIC_default);
  309.         LONG(px_GIC_default);
  310.         LONG(px_GIC_default);
  311.         LONG(px_GIC_default);
  312.         LONG(px_GIC_default);
  313.         LONG(px_GIC_default);
  314.         LONG(px_GIC_default);
  315.         LONG(px_GIC_default);
  316.         LONG(px_GIC_default);
  317.         LONG(px_GIC_default);
  318.         LONG(px_GIC_default);
  319.         LONG(px_GIC_default);
  320.         LONG(px_GIC_default);
  321.         LONG(px_GIC_default);
  322.         LONG(px_GIC_default);
  323.         LONG(px_GIC_default);
  324.         LONG(px_GIC_default);
  325.         LONG(px_GIC_default);
  326.         LONG(px_GIC_default);
  327.         LONG(px_GIC_default);
  328.         LONG(px_GIC_default);
  329.         LONG(px_GIC_default);
  330.         LONG(px_GIC_default);
  331.         LONG(px_GIC_default);
  332.         LONG(px_GIC_default);
  333.         LONG(px_GIC_default);
  334.     }
  335.     > _ram
  336.     /* rodata */
  337.     .rodata : { *(.rodata); } > _ram
  338.     /* bss */
  339.     .bss : { *(.bss); } > _ram
  340.     /* data */
  341.     .data : { *(.data); } > _ram
  342.     /*------- defines ------*/
  343.     /* stack 1k */
  344.     px_stack_svc = 0x30000000;
  345.     px_stack_irq = 0x2ffffc00;
  346.     px_stack_system = 0x2ffff800;
  347.     /* TODO */
  348. }
复制代码
中断向量表需要实现(用汇编),实现如下
  1. .section .text
  2. .global px_interrupt_reset

  3. .section .text.px_interrupt_table
  4. .global px_interrupt_table
  5. px_interrupt_table:
  6.     b px_interrupt_reset
  7.     b interrupt1
  8.     b interrupt2
  9.     b interrupt3
  10.     b interrupt4
  11.     b interrupt5
  12.     b interrupt6
  13.     b interrupt7

  14. .section .text
  15. interrupt1:
  16.     push {r0, r1, r2, r3, r12, lr}
  17.     pop {r0, r1, r2, r3, r12, lr}
  18.     b #-8
  19.     movs pc, lr

  20. .section .text
  21. interrupt2:
  22.     push {r0, r1, r2, r3, r12, lr}
  23.     pop {r0, r1, r2, r3, r12, lr}
  24.     b #-8
  25.     movs pc, lr

  26. .section .text
  27. interrupt3:
  28.     push {r0, r1, r2, r3, r12, lr}
  29.     pop {r0, r1, r2, r3, r12, lr}
  30.     b #-8
  31.     subs pc, lr, #4

  32. .section .text
  33. interrupt4:
  34.     push {r0, r1, r2, r3, r12, lr}
  35.     pop {r0, r1, r2, r3, r12, lr}
  36.     b #-8
  37.     subs pc, lr, #8

  38. .section .text
  39. interrupt5:
  40.     b #-8

  41. .section .text
  42. .global px_interrupt_GIC
  43. interrupt6:
  44.     push {r0, r1, r2, r3, r12, lr}
  45.     bl px_interrupt_GIC
  46.     pop {r0, r1, r2, r3, r12, lr}
  47.     subs pc, lr, #4

  48. .section .text
  49. interrupt7:
  50.     b #-8
  51.     subs pc, lr, #4
复制代码


这里interrupt6[IRQ]是我们这次实验的中断入口,其跳转进入px_interrupt_GIC,在如下代码中可以找到
  1. import px.base_object;
  2. import px.cpu.stm32mp157.GIC;

  3. using namespace px_namespace;
  4. using namespace px_namespace::cpu::stm32mp157;

  5. void initialize() noexcept;

  6. extern "C"
  7. {
  8.     extern unsigned_integer32 px_interrupt_table;
  9.     extern unsigned_integer32 px_stack_svc;
  10.     extern unsigned_integer32 px_stack_irq;
  11.     extern unsigned_integer32 px_stack_system;
  12.     extern GIC_handler px_GIC_table;

  13.     void px_interrupt_GIC() noexcept // TODO 这里并不正确, 只是当前的简单处理
  14.     {
  15.         auto iar(GICC::IAR());
  16.         if (iar.INTERRUPT_ID() == 1022) // 特殊处理,具体请看gic v2 的文档
  17.         {
  18.             auto aiar(GICC::AIAR());
  19.             (&px_GIC_table)[aiar.INTERRUPT_ID()](); // 根据id跳转进入处理函数
  20.             auto aeoir(GICC::AEOIR(aiar));
  21.             aeoir.push();
  22.         }
  23.         else
  24.         {
  25.             (&px_GIC_table)[iar.INTERRUPT_ID()]();
  26.             auto eoir(GICC::EOIR(iar));
  27.             eoir.push();
  28.         }
  29.     }

  30. #define __set_mode_sp(_mode, _address) \
  31.     asm \
  32.     ( \
  33.         "msr cpsr_c, %[mode];" \
  34.         "mov sp, %[address];" \
  35.         : \
  36.         : [mode]"i"(_mode), [address]"r"(_address) \
  37.         : \
  38.     )
  39.     [[noreturn]] void px_interrupt_reset()
  40.     {
  41.         __set_mode_sp(210, &px_stack_irq);
  42.         __set_mode_sp(211, &px_stack_svc);
  43.         asm
  44.         (
  45.             "mcr p15, 0, %[px_interrupt_table], c12, c0, 0;"
  46.             :
  47.             : [px_interrupt_table]"r"(&px_interrupt_table)
  48.             :
  49.         );
  50.         auto gicc_ctlr(GICC::CTLR());
  51.         gicc_ctlr.ENABLEGRP0() = 1;
  52.         gicc_ctlr.ENABLEGRP1() = 1;
  53.         gicc_ctlr.ACKCTL() = 0;
  54.         gicc_ctlr.FIQEN() = 0;
  55.         gicc_ctlr.CBPR() = 0;
  56.         gicc_ctlr.FIQBYPDISGRP0() = 0;
  57.         gicc_ctlr.IRQBYPDISGRP0() = 0;
  58.         gicc_ctlr.FIQBYPDISGRP1() = 0;
  59.         gicc_ctlr.IRQBYPDISGRP1() = 0;
  60.         gicc_ctlr.EOIMODES() = 0;
  61.         gicc_ctlr.EOIMODENS() = 0;
  62.         gicc_ctlr.push();
  63.         auto gicc_pmr(GICC::PMR());
  64.         gicc_pmr.PRIORITY() = 0x1f;
  65.         gicc_pmr.push();
  66.         auto gicc_bpr(GICC::BPR());
  67.         gicc_bpr.BINARY_POINT() = 2;
  68.         gicc_bpr.push();
  69.         auto gicd_ctlr(GICD::CTLR());
  70.         gicd_ctlr.ENABLEGRP0() = 1;
  71.         gicd_ctlr.ENABLEGRP1() = 1;
  72.         gicd_ctlr.push();
  73.         __set_mode_sp(31, &px_stack_system);
  74.         initialize();
  75.         while (true) {}
  76.     }
  77. #undef __set_mode_sp

  78. }
复制代码



回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
 楼主| 发表于 2020-12-5 12:58:07 | 显示全部楼层
本帖最后由 sppz 于 2020-12-5 15:57 编辑

具体行为直接上代码
  1. import px.base_object;
  2. import px.cpu.stm32mp157.RCC;
  3. import px.cpu.stm32mp157.GPIO;
  4. import px.cpu.stm32mp157.USART;
  5. import px.cpu.stm32mp157.GIC;

  6. using namespace px_namespace;
  7. using namespace px_namespace::cpu::stm32mp157;

  8. static void reset_clock() noexcept
  9. {
  10.     // clock use HSI
  11.     {
  12.         auto ocensetr(RCC::OCENSETR());
  13.         ocensetr.HSION() = 1;
  14.         ocensetr.push();
  15.         for (auto ocrdyr(RCC::OCRDYR()); ocrdyr.HSIRDY() == 0; ocrdyr.pull()) {}
  16.         auto hsicfgr(RCC::HSICFGR());
  17.         hsicfgr.HSIDIV() = 0;
  18.         hsicfgr.push();
  19.         for (auto ocrdyr(RCC::OCRDYR()); ocrdyr.HSIDIVRDY() == 0; ocrdyr.pull()) {}
  20.         auto mpckselr(RCC::MPCKSELR());
  21.         mpckselr.MPUSRC() = 0;
  22.         mpckselr.push();
  23.         do { mpckselr.pull(); } while (mpckselr.MPUSRCRDY() == 0);
  24.         auto axidivr(RCC::AXIDIVR());
  25.         axidivr.AXIDIV() = 0;
  26.         axidivr.push();
  27.         do { axidivr.pull(); } while (axidivr.AXIDIVRDY() == 0);
  28.         auto assckselr(RCC::ASSCKSELR());
  29.         assckselr.AXISSRC() = 0;
  30.         assckselr.push();
  31.         do { assckselr.pull(); } while (assckselr.AXISSRCRDY() == 0);
  32.         auto mcudivr(RCC::MCUDIVR());
  33.         mcudivr.MCUDIV() = 0;
  34.         mcudivr.push();
  35.         do { mcudivr.pull(); } while (mcudivr.MCUDIVRDY() == 0);
  36.         auto mssckselr(RCC::MSSCKSELR());
  37.         mssckselr.MCUSSRC() = 0;
  38.         mssckselr.push();
  39.         do { mssckselr.pull(); } while (mssckselr.MCUSSRCRDY() == 0);
  40.     }
  41.     // close PLLs
  42.     {
  43.         auto pll1cr(RCC::PLL1CR());
  44.         pll1cr.DIVPEN() = 0;
  45.         pll1cr.DIVQEN() = 0;
  46.         pll1cr.DIVREN() = 0;
  47.         pll1cr.push();
  48.         pll1cr.PLLON() = 0;
  49.         pll1cr.push();
  50.         do { pll1cr.pull(); } while (pll1cr.PLL1RDY() == 1);
  51.         auto pll2cr(RCC::PLL2CR());
  52.         pll2cr.DIVPEN() = 0;
  53.         pll2cr.DIVQEN() = 0;
  54.         pll2cr.DIVREN() = 0;
  55.         pll2cr.push();
  56.         pll2cr.PLLON() = 0;
  57.         pll2cr.push();
  58.         do { pll2cr.pull(); } while (pll2cr.PLL2RDY() == 1);
  59.         auto pll3cr(RCC::PLL3CR());
  60.         pll3cr.DIVPEN() = 0;
  61.         pll3cr.DIVQEN() = 0;
  62.         pll3cr.DIVREN() = 0;
  63.         pll3cr.push();
  64.         pll3cr.PLLON() = 0;
  65.         pll3cr.push();
  66.         do { pll3cr.pull(); } while (pll3cr.PLL3RDY() == 1);
  67.         auto pll4cr(RCC::PLL4CR());
  68.         pll4cr.DIVPEN() = 0;
  69.         pll4cr.DIVQEN() = 0;
  70.         pll4cr.DIVREN() = 0;
  71.         pll4cr.push();
  72.         pll4cr.PLLON() = 0;
  73.         pll4cr.push();
  74.         do { pll4cr.pull(); } while (pll4cr.PLL4RDY() == 1);
  75.     }
  76. }

  77. // MPU 600Mhz, AXI 264Mhz, MCU 200Mhz
  78. static void set_clock() noexcept
  79. {
  80.     // open HSE
  81.     {
  82.         auto ocensetr(RCC::OCENSETR());
  83.         ocensetr.HSEON();
  84.         ocensetr.push();
  85.         for (auto ocrdyr(RCC::OCRDYR()); ocrdyr.HSERDY() == 0; ocrdyr.pull()) {}
  86.     }
  87.     // PLLs source select
  88.     {
  89.         auto rck12selr(RCC::RCK12SELR());
  90.         rck12selr.PLL12SRC() = 1;
  91.         rck12selr.push();
  92.         do { rck12selr.pull(); } while (rck12selr.PLL12SRCRDY() == 0);
  93.         auto rck3selr(RCC::RCK3SELR());
  94.         rck3selr.PLL3SRC() = 1;
  95.         rck3selr.push();
  96.         do { rck3selr.pull(); } while (rck3selr.PLL3SRCRDY() == 0);
  97.     }
  98.     // PLL1 set
  99.     {
  100.         auto pll1cfgr1(RCC::PLL1CFGR1());
  101.         pll1cfgr1.DIVN() = 49;
  102.         pll1cfgr1.DIVM1() = 1;
  103.         pll1cfgr1.push();
  104.         auto pll1cfgr2(RCC::PLL1CFGR2());
  105.         pll1cfgr2.DIVP() = 0;
  106.         pll1cfgr2.push();
  107.         auto pll1fracr(RCC::PLL1FRACR());
  108.         pll1fracr.FRACV() = 0;
  109.         pll1fracr.FRACLE() = 0;
  110.         pll1fracr.push();
  111.         pll1fracr.FRACLE() = 1;
  112.         pll1fracr.push();
  113.         auto pll1cr(RCC::PLL1CR());
  114.         pll1cr.SSCG_CTRL() = 0;
  115.         pll1cr.PLLON() = 1;
  116.         pll1cr.push();
  117.         do { pll1cr.pull(); } while (pll1cr.PLL1RDY() == 0);
  118.         pll1cr.DIVPEN() = 1;
  119.         pll1cr.push();
  120.     }
  121.     // PLL2 set
  122.     {
  123.         auto pll2cfgr1(RCC::PLL2CFGR1());
  124.         pll2cfgr1.DIVN() = 43;
  125.         pll2cfgr1.DIVM2() = 1;
  126.         pll2cfgr1.push();
  127.         auto pll2cfgr2(RCC::PLL2CFGR2());
  128.         pll2cfgr2.DIVP() = 1;
  129.         pll2cfgr2.push();
  130.         auto pll2fracr(RCC::PLL2FRACR());
  131.         pll2fracr.FRACV() = 0;
  132.         pll2fracr.FRACLE() = 0;
  133.         pll2fracr.push();
  134.         pll2fracr.FRACLE() = 1;
  135.         pll2fracr.push();
  136.         auto pll2csgr(RCC::PLL2CSGR());
  137.         pll2csgr.MOD_PER() = 0;
  138.         pll2csgr.SSCG_MODE() = 1;
  139.         pll2csgr.INC_STEP() = 0;
  140.         pll2csgr.push();
  141.         auto pll2cr(RCC::PLL2CR());
  142.         pll2cr.SSCG_CTRL() = 1;
  143.         pll2cr.PLLON() = 1;
  144.         pll2cr.push();
  145.         do { pll2cr.pull(); } while (pll2cr.PLL2RDY() == 0);
  146.         pll2cr.DIVPEN() = 1;
  147.         pll2cr.push();
  148.     }
  149.     // PLL3 set
  150.     {
  151.         auto pll3cfgr1(RCC::PLL3CFGR1());
  152.         pll3cfgr1.DIVN() = 49;
  153.         pll3cfgr1.DIVM3() = 2;
  154.         pll3cfgr1.IFRGE() = 1;
  155.         pll3cfgr1.push();
  156.         auto pll3cfgr2(RCC::PLL3CFGR2());
  157.         pll3cfgr2.DIVP() = 1;
  158.         pll3cfgr2.push();
  159.         auto pll3fracr(RCC::PLL3FRACR());
  160.         pll3fracr.FRACV() = 0;
  161.         pll3fracr.FRACLE() = 0;
  162.         pll3fracr.push();
  163.         pll3fracr.FRACLE() = 1;
  164.         pll3fracr.push();
  165.         auto pll3cr(RCC::PLL3CR());
  166.         pll3cr.PLLON() = 1;
  167.         pll3cr.push();
  168.         do { pll3cr.pull(); } while (pll3cr.PLL3RDY() == 0);
  169.         pll3cr.DIVPEN() = 1;
  170.         pll3cr.push();
  171.     }
  172.     // MCU set
  173.     {
  174.         auto mcudivr(RCC::MCUDIVR());
  175.         mcudivr.MCUDIV() = 0;
  176.         mcudivr.push();
  177.         do { mcudivr.pull(); } while (mcudivr.MCUDIVRDY() == 0);
  178.     }
  179.     // AXI set
  180.     {
  181.         auto axidivr(RCC::AXIDIVR());
  182.         axidivr.AXIDIV() = 0;
  183.         axidivr.push();
  184.         do { axidivr.pull(); } while (axidivr.AXIDIVRDY() == 0);
  185.     }
  186.     // APB4 set
  187.     {
  188.         auto apb4divr(RCC::APB4DIVR());
  189.         apb4divr.APB4DIV() = 1;
  190.         apb4divr.push();
  191.         do { apb4divr.pull(); } while (apb4divr.APB4DIVRDY() == 0);
  192.     }
  193.     // APB5
  194.     {
  195.         auto apb5divr(RCC::APB5DIVR());
  196.         apb5divr.APB5DIV() = 2;
  197.         apb5divr.push();
  198.         do { apb5divr.pull(); } while (apb5divr.APB5DIVRDY() == 0);
  199.     }
  200.     // APB1
  201.     {
  202.         auto apb1divr(RCC::APB1DIVR());
  203.         apb1divr.APB1DIV() = 1;
  204.         apb1divr.push();
  205.         do { apb1divr.pull(); } while (apb1divr.APB1DIVRDY() == 0);
  206.     }
  207.     // APB2
  208.     {
  209.         auto apb2divr(RCC::APB2DIVR());
  210.         apb2divr.APB2DIV() = 1;
  211.         apb2divr.push();
  212.         do { apb2divr.pull(); } while (apb2divr.APB2DIVRDY() == 0);
  213.     }
  214.     // APB3
  215.     {
  216.         auto apb3divr(RCC::APB3DIVR());
  217.         apb3divr.APB3DIV() = 1;
  218.         apb3divr.push();
  219.         do { apb3divr.pull(); } while (apb3divr.APB3DIVRDY() == 0);
  220.     }
  221.     // switch
  222.     {
  223.         auto mpckselr(RCC::MPCKSELR());
  224.         mpckselr.MPUSRC() = 2;
  225.         mpckselr.push();
  226.         do { mpckselr.pull(); } while (mpckselr.MPUSRCRDY() == 0);
  227.         auto assckselr(RCC::ASSCKSELR());
  228.         assckselr.AXISSRC() = 2;
  229.         assckselr.push();
  230.         do { assckselr.pull(); } while (assckselr.AXISSRCRDY() == 0);
  231.         auto mssckselr(RCC::MSSCKSELR());
  232.         mssckselr.MCUSSRC() = 3;
  233.         mssckselr.push();
  234.         do { mssckselr.pull(); } while (mssckselr.MCUSSRCRDY() == 0);
  235.     }
  236. }

  237. static void initialize_clock() noexcept
  238. {
  239.     reset_clock();
  240.     set_clock();
  241. }

  242. void initialize_gic() noexcept
  243. {
  244.     //84 uart4
  245.     auto igroupr(GICD::IGROUPR(84));
  246.     igroupr.GROUP_STATUS() = 1;
  247.     igroupr.push();
  248.     auto isenabler(GICD::ISENABLER(84));
  249.     isenabler.SET_ENABLE() = 1;
  250.     isenabler.push();
  251.     auto ipriorityr(GICD::IPRIORITYR(84));
  252.     ipriorityr.PRIORITY() = 0;
  253.     ipriorityr.push();
  254.     auto itargetsr(GICD::ITARGETSR(84));
  255.     itargetsr.CPU_TARGETS() = 1;
  256.     itargetsr.push();
  257.     auto icfgr(GICD::ICFGR(84));
  258.     icfgr.INT_CONFIG() = 1;
  259.     icfgr.push();
  260. }

  261. static void initialize_gpio() noexcept
  262. {
  263.     // open GPIO[B, F, G, I]
  264.     {
  265.         auto mp_ahb4ensetr(RCC::MP_AHB4ENSETR());
  266.         mp_ahb4ensetr.GPIOBEN() = 1;
  267.         mp_ahb4ensetr.GPIOFEN() = 1;
  268.         mp_ahb4ensetr.GPIOGEN() = 1;
  269.         mp_ahb4ensetr.GPIOIEN() = 1;
  270.         mp_ahb4ensetr.push();
  271.     }
  272.     { // B.2 UART4_RX
  273.         auto moder(GPIOB::MODER());
  274.         moder.MODE2() = 2;
  275.         moder.push();
  276.         auto otyper(GPIOB::OTYPER());
  277.         otyper.OT2() = 0;
  278.         otyper.push();
  279.         auto ospeedr(GPIOB::OSPEEDR());
  280.         ospeedr.OS2() = 3;
  281.         ospeedr.push();
  282.         auto pupdr(GPIOB::PUPDR());
  283.         pupdr.PUPD2() = 1;
  284.         pupdr.push();
  285.         auto afrl(GPIOB::AFRL());
  286.         afrl.AF2() = 8;
  287.         afrl.push();
  288.     }
  289.     { // F.3 led
  290.         auto moder(GPIOF::MODER());
  291.         moder.MODE3() = 1;
  292.         moder.push();
  293.         auto otyper(GPIOF::OTYPER());
  294.         otyper.OT3() = 0;
  295.         otyper.push();
  296.         auto ospeedr(GPIOF::OSPEEDR());
  297.         ospeedr.OS3() = 0;
  298.         ospeedr.push();
  299.         auto pupdr(GPIOF::PUPDR());
  300.         pupdr.PUPD3() = 1;
  301.         pupdr.push();
  302.         auto odr(GPIOF::ODR());
  303.         odr.OD3() = 1;
  304.         odr.push();
  305.     }
  306.     { // G.11 UART4_TX
  307.         auto moder(GPIOG::MODER());
  308.         moder.MODE11() = 2;
  309.         moder.push();
  310.         auto otyper(GPIOG::OTYPER());
  311.         otyper.OT11() = 0;
  312.         otyper.push();
  313.         auto ospeedr(GPIOG::OSPEEDR());
  314.         ospeedr.OS11() = 3;
  315.         ospeedr.push();
  316.         auto pupdr(GPIOG::PUPDR());
  317.         pupdr.PUPD11() = 1;
  318.         pupdr.push();
  319.         auto afrh(GPIOG::AFRH());
  320.         afrh.AF11() = 6;
  321.         afrh.push();
  322.     }
  323.     { // I.0 led
  324.         auto moder(GPIOI::MODER());
  325.         moder.MODE0() = 1;
  326.         moder.push();
  327.         auto otyper(GPIOI::OTYPER());
  328.         otyper.OT0() = 0;
  329.         otyper.push();
  330.         auto ospeedr(GPIOI::OSPEEDR());
  331.         ospeedr.OS0() = 0;
  332.         ospeedr.push();
  333.         auto pupdr(GPIOI::PUPDR());
  334.         pupdr.PUPD0() = 1;
  335.         pupdr.push();
  336.         auto odr(GPIOI::ODR());
  337.         odr.OD0() = 0;
  338.         odr.push();
  339.     }
  340. }

  341. static void initialize_uart4() noexcept
  342. {
  343.     auto apb1rstsetr(RCC::APB1RSTSETR());
  344.     apb1rstsetr.UART4RST() = 1;
  345.     apb1rstsetr.push();
  346.     auto apb1rstclrr(RCC::APB1RSTCLRR());
  347.     while (apb1rstclrr.UART4RST() == 0) { apb1rstclrr.pull(); }
  348.     apb1rstclrr.UART4RST() = 1;
  349.     apb1rstclrr.push();
  350.     do { apb1rstclrr.pull(); } while (apb1rstclrr.UART4RST() == 1);
  351.     auto uart24ckselr(RCC::UART24CKSELR());
  352.     uart24ckselr.UART24SRC() = 0;
  353.     uart24ckselr.push();
  354.     auto mp_apb1ensetr(RCC::MP_APB1ENSETR());
  355.     mp_apb1ensetr.UART4EN() = 1;
  356.     mp_apb1ensetr.push();
  357.     auto presc(UART4::PRESC());
  358.     presc.PRESCALER() = 0;
  359.     presc.push();
  360.     auto brr(UART4::BRR());
  361.     brr.BR() = 100000000 / 115200;
  362.     brr.push();
  363.     auto cr1(UART4::CR1());
  364.     cr1.UE() = 1;
  365.     cr1.RE() = 1;
  366.     cr1.TE() = 1;
  367.     cr1.RXNEIE() = 1;
  368.     cr1.M0() = 0;
  369.     cr1.OVER8() = 0;
  370.     cr1.M1() = 0;
  371.     cr1.push();
  372. }

  373. void put_character(const character_type value) noexcept
  374. {
  375.     for (auto isr(UART4::ISR()); isr.TXE() == 0; isr.pull()) {}
  376.     auto tdr(UART4::TDR(0));
  377.     tdr.TD() = value;
  378.     tdr.push();
  379. }

  380. void put_string(const character_type* value) noexcept
  381. {
  382.     while (*value != '\0')
  383.     {
  384.         put_character(*value);
  385.         ++value;
  386.     }
  387. }

  388. void put_size(const size& value) noexcept
  389. {
  390.     if (value < 10)
  391.     {
  392.         put_character('0' + value.value());
  393.         return;
  394.     }
  395.     put_size(value / 10);
  396.     put_character('0' + (value % 10).value());
  397. }

  398. static void delay(size i) noexcept
  399. {
  400.     i *= 1000 * 128;
  401.     while (i > 0)
  402.     {
  403.         asm volatile
  404.         (// 256
  405.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  406.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  407.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  408.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  409.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  410.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  411.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  412.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  413.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  414.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  415.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  416.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  417.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  418.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  419.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  420.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  421.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  422.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  423.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  424.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  425.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  426.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  427.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  428.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  429.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  430.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  431.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  432.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  433.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  434.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  435.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  436.             "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;" "sub %[i], #1;"
  437.             : [i]"+r"(i)
  438.             :
  439.             :
  440.         );
  441.     }
  442. }

  443. void initialize() noexcept
  444. {
  445.     initialize_clock();
  446.     initialize_gic();
  447.     initialize_gpio();
  448.     initialize_uart4();
  449.     put_string("boot.\r\n");
  450.     while (yes)
  451.     {
  452.         delay(600);
  453.         put_string("switch.\r\n");
  454.         {
  455.             auto odr(GPIOF::ODR());
  456.             odr.OD3() ^= 1;
  457.             odr.push();
  458.         }
  459.     }
  460. }

  461. extern "C"
  462. {
  463.     void px_GIC_UART4() noexcept // 最简单的处理
  464.     {
  465.         auto isr(UART4::ISR());
  466.         if (isr.RXNE() == 1)
  467.         {
  468.             put_character((character_type)UART4::RDR().RD());
  469.         }
  470.     }

  471.     void px_GIC_default() noexcept
  472.     {
  473.         put_string("GIC_default\r\n");
  474.     }
  475. }
复制代码

这里和上一篇的变化主要是
1.增加了初始化GIC的代码
2.增加了px_GIC_default, px_GIC_UART4两个中断处理函数



回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
 楼主| 发表于 2020-12-5 13:00:07 | 显示全部楼层
本帖最后由 sppz 于 2020-12-5 16:07 编辑

贴了一大堆东西,非常乱(其实很简单)这里总结下
1.这次在连接脚本文件中增加了中断表和GIC表
2.用汇编写了中断入口函数
3.c++(interrupt.cpp),添加了初始化栈,开启了中断,添加了GIC的分发函数px_interrupt_GIC
4.c++(main.cpp),添加了GIC初始化函数,添加了GIC默认处理函数,添加了GIC_UART4的处理函数

相应文件在source/cpu/stm32mp157/a7, source/board/alientek/stm32mp157/a7目录下找到
但由于在学习中,东西一直在变
有兴趣的同学可以关注下这里

回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
 楼主| 发表于 2020-12-5 13:00:43 | 显示全部楼层
本帖最后由 sppz 于 2020-12-5 16:17 编辑

实际效果如下
a.png
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
 楼主| 发表于 2020-12-5 13:01:08 | 显示全部楼层
本帖最后由 sppz 于 2020-12-5 16:12 编辑

便民措施,下载后usb启动可看到效果 px.zip (2.06 KB, 下载次数: 2)
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
 楼主| 发表于 2020-12-5 16:13:54 | 显示全部楼层
下篇预定,简单定时器应用
回复 支持 反对

使用道具 举报

6

主题

200

帖子

0

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
1063
金钱
1063
注册时间
2019-9-19
在线时间
194 小时
发表于 2020-12-5 16:54:37 | 显示全部楼层
小板凳已坐下
=======================
出征,嗒嗒嗒——
快点上车!
=======================
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
 楼主| 发表于 2020-12-5 17:02:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

10

主题

213

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5607
金钱
5607
注册时间
2016-12-19
在线时间
724 小时
发表于 2021-9-29 08:38:29 | 显示全部楼层
c++有import关键字吗??import不是Java用的吗
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2022-8-8
在线时间
0 小时
发表于 2022-8-8 01:10:48 | 显示全部楼层
sppz 发表于 2020-12-5 13:00
贴了一大堆东西,非常乱(其实很简单)这里总结下
1.这次在连接脚本文件中增加了中断表和GIC表
2.用汇编写了 ...

gitee的链接失效了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 13:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表