0

青い錠剤の割り込みを最初から作成するにはどうすればよいですか?

私は特別なライブラリを使用したくありません。また、私は Keil IDE を使用しているため、"ゼロからビルドする" とは、IDE の助けを借りずにプロジェクトを組み立てるよりも、余分なライブラリを使用しないことを意味します。

リソースを見つけようとしましたが、成功しませんでした。誰かが私を助けて、少なくとも情報/参考文献を提供してくれませんか? 私は感謝されます。

さらに、「奇妙なライブラリ」とは、stmf32f1xx.h ヘッダー以外のライブラリを意味します。ピンの入力値の 1 つがトグルしたときに割り込みを発生させたいと思います。これを行うために、AVR MCU では、いくつかのレジスタ値のみを変更する必要がある限り、非常に簡単でした。残念ながら、ARM MCU 内の割り込みがどのように機能し、どのレジスタにどのような値を書き込むべきかわかりません。

また、ARM MCU の割り込みメカニズムをよりよく理解することで、デバウンスの問題に取り組む準備が整います。

4

1 に答える 1

2

あなたが「ライブラリなし」を命じたとしても、完全に文字通りに解釈するつもりはありません。なぜなら、作業を完了したいと思っていて、Cortex-M で何をしているのかを知っている人は誰もそうしないからです。 CMSIS -すべてのARM Cortex-M デバイスに提供される共通 API であり、コードの移植性を低下させるのではなく、移植性を高めます。

すべての CMSIS コードは静的ライブラリではなくソースとして提供されるため、隠されたものは何もありません。それを使用しないことを選択した場合は、それがどのように機能するかを確認し、必要に応じてその機能を (不必要に) 複製することができます。

CMSIS では、既定の実装は "弱いリンク" として提供されます。これは、定義済みの名前の関数を定義して既定をオーバーライドするだけで、ユーザー コードでオーバーライドできます。デフォルトの実装は通常、無限ループです。つまり、未処理の割り込みが「トラップ」されるため、デバッガーに介入したり、ウォッチドッグのリセットを待機したりできます。

Cortex-M コアの割り込みハンドラと例外ハンドラには、すべての Cortex-M パーツで共通の名前があります。

Reset_Handler      
NMI_Handler        
HardFault_Handler  
MemManage_Handler  
BusFault_Handler   
UsageFault_Handler 
SVC_Handler        
DebugMon_Handler   
PendSV_Handler     
SysTick_Handler    

ペリフェラル割り込みハンドラには、ベンダーによって定義された名前がありますが、命名規則は<interrupt_source>_IRQHandler. たとえば、STM32F1xxEXTI0_IRQHandlerでは、GPIO ポートのビット 0 に割り当てられた共有外部割り込みがあります。

CMSIS 割り込みハンドラーを実装するために必要なことは、次のとおりです。

  1. CMSISハンドラ関数名を使用して割り込みハンドラ関数を実装します
  2. 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_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 */
}

GPIOA ピン 0 の立ち下がりエッジに外部割り込みソースがある場合、STM32 EXTI0 割り込みを使用します。最小限のハンドラーは次のようになります。

void EXTI0_IRQHandler(void)
{
    EXTI->PR |= (1<<0);                           // clear pending interrupt

    // Handle interrupt...
}

EXTI を設定するには、GPIO と EXTI 自体、および NVIC を有効にする必要があります。

RCC->APB2ENR |= RCC_APB2ENR_IOPAEN ;           // enable clock for GPIOA
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN ;           // enable clock for Alternate Function
AFIO->EXTICR[0] |= AFIO_EXTICR1_EXTI0 ;        // set pin to use

EXTI->IMR = EXTI_IMR_MR0 ;             // unmask interrupt
EXTI->EMR = EXTI_EMR_MR0 ;             // unmask event
EXTI->FTSR = EXTI_FTSR_TR0 ;           // set falling edge

NVIC->ISER[0] |= (1 << (EXTI0_IRQChannel & 0x1F));    // enable interrupt EXTI 0

ペリフェラル レジスタと構造体は stm32f10weakx.h で定義され、オーバーライドされる「弱い」デフォルト ペリフェラル ハンドラは、特定のパーツの startup_stm32f10x_cl.s にあります。オーバーライドするハンドラーは、これらのシンボル名と正確に一致する必要があります。

すべてのペリフェラル割り込みソースとその構成方法は、ST リファレンス マニュアル RM0008で定義されています。

すべての Cortex-M コア固有のもの (systtick、NVIC、例外ハンドラーなど) は、 https: //developer.arm.com/ip-products/processors/cortex-m/cortex-m3 で ARM によって提供されます。

CM3 の CMSIS は、 https: //developer.arm.com/documentation/dui0552/a/ で文書化されています。

于 2021-04-18T14:32:08.987 に答える