Embedded STM32F103蓝色药丸从零开始中断

Embedded STM32F103蓝色药丸从零开始中断,embedded,interrupt,keil,bare-metal,bluepill,Embedded,Interrupt,Keil,Bare Metal,Bluepill,我如何从零开始创建蓝色药丸的中断 我不想使用任何特殊的图书馆。此外,我使用keilide,因此,通过“从头开始构建”,我指的是不使用任何额外的库,而不是在没有IDE帮助的情况下组装项目 我试图寻找资源,但没有成功。有谁能帮我,至少给我提供一些信息/参考书目吗?我将不胜感激 此外,我所说的“奇怪的库”是指stmf32f1xx.h头以外的任何其他库。我想在其中一个引脚的输入值切换时触发一个中断。为了做到这一点,在AVR MCU上非常简单,只要只需更改几个寄存器值即可。不幸的是,我不知道ARM MCU

我如何从零开始创建蓝色药丸的中断

我不想使用任何特殊的图书馆。此外,我使用keilide,因此,通过“从头开始构建”,我指的是不使用任何额外的库,而不是在没有IDE帮助的情况下组装项目

我试图寻找资源,但没有成功。有谁能帮我,至少给我提供一些信息/参考书目吗?我将不胜感激

此外,我所说的“奇怪的库”是指stmf32f1xx.h头以外的任何其他库。我想在其中一个引脚的输入值切换时触发一个中断。为了做到这一点,在AVR MCU上非常简单,只要只需更改几个寄存器值即可。不幸的是,我不知道ARM MCU中的中断是如何工作的,我应该在哪个寄存器中写入什么值


此外,更好地理解ARM MCU的中断机制将使我为解决去抖动问题做好更充分的准备。

如果您要求“无库”,我不会完全照搬您的话,因为没有人想完成工作,也不知道他们在Cortex-M上做什么,他们会这么做——我想至少你会使用CMSIS——一个为所有ARM Cortex-M设备提供的通用API,它让你的代码更具可移植性,而不是更差

所有CMSIS代码都是作为源代码提供的,而不是作为静态库提供的,因此不会隐藏任何内容。如果您选择不使用它,您可以查看它的工作方式,并根据需要复制该功能(不必要)

在CMSIS中,默认实现作为“弱链接”提供,用户代码只需定义一个预定义名称的函数来覆盖默认值,即可覆盖该弱链接。默认实现通常是一个无限循环,因此未处理的中断被“捕获”,因此您可以使用调试器进行干预或等待看门狗重置

Cortex-M core中断处理程序和异常处理程序在Cortex-M的所有部分都有共同的名称:

Reset_Handler      
NMI_Handler        
HardFault_Handler  
MemManage_Handler  
BusFault_Handler   
UsageFault_Handler 
SVC_Handler        
DebugMon_Handler   
PendSV_Handler     
SysTick_Handler    
外围中断处理程序的名称由供应商定义,但命名约定为
\u IRQHandler
。例如,在STM32F1xx
EXTI0_IRQHandler
上,是分配给GPIO端口零位的共享外部中断

