我已经编写了以下代码来控制一个LED,其中一个开关连接在B3,配置为AFIO,但似乎NVIC功能有问题,请问它们应该如何使用 .
#include "stm32f10x.h"
void EXTI3_IRQHandler(void)
{
//Check if EXTI_Line0 is asserted
if(EXTI_GetITStatus(EXTI_Line3) != RESET)
{
GPIOA -> ODR=0X00F0;
}
//we need to clear line pending bit manually
EXTI_ClearITPendingBit(EXTI_Line3);
}
int main()
{
// ENABLING CORRESPONDING CLOCKS
RCC->APB2ENR |= 0X000D;
RCC->APB1ENR |= 0X0001;
//CONFIGURING GPIO PORTS -- PIN 3 CONFIGURED AS AFIO PUSH/PULL AND PIN4 SET UP AS GPIO OUTPUT
GPIOA->CRL = 0X00B3B000;
GPIOB->CRL = 0X0000B000;
//PA6 IS SET AS EVENT OUTPUT PORT
AFIO->EVCR |= 0X0086;
//PB3 SET AS INPUT PORT AFIO_EXTICR1
AFIO->EXTICR[1] |= 0X1000 ;
//SELECTING RISING TRIGGERS
EXTI->RTSR = 0X0008 ;
// UNMASKING INTERRUPT SIGNAL AT EXTI3
EXTI->IMR |= 0X0008 ;
// UNMASKING EVENT SIGNAL AT EXTI6
EXTI->EMR |= 0X0040 ;
GPIOA -> ODR=0X0010;
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
2 回答
根据我可以解密的内容,您希望将引脚3作为中断线,但根据代码中的注释将其设置为OUTPUT Alt Function . 要将引脚设置为exti线,需要将其设置为输入上拉/下拉,并根据按钮的接线方式,设置上升沿触发或下降沿触发,并设置内部上拉/下拉电阻使得实际的边沿变化 .
例:
PIN3 - >按钮 - >地
将Pin3设置为ExtI3,将pin3设置为INPUT,上拉/下拉(NOT AFIO),因为按下按钮后pin3变为低电平,然后将边沿触发设置为下降沿,当按下按钮时ODR寄存器必须将其拉高 . 因此,将1写入相应的ODR位 . 然后进入NVIC代码和IRQn等....
下面是一个使用硬件中断的完整无库示例,它是计时器而不是gpio,但你应该明白这个想法 . 有些人会发火焰/抨击,甚至可以看到他们可以招募多少次投票 . 他们对如何工作只是想让其他人让他们为他们工作并继续前进并不感兴趣 . 我很感激你想要了解并看到这些东西 . (您是否可以在ST文档中找到错误?或者可能是ST文档剪切并将其粘贴到文档中时出错?它与您的问题无关)
我将不得不深入挖掘你的问题,看看是否有任何事情发生 . 我强烈建议如下所示,你一步一步走 . 在启用中断之前,使用轮询可以看到外设显示中断吗?然后你能看到NVIC中的中断未决(没有启用处理器中断)然后最后如果启用中断到处理器,你知道它正在向nvic发送,你可以清除它等等所以最后一步是你的函数被调用 . 如果你试图在一个实验中做所有这些事情,那就更难调试了 .
flash.s
putget.s
flash.ld
notmain.c
构建,如果你愿意,可以将cortex-m0s更改为m3s,m3代码不是你遇到的问题
编辑
这使用pb8作为输入,pb9作为输出,而不是可以反弹的开关,我正在驱动pb9来模拟(和控制)pb8上的状态变化 . 无法将pb3作为通用输入工作,只需创建一个循环查找pb3直接更改你的led灯或使用uart打印一些东西,然后将pb3排序到地面和/或3.3,看看你是否得到GPIOB IDR来显示变化,我不能 . 所以切换到pb8 .
notmain.c
我发现它使用了中断23 .
并且匹配EXTI第9行到第5行的文档(在向量表中搜索EXTI9_5和/或009C或0x0000_009C) .
它似乎并不关心pb是否配置为AFIO输出(0xB)或浮动输入(0x4) . 所以我不认为这是你的问题 .
这个易失性指针数组比使用volatile指针更糟糕:
我想知道是否真的使用EXTCR2 0x4001000C而不是EXTCR1这是你想要的0x40010008 . 我会做一个单行程序
然后反汇编它,看看他们是否正在 生产环境 一个商店到0x40010008,如果没有,那么就有你的问题 .
从我看到你不需要乱用EMR和尽管绘图(另一个文档错误?)你不需要设置SWIER以便让信号传递到PR . 我只需要上面显示的寄存器来获得PR以反映输入上的边沿检测 . 从那里NVIC可以看到它,然后我可以设置一个处理程序 .
我使用systick定时器每秒驱动我的pb9输出,每隔一秒就会产生一次中断,因为我只是在观察其中一个边缘 . 如果你有一个开关,你显然不需要任何一个 .