OpenEdv-开源电子网

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

stm32mp157无系统裸机之EXTI(WK_UP, KEY0, KEY1)按键

[复制链接]

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
发表于 2020-12-11 17:52:01 | 显示全部楼层 |阅读模式
本帖最后由 sppz 于 2020-12-11 19:18 编辑

1.stm32mp157裸机启动过程探寻
2.stm32mp157无系统裸机之中断(GIC)初窥门径
3.stm32mp157无系统裸机之定时器(TIM6)简单使用

本篇为原子stm32mp157无系统裸机,个人框架(c++)下的第四篇[记录,总结,资料汇总].
本篇为EXTI实验.实现了WK_UP,KEY0,KEY1的EXTI中断.

--------分割线,以下为资料地址--------
stm32mp157参考手册
原子157硬件参考手册
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

便民措施,usb启动即可 px.zip (2.56 KB, 下载次数: 1)
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

根据157硬件手册,三个按钮连接的引脚为PA.0, PG.3, PH.7GPIO配置更新如下
  1. static void initialize_gpio() noexcept
  2. {
  3.     // open GPIO[A, B, F, G, H, I]
  4.     {
  5.         auto mp_ahb4ensetr(RCC::MP_AHB4ENSETR());
  6.         mp_ahb4ensetr.GPIOAEN() = 1;
  7.         mp_ahb4ensetr.GPIOBEN() = 1;
  8.         mp_ahb4ensetr.GPIOFEN() = 1;
  9.         mp_ahb4ensetr.GPIOGEN() = 1;
  10.         mp_ahb4ensetr.GPIOHEN() = 1;
  11.         mp_ahb4ensetr.GPIOIEN() = 1;
  12.         mp_ahb4ensetr.push();
  13.     }
  14.     { // A.0 WK_UP
  15.         auto moder(GPIOA::MODER(0)); moder.MODE() = 0;
  16.         moder.push();
  17.         auto otyper(GPIOA::OTYPER(0)); otyper.OT() = 0;
  18.         otyper.push();
  19.         auto ospeedr(GPIOA::OSPEEDR(0)); ospeedr.OS() = 0;
  20.         ospeedr.push();
  21.         auto pupdr(GPIOA::PUPDR(0)); pupdr.PUPD() = 2;
  22.         pupdr.push();
  23.         auto afr(GPIOA::AFR(0)); afr.AF() = 0;
  24.         afr.push();
  25.     }
  26.     { // B.2 UART4_RX
  27.         auto moder(GPIOB::MODER(2)); moder.MODE() = 2;
  28.         moder.push();
  29.         auto otyper(GPIOB::OTYPER(2)); otyper.OT() = 0;
  30.         otyper.push();
  31.         auto ospeedr(GPIOB::OSPEEDR(2)); ospeedr.OS() = 3;
  32.         ospeedr.push();
  33.         auto pupdr(GPIOB::PUPDR(2)); pupdr.PUPD() = 1;
  34.         pupdr.push();
  35.         auto afr(GPIOB::AFR(2)); afr.AF() = 8;
  36.         afr.push();
  37.     }
  38.     { // F.3 led
  39.         auto moder(GPIOF::MODER(3)); moder.MODE() = 1;
  40.         moder.push();
  41.         auto otyper(GPIOF::OTYPER(3)); otyper.OT() = 0;
  42.         otyper.push();
  43.         auto ospeedr(GPIOF::OSPEEDR(3)); ospeedr.OS() = 0;
  44.         ospeedr.push();
  45.         auto pupdr(GPIOF::PUPDR(3)); pupdr.PUPD() = 1;
  46.         pupdr.push();
  47.         auto odr(GPIOF::ODR(3)); odr.OD() = 1;
  48.         odr.push();
  49.     }
  50.     { // G.3 KEY0, G.11 UART4_TX
  51.         auto moder(GPIOG::MODER(3)); moder.MODE() = 0;
  52.         moder.index(11); moder.MODE() = 2;
  53.         moder.push();
  54.         auto otyper(GPIOG::OTYPER(3)); otyper.OT() = 0;
  55.         otyper.index(11); otyper.OT() = 0;
  56.         otyper.push();
  57.         auto ospeedr(GPIOG::OSPEEDR(3)); ospeedr.OS() = 0;
  58.         ospeedr.index(11); ospeedr.OS() = 3;
  59.         ospeedr.push();
  60.         auto pupdr(GPIOG::PUPDR(3)); pupdr.PUPD() = 1;
  61.         pupdr.index(11); pupdr.PUPD() = 1;
  62.         pupdr.push();
  63.         auto afr(GPIOG::AFR(3)); afr.AF() = 0;
  64.         afr.index(11); afr.AF() = 6;
  65.         afr.push();
  66.     }
  67.     { // H.7 KEY1
  68.         auto moder(GPIOH::MODER(7)); moder.MODE() = 0;
  69.         moder.push();
  70.         auto otyper(GPIOH::OTYPER(7)); otyper.OT() = 0;
  71.         otyper.push();
  72.         auto ospeedr(GPIOH::OSPEEDR(7)); ospeedr.OS() = 0;
  73.         ospeedr.push();
  74.         auto pupdr(GPIOH::PUPDR(7)); pupdr.PUPD() = 1;
  75.         pupdr.push();
  76.         auto afr(GPIOH::AFR(7)); afr.AF() = 0;
  77.         afr.push();
  78.     }
  79.     { // I.0 led
  80.         auto moder(GPIOI::MODER(0)); moder.MODE() = 1;
  81.         moder.push();
  82.         auto otyper(GPIOI::OTYPER(0)); otyper.OT() = 0;
  83.         otyper.push();
  84.         auto ospeedr(GPIOI::OSPEEDR(0)); ospeedr.OS() = 0;
  85.         ospeedr.push();
  86.         auto pupdr(GPIOI::PUPDR(0)); pupdr.PUPD() = 1;
  87.         pupdr.push();
  88.         auto odr(GPIOI::ODR(0)); odr.OD() = 0;
  89.         odr.push();
  90.     }
  91. }