要实现CMSIS中断处理程序,只需执行以下操作:

  • 使用CMSIS处理程序函数名实现中断处理程序函数
  • 在NVIC(中断控制器)中启用中断
  • 您还可以做其他事情,例如分配中断优先级方案(抢占优先级和子优先级之间的划分),但暂时让我们保持简单

    因为它对所有Cortex-M部件都是普遍存在的,并且因为它在几乎任何非平凡的应用程序中都是有用的,所以使用SYSTICK中断的说明作为起点是有用的

    #include "stm32f1xx.h"
      
    volatile uint32_t msTicks = 0 ;
      
    void SysTick_Handler(void)  
    {
        msTicks++ ;
    }
      
    int main (void)  
    {
        if( SysTick_Config( SystemCoreClock / 1000 ) != 0 ) // 1ms tick
        {
            // Error Handling 
        }
      
        ...
    
    }
    
    SysTick\u Config()
    是另一个CMSIS函数。在core_cm3.h中,它如下所示:

    __STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
    {
      if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk)
      {
        return (1UL);                                                   /* Reload value impossible */
      }
    
      SysTick->LOAD  = (uint32_t)(ticks - 1UL);                         /* set reload register */
      NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */
      SysTick->VAL   = 0UL;                                             /* Load the SysTick Counter Value */
      SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
                       SysTick_CTRL_TICKINT_Msk   |
                       SysTick_CTRL_ENABLE_Msk;                         /* Enable SysTick IRQ and SysTick Timer */
      return (0UL);                                                     /* Function successful */
    }
    
    \uuuuuuuuuu静态uuuu内联uint32\uu系统单击配置(uint32\ut勾号)
    {
    如果((滴答声-1UL)>系统滴答声\u加载\u重新加载\u Msk)
    {
    返回(1UL);/*不可能重新加载值*/
    }
    SysTick->LOAD=(uint32_t)(滴答声-1UL);/*设置重新加载寄存器*/
    NVIC_设置优先级(SysTick_IRQn,(1UL VAL=0UL;/*加载SysTick计数器值*/
    SysTick->CTRL=SysTick\U CTRL\U CLKSOURCE\U Msk|
    SysTick\u CTRL\u TICKINT\u Msk|
    SysTick\u CTRL\u ENABLE\u Msk;/*启用SysTick IRQ和SysTick定时器*/
    返回(0UL);/*函数成功*/
    }
    
    假设您在GPIOA引脚0的下降沿上有一个外部中断源,那么您将使用STM32 EXTI0中断。最小处理程序如下所示:

    void EXTI0_IRQHandler(void)
    {
        EXTI->PR |= (1<<0);                           // clear pending interrupt
    
        // Handle interrupt...
    }
    
    void EXTI0\u IRQHandler(void)
    {
    EXTI->PR |=(1APB2ENR |=RCC_APB2ENR_AFIOEN;//为备用功能启用时钟
    AFIO->EXTICR[0]|=AFIO_EXTICR1_EXTI0;//设置要使用的pin
    EXTI->IMR=EXTI\u IMR\u MR0;//取消掩码中断
    EXTI->EMR=EXTI\u EMR\u MR0;//取消掩码事件
    EXTI->FTSR=EXTI\u FTSR\u TR0;//设置下降沿
    
    NVIC->ISER[0]|=(1当你强制要求“没有库”时,我不会完全按照字面意思理解你,因为没有人想在Cortex-M上完成工作,也不知道自己在做什么,所以我想至少你会使用CMSIS,这是一个为所有ARM Cortex-M设备提供的通用API,它使你的代码更具可移植性,而不是更差

    所有CMSIS代码都是作为源代码提供的,而不是作为静态库提供的,因此不会隐藏任何内容。如果您选择不使用它,您可以查看它的工作方式,并根据需要复制该功能(不必要)

    在CMSIS中,默认实现作为“弱链接”提供,用户代码可以通过定义预定义名称的函数来覆盖默认实现。默认实现通常是无限循环,因此未处理的中断被“捕获”例如,您可以使用调试器进行干预或等待看门狗重置

    Cortex-M core中断处理程序和异常处理程序在Cortex-M的所有部分都有共同的名称:

    Reset_Handler      
    NMI_Handler        
    HardFault_Handler  
    MemManage_Handler  
    BusFault_Handler   
    UsageFault_Handler 
    SVC_Handler        
    DebugMon_Handler   
    PendSV_Handler     
    SysTick_Handler    
    
    外围中断处理程序的名称由供应商定义,但命名约定是
    \u IRQHandler
    。例如,在stm32f1x
    EXTI0\u IRQHandler
    上,是分配给GPIO端口零位的共享外部中断

    要实现CMSIS中断处理程序,只需执行以下操作:

  • 使用CMSIS处理程序函数名实现中断处理程序函数
  • 在NVIC(中断控制器)中启用中断
  • 您还可以做其他事情,比如分配中断优先级方案(抢占优先级和子优先级之间的划分)