Embedded STM32F103蓝色药丸从零开始中断
我如何从零开始创建蓝色药丸的中断 我不想使用任何特殊的图书馆。此外,我使用keilide,因此,通过“从头开始构建”,我指的是不使用任何额外的库,而不是在没有IDE帮助的情况下组装项目 我试图寻找资源,但没有成功。有谁能帮我,至少给我提供一些信息/参考书目吗?我将不胜感激 此外,我所说的“奇怪的库”是指stmf32f1xx.h头以外的任何其他库。我想在其中一个引脚的输入值切换时触发一个中断。为了做到这一点,在AVR MCU上非常简单,只要只需更改几个寄存器值即可。不幸的是,我不知道ARM MCU中的中断是如何工作的,我应该在哪个寄存器中写入什么值Embedded STM32F103蓝色药丸从零开始中断,embedded,interrupt,keil,bare-metal,bluepill,Embedded,Interrupt,Keil,Bare Metal,Bluepill,我如何从零开始创建蓝色药丸的中断 我不想使用任何特殊的图书馆。此外,我使用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
。例如,在STM32F1xxEXTI0_IRQHandler
上,是分配给GPIO端口零位的共享外部中断
要实现CMSIS中断处理程序,只需执行以下操作:
#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
。例如,在stm32f1xEXTI0\u IRQHandler
上,是分配给GPIO端口零位的共享外部中断
要实现CMSIS中断处理程序,只需执行以下操作:
使用CMSIS处理程序函数名实现中断处理程序函数
在NVIC(中断控制器)中启用中断
您还可以做其他事情,比如分配中断优先级方案(抢占优先级和子优先级之间的划分)