复制代码
根据参考手册EXTI0, EXTI3, EXTI7,GIC号依次为38, 41, 97,更新配置如下
  1. static void initialize_gic() noexcept
  2. {
  3.     //38 EXTI0, 41 EXTI3, 84 uart4, 86 tim6, 97 EXTI7
  4.     auto igroupr(GICD::IGROUPR(38)); igroupr.GROUP_STATUS() = 1;
  5.     igroupr.index(41); igroupr.GROUP_STATUS() = 1;
  6.     igroupr.index(84); igroupr.GROUP_STATUS() = 1;
  7.     igroupr.index(86); igroupr.GROUP_STATUS() = 1;
  8.     igroupr.index(97); igroupr.GROUP_STATUS() = 1;
  9.     igroupr.push();
  10.     auto isenabler(GICD::ISENABLER(38)); isenabler.SET_ENABLE() = 1;
  11.     isenabler.index(41); isenabler.SET_ENABLE() = 1;
  12.     isenabler.index(84); isenabler.SET_ENABLE() = 1;
  13.     isenabler.index(86); isenabler.SET_ENABLE() = 1;
  14.     isenabler.index(97); isenabler.SET_ENABLE() = 1;
  15.     isenabler.push();
  16.     auto ipriorityr(GICD::IPRIORITYR(38)); ipriorityr.PRIORITY() = 0;
  17.     ipriorityr.index(41); ipriorityr.PRIORITY() = 0;
  18.     ipriorityr.index(84); ipriorityr.PRIORITY() = 0;
  19.     ipriorityr.index(86); ipriorityr.PRIORITY() = 0;
  20.     ipriorityr.index(97); ipriorityr.PRIORITY() = 0;
  21.     ipriorityr.push();
  22.     auto itargetsr(GICD::ITARGETSR(38)); itargetsr.CPU_TARGETS() = 1;
  23.     itargetsr.index(41); itargetsr.CPU_TARGETS() = 1;
  24.     itargetsr.index(84); itargetsr.CPU_TARGETS() = 1;
  25.     itargetsr.index(86); itargetsr.CPU_TARGETS() = 1;
  26.     itargetsr.index(97); itargetsr.CPU_TARGETS() = 1;
  27.     itargetsr.push();
  28.     auto icfgr(GICD::ICFGR(38)); icfgr.INT_CONFIG() = 3;
  29.     icfgr.index(41); icfgr.INT_CONFIG() = 3;
  30.     icfgr.index(84); icfgr.INT_CONFIG() = 1;
  31.     icfgr.index(86); icfgr.INT_CONFIG() = 1;
  32.     icfgr.index(97); icfgr.INT_CONFIG() = 3;
  33.     icfgr.push();
  34. }
复制代码
然后是EXTI配置
  1. void initialize_exti() noexcept
  2. {
  3.     // PA.0 WK_UP, PG.3 KEY0, PH.7 KEY1
  4.     auto rtsr(EXTI::RTSR(0)); rtsr.RT() = 1;
  5.     rtsr.index(3); rtsr.RT() = 1;
  6.     rtsr.index(7); rtsr.RT() = 1;
  7.     rtsr.push();
  8.     auto ftsr(EXTI::FTSR(0)); ftsr.FT() = 1;
  9.     ftsr.index(3); ftsr.FT() = 1;
  10.     ftsr.index(7); ftsr.FT() = 1;
  11.     ftsr.push();
  12.     auto exticr(EXTI::EXTICR(0)); exticr.EXTI() = 0;
  13.     exticr.index(3); exticr.EXTI() = 6;
  14.     exticr.index(7); exticr.EXTI() = 7;
  15.     exticr.push();
  16.     auto imr(EXTI::IMR(0)); imr.IM() = 1;
  17.     imr.index(3); imr.IM() = 1;
  18.     imr.index(7); imr.IM() = 1;
  19.     imr.push();
  20.     auto emr(EXTI::EMR(0)); emr.EM() = 1;
  21.     emr.index(3); emr.EM() = 1;
  22.     emr.index(7); emr.EM() = 1;
  23.     emr.push();
  24. }
复制代码
然后是三个EXTI中断的回调, 同时更新了下TIM6的回调,显示了三个引脚的状态和毫秒数,如下
  1. size systick_count(0);
  2. void px_GIC_TIM6() noexcept //
  3. {
  4.     auto sr(TIM6::SR());
  5.     sr.UIF() = 0;
  6.     sr.push();
  7.     ++systick_count;
  8.     if (systick_count % 1000 == 0)
  9.     {
  10.         put_string("millisecond=");
  11.         put_size(systick_count);
  12.         {
  13.             auto odr(GPIOF::ODR(3)); odr.OD() ^= 1;
  14.             odr.push();
  15.         }
  16.         auto aidr(GPIOA::IDR(0));
  17.         auto gidr(GPIOG::IDR(3));
  18.         auto hidr(GPIOH::IDR(7));
  19.         put_string(" WK_UP="); put_size(aidr.ID());
  20.         put_string(" KEY0="); put_size(gidr.ID());
  21.         put_string(" KEY1="); put_size(hidr.ID());
  22.         put_string(".\r\n");
  23.     }
  24. }

  25. void px_GIC_EXTI0() noexcept // WK_UP
  26. {
  27.     auto rpr(EXTI::RPR(0));
  28.     if (rpr.RPIF() == 1)
  29.     {
  30.         rpr.value() = 0;
  31.         rpr.RPIF() = 1;
  32.         rpr.push();
  33.     }
  34.     auto fpr(EXTI::FPR(0));
  35.     if (fpr.FPIF() == 1)
  36.     {
  37.         fpr.value() = 0;
  38.         fpr.FPIF() = 1;
  39.         fpr.push();
  40.     }
  41.     put_string("WK_UP.\r\n");
  42. }

  43. void px_GIC_EXTI3() noexcept // KEY0
  44. {
  45.     auto rpr(EXTI::RPR(3));
  46.     if (rpr.RPIF() == 1)
  47.     {
  48.         rpr.value() = 0;
  49.         rpr.RPIF() = 1;
  50.         rpr.push();
  51.     }
  52.     auto fpr(EXTI::FPR(3));
  53.     if (fpr.FPIF() == 1)
  54.     {
  55.         fpr.value() = 0;
  56.         fpr.FPIF() = 1;
  57.         fpr.push();
  58.     }
  59.     put_string("KEY0.\r\n");
  60. }

  61. void px_GIC_EXTI7() noexcept // KEY1
  62. {
  63.     auto rpr(EXTI::RPR(7));
  64.     if (rpr.RPIF() == 1)
  65.     {
  66.         rpr.value() = 0;
  67.         rpr.RPIF() = 1;
  68.         rpr.push();
  69.     }
  70.     auto fpr(EXTI::FPR(7));
  71.     if (fpr.FPIF() == 1)
  72.     {
  73.         fpr.value() = 0;
  74.         fpr.FPIF() = 1;
  75.         fpr.push();
  76.     }
  77.     put_string("KEY1.\r\n");
  78. }

  79. void px_GIC_default() noexcept
  80. {
  81.     put_string("GIC_default\r\n");
  82. }
复制代码


回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

有兴趣跟进的请关注这里
记录下完整的main.cpp
  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. import px.cpu.stm32mp157.TIM;
  7. import px.cpu.stm32mp157.EXTI;

  8. using namespace px_namespace;
  9. using namespace px_namespace::cpu::stm32mp157;

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

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

  239. static void initialize_clock() noexcept
  240. {
  241.     reset_clock();
  242.     set_clock();
  243. }

  244. static void initialize_gic() noexcept
  245. {
  246.     //38 EXTI0, 41 EXTI3, 84 uart4, 86 tim6, 97 EXTI7
  247.     auto igroupr(GICD::IGROUPR(38)); igroupr.GROUP_STATUS() = 1;
  248.     igroupr.index(41); igroupr.GROUP_STATUS() = 1;
  249.     igroupr.index(84); igroupr.GROUP_STATUS() = 1;
  250.     igroupr.index(86); igroupr.GROUP_STATUS() = 1;
  251.     igroupr.index(97); igroupr.GROUP_STATUS() = 1;
  252.     igroupr.push();
  253.     auto isenabler(GICD::ISENABLER(38)); isenabler.SET_ENABLE() = 1;
  254.     isenabler.index(41); isenabler.SET_ENABLE() = 1;
  255.     isenabler.index(84); isenabler.SET_ENABLE() = 1;
  256.     isenabler.index(86); isenabler.SET_ENABLE() = 1;
  257.     isenabler.index(97); isenabler.SET_ENABLE() = 1;
  258.     isenabler.push();
  259.     auto ipriorityr(GICD::IPRIORITYR(38)); ipriorityr.PRIORITY() = 0;
  260.     ipriorityr.index(41); ipriorityr.PRIORITY() = 0;
  261.     ipriorityr.index(84); ipriorityr.PRIORITY() = 0;
  262.     ipriorityr.index(86); ipriorityr.PRIORITY() = 0;
  263.     ipriorityr.index(97); ipriorityr.PRIORITY() = 0;
  264.     ipriorityr.push();
  265.     auto itargetsr(GICD::ITARGETSR(38)); itargetsr.CPU_TARGETS() = 1;
  266.     itargetsr.index(41); itargetsr.CPU_TARGETS() = 1;
  267.     itargetsr.index(84); itargetsr.CPU_TARGETS() = 1;
  268.     itargetsr.index(86); itargetsr.CPU_TARGETS() = 1;
  269.     itargetsr.index(97); itargetsr.CPU_TARGETS() = 1;
  270.     itargetsr.push();
  271.     auto icfgr(GICD::ICFGR(38)); icfgr.INT_CONFIG() = 3;
  272.     icfgr.index(41); icfgr.INT_CONFIG() = 3;
  273.     icfgr.index(84); icfgr.INT_CONFIG() = 1;
  274.     icfgr.index(86); icfgr.INT_CONFIG() = 1;
  275.     icfgr.index(97); icfgr.INT_CONFIG() = 3;
  276.     icfgr.push();
  277. }

  278. void initialize_exti() noexcept
  279. {
  280.     // PA.0 WK_UP, PG.3 KEY0, PH.7 KEY1
  281.     auto rtsr(EXTI::RTSR(0)); rtsr.RT() = 1;
  282.     rtsr.index(3); rtsr.RT() = 1;
  283.     rtsr.index(7); rtsr.RT() = 1;
  284.     rtsr.push();
  285.     auto ftsr(EXTI::FTSR(0)); ftsr.FT() = 1;
  286.     ftsr.index(3); ftsr.FT() = 1;
  287.     ftsr.index(7); ftsr.FT() = 1;
  288.     ftsr.push();
  289.     auto exticr(EXTI::EXTICR(0)); exticr.EXTI() = 0;
  290.     exticr.index(3); exticr.EXTI() = 6;
  291.     exticr.index(7); exticr.EXTI() = 7;
  292.     exticr.push();
  293.     auto imr(EXTI::IMR(0)); imr.IM() = 1;
  294.     imr.index(3); imr.IM() = 1;
  295.     imr.index(7); imr.IM() = 1;
  296.     imr.push();
  297.     auto emr(EXTI::EMR(0)); emr.EM() = 1;
  298.     emr.index(3); emr.EM() = 1;
  299.     emr.index(7); emr.EM() = 1;
  300.     emr.push();
  301. }

  302. static void initialize_gpio() noexcept
  303. {
  304.     // open GPIO[A, B, F, G, H, I]
  305.     {
  306.         auto mp_ahb4ensetr(RCC::MP_AHB4ENSETR());
  307.         mp_ahb4ensetr.GPIOAEN() = 1;
  308.         mp_ahb4ensetr.GPIOBEN() = 1;
  309.         mp_ahb4ensetr.GPIOFEN() = 1;
  310.         mp_ahb4ensetr.GPIOGEN() = 1;
  311.         mp_ahb4ensetr.GPIOHEN() = 1;
  312.         mp_ahb4ensetr.GPIOIEN() = 1;
  313.         mp_ahb4ensetr.push();
  314.     }
  315.     { // A.0 WK_UP
  316.         auto moder(GPIOA::MODER(0)); moder.MODE() = 0;
  317.         moder.push();
  318.         auto otyper(GPIOA::OTYPER(0)); otyper.OT() = 0;
  319.         otyper.push();
  320.         auto ospeedr(GPIOA::OSPEEDR(0)); ospeedr.OS() = 0;
  321.         ospeedr.push();
  322.         auto pupdr(GPIOA::PUPDR(0)); pupdr.PUPD() = 2;
  323.         pupdr.push();
  324.         auto afr(GPIOA::AFR(0)); afr.AF() = 0;
  325.         afr.push();
  326.     }
  327.     { // B.2 UART4_RX
  328.         auto moder(GPIOB::MODER(2)); moder.MODE() = 2;
  329.         moder.push();
  330.         auto otyper(GPIOB::OTYPER(2)); otyper.OT() = 0;
  331.         otyper.push();
  332.         auto ospeedr(GPIOB::OSPEEDR(2)); ospeedr.OS() = 3;
  333.         ospeedr.push();
  334.         auto pupdr(GPIOB::PUPDR(2)); pupdr.PUPD() = 1;
  335.         pupdr.push();
  336.         auto afr(GPIOB::AFR(2)); afr.AF() = 8;
  337.         afr.push();
  338.     }
  339.     { // F.3 led
  340.         auto moder(GPIOF::MODER(3)); moder.MODE() = 1;
  341.         moder.push();
  342.         auto otyper(GPIOF::OTYPER(3)); otyper.OT() = 0;
  343.         otyper.push();
  344.         auto ospeedr(GPIOF::OSPEEDR(3)); ospeedr.OS() = 0;
  345.         ospeedr.push();
  346.         auto pupdr(GPIOF::PUPDR(3)); pupdr.PUPD() = 1;
  347.         pupdr.push();
  348.         auto odr(GPIOF::ODR(3)); odr.OD() = 1;
  349.         odr.push();
  350.     }
  351.     { // G.3 KEY0, G.11 UART4_TX
  352.         auto moder(GPIOG::MODER(3)); moder.MODE() = 0;
  353.         moder.index(11); moder.MODE() = 2;
  354.         moder.push();
  355.         auto otyper(GPIOG::OTYPER(3)); otyper.OT() = 0;
  356.         otyper.index(11); otyper.OT() = 0;
  357.         otyper.push();
  358.         auto ospeedr(GPIOG::OSPEEDR(3)); ospeedr.OS() = 0;
  359.         ospeedr.index(11); ospeedr.OS() = 3;
  360.         ospeedr.push();
  361.         auto pupdr(GPIOG::PUPDR(3)); pupdr.PUPD() = 1;
  362.         pupdr.index(11); pupdr.PUPD() = 1;
  363.         pupdr.push();
  364.         auto afr(GPIOG::AFR(3)); afr.AF() = 0;
  365.         afr.index(11); afr.AF() = 6;
  366.         afr.push();
  367.     }
  368.     { // H.7 KEY1
  369.         auto moder(GPIOH::MODER(7)); moder.MODE() = 0;
  370.         moder.push();
  371.         auto otyper(GPIOH::OTYPER(7)); otyper.OT() = 0;
  372.         otyper.push();
  373.         auto ospeedr(GPIOH::OSPEEDR(7)); ospeedr.OS() = 0;
  374.         ospeedr.push();
  375.         auto pupdr(GPIOH::PUPDR(7)); pupdr.PUPD() = 1;
  376.         pupdr.push();
  377.         auto afr(GPIOH::AFR(7)); afr.AF() = 0;
  378.         afr.push();
  379.     }
  380.     { // I.0 led
  381.         auto moder(GPIOI::MODER(0)); moder.MODE() = 1;
  382.         moder.push();
  383.         auto otyper(GPIOI::OTYPER(0)); otyper.OT() = 0;
  384.         otyper.push();
  385.         auto ospeedr(GPIOI::OSPEEDR(0)); ospeedr.OS() = 0;
  386.         ospeedr.push();
  387.         auto pupdr(GPIOI::PUPDR(0)); pupdr.PUPD() = 1;
  388.         pupdr.push();
  389.         auto odr(GPIOI::ODR(0)); odr.OD() = 0;
  390.         odr.push();
  391.     }
  392. }

  393. static void initialize_uart4() noexcept
  394. {
  395.     auto apb1rstsetr(RCC::APB1RSTSETR());
  396.     apb1rstsetr.UART4RST() = 1;
  397.     apb1rstsetr.push();
  398.     auto apb1rstclrr(RCC::APB1RSTCLRR());
  399.     while (apb1rstclrr.UART4RST() == 0) { apb1rstclrr.pull(); }
  400.     apb1rstclrr.UART4RST() = 1;
  401.     apb1rstclrr.push();
  402.     do { apb1rstclrr.pull(); } while (apb1rstclrr.UART4RST() == 1);
  403.     auto uart24ckselr(RCC::UART24CKSELR());
  404.     uart24ckselr.UART24SRC() = 0;
  405.     uart24ckselr.push();
  406.     auto mp_apb1ensetr(RCC::MP_APB1ENSETR());
  407.     mp_apb1ensetr.UART4EN() = 1;
  408.     mp_apb1ensetr.push();
  409.     auto prescr(UART4::PRESCR());
  410.     prescr.PRESC() = 0;
  411.     prescr.push();
  412.     auto brr(UART4::BRR());
  413.     brr.BR() = 100000000 / 115200;
  414.     brr.push();
  415.     auto cr1(UART4::CR1());
  416.     cr1.UE() = 1;
  417.     cr1.RE() = 1;
  418.     cr1.TE() = 1;
  419.     cr1.RXNEIE() = 1;
  420.     cr1.M0() = 0;
  421.     cr1.OVER8() = 0;
  422.     cr1.M1() = 0;
  423.     cr1.push();
  424. }

  425. static void initialize_tim6() noexcept
  426. {
  427.     // 根据157 reference-568页,当前配置下TIM的频率为200Mhz
  428.     auto mp_apb1ensetr(RCC::MP_APB1ENSETR());
  429.     mp_apb1ensetr.TIM6EN() = 1;
  430.     mp_apb1ensetr.push();
  431.     auto cr2(TIM6::CR2());
  432.     cr2.MMS() = 0;
  433.     cr2.push();
  434.     auto dier(TIM6::DIER());
  435.     dier.UIE() = 1;
  436.     dier.UDE() = 0;
  437.     dier.push();
  438.     auto pscr(TIM6::PSCR());
  439.     pscr.PSC() = 199;
  440.     pscr.push();
  441.     auto arr(TIM6::ARR());
  442.     arr.AR() = 1000;
  443.     arr.push();
  444.     auto cr1(TIM6::CR1());
  445.     cr1.CEN() = 1;
  446.     cr1.UDIS() = 0;
  447.     cr1.URS() = 0;
  448.     cr1.OPM() = 0;
  449.     cr1.ARPE() = 1;
  450.     cr1.UIFREMAP() = 0;
  451.     cr1.push();
  452. }

  453. void put_character(const character_type value) noexcept
  454. {
  455.     for (auto isr(UART4::ISR()); isr.TXE() == 0; isr.pull()) {}
  456.     auto tdr(UART4::TDR(0));
  457.     tdr.TD() = value;
  458.     tdr.push();
  459. }

  460. void put_string(const character_type* value) noexcept
  461. {
  462.     while (*value != '\0')
  463.     {
  464.         put_character(*value);
  465.         ++value;
  466.     }
  467. }

  468. void put_size(const size& value) noexcept
  469. {
  470.     if (value < 10)
  471.     {
  472.         put_character('0' + value.value());
  473.         return;
  474.     }
  475.     put_size(value / 10);
  476.     put_character('0' + (value % 10).value());
  477. }

  478. void initialize() noexcept
  479. {
  480.     initialize_clock();
  481.     initialize_gic();
  482.     initialize_exti();
  483.     initialize_gpio();
  484.     initialize_uart4();
  485.     initialize_tim6();
  486.     put_string("boot.\r\n");
  487. }

  488. extern "C"
  489. {
  490.     void px_GIC_UART4() noexcept // 最简单的处理
  491.     {
  492.         auto isr(UART4::ISR());
  493.         if (isr.RXNE() == 1)
  494.         {
  495.             put_character((character_type)UART4::RDR().RD());
  496.         }
  497.     }

  498.     size systick_count(0);
  499.     void px_GIC_TIM6() noexcept //
  500.     {
  501.         auto sr(TIM6::SR());
  502.         sr.UIF() = 0;
  503.         sr.push();
  504.         ++systick_count;
  505.         if (systick_count % 1000 == 0)
  506.         {
  507.             put_string("millisecond=");
  508.             put_size(systick_count);
  509.             {
  510.                 auto odr(GPIOF::ODR(3)); odr.OD() ^= 1;
  511.                 odr.push();
  512.             }
  513.             auto aidr(GPIOA::IDR(0));
  514.             auto gidr(GPIOG::IDR(3));
  515.             auto hidr(GPIOH::IDR(7));
  516.             put_string(" WK_UP="); put_size(aidr.ID());
  517.             put_string(" KEY0="); put_size(gidr.ID());
  518.             put_string(" KEY1="); put_size(hidr.ID());
  519.             put_string(".\r\n");
  520.         }
  521.     }

  522.     void px_GIC_EXTI0() noexcept // WK_UP
  523.     {
  524.         auto rpr(EXTI::RPR(0));
  525.         if (rpr.RPIF() == 1)
  526.         {
  527.             rpr.value() = 0;
  528.             rpr.RPIF() = 1;
  529.             rpr.push();
  530.         }
  531.         auto fpr(EXTI::FPR(0));
  532.         if (fpr.FPIF() == 1)
  533.         {
  534.             fpr.value() = 0;
  535.             fpr.FPIF() = 1;
  536.             fpr.push();
  537.         }
  538.         put_string("WK_UP.\r\n");
  539.     }

  540.     void px_GIC_EXTI3() noexcept // KEY0
  541.     {
  542.         auto rpr(EXTI::RPR(3));
  543.         if (rpr.RPIF() == 1)
  544.         {
  545.             rpr.value() = 0;
  546.             rpr.RPIF() = 1;
  547.             rpr.push();
  548.         }
  549.         auto fpr(EXTI::FPR(3));
  550.         if (fpr.FPIF() == 1)
  551.         {
  552.             fpr.value() = 0;
  553.             fpr.FPIF() = 1;
  554.             fpr.push();
  555.         }
  556.         put_string("KEY0.\r\n");
  557.     }

  558.     void px_GIC_EXTI7() noexcept // KEY1
  559.     {
  560.         auto rpr(EXTI::RPR(7));
  561.         if (rpr.RPIF() == 1)
  562.         {
  563.             rpr.value() = 0;
  564.             rpr.RPIF() = 1;
  565.             rpr.push();
  566.         }
  567.         auto fpr(EXTI::FPR(7));
  568.         if (fpr.FPIF() == 1)
  569.         {
  570.             fpr.value() = 0;
  571.             fpr.FPIF() = 1;
  572.             fpr.push();
  573.         }
  574.         put_string("KEY1.\r\n");
  575.     }

  576.     void px_GIC_default() noexcept
  577.     {
  578.         put_string("GIC_default\r\n");
  579.     }
  580. }
复制代码


回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

下一篇考虑I2C,板载的AP3216C.
回复 支持 反对

使用道具 举报

10

主题

29

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2013-12-30
在线时间
50 小时
发表于 2020-12-13 00:36:41 来自手机 | 显示全部楼层
还可以裸机玩,一个核,一个main() 吗?
回复 支持 反对

使用道具 举报

14

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2018-9-14
在线时间
157 小时
 楼主| 发表于 2020-12-14 13:28:56 | 显示全部楼层
本帖最后由 sppz 于 2020-12-14 13:45 编辑
musich 发表于 2020-12-13 00:36
还可以裸机玩,一个核,一个main() 吗?

1.157是a7的cpu0启动的,现在还没研究多核怎么弄.
2.入口叫什么可以自己定,所以不叫main.
3.当然现在无系统,所以可以认为是一个"main".(但其实也不是,有中断)

回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-1-31 17:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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