我有一个核子板,上面有一个按钮。该按钮连接到引脚 C13,按下它后,我应该停止 PWM 信号的处理。有人能指出我正确的方向吗?
这是定义中断及其行为的代码。
void INTERRUPT_CONFIG(){
RCC->APB2ENR|=RCC_APB2ENR_SYSCFGEN;
SYSCFG->EXTICR[2]|=(0x2<<SYSCFG_EXTICR1_EXTI1_Pos);
EXTI->IMR|=(0x1<<EXTI_IMR_MR1_Pos);
EXTI->RTSR|=(0x1<<EXTI_RTSR_TR13_Pos);
EXTI->FTSR|=(0x0<<EXTI_FTSR_TR13_Pos);
NVIC_SetPriority(EXTI1_IRQn,1);
NVIC_EnableIRQ(EXTI1_IRQn);
}
bool flag=false;
void EXTI1_IRQHandler(){
if(EXTI->PR & EXTI_PR_PR13_Pos){
EXTI->PR|=(0x0<<EXTI_PR_PR13_Pos);
flag=!flag;
}
}
...这是主要功能:
int main(void)
{
TIM2_INIT();
//button is pc13
INTERRUPT_CONFIG();
EXTI1_IRQHandler();
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOCEN;
GPIOC->MODER |= ( 0x0 << GPIO_MODER_MODE13_Pos);
GPIOC->PUPDR |= ( 0x1 << GPIO_PUPDR_PUPD13_Pos);//defining the Pin c13
while (1)
{
if(flag==true){
TIM2->CR1&=~(TIM_CR1_CEN);
}
else{
int x;
for(x=0; x<500; x=x+1)
{
TIM2->CCR1=x;
delayFunct(1);
}
for(x=500; x>0; x=x-1)
{
TIM2->CCR1=x;
delayFunct(1);
}
}
我知道这个问题有点冗长,但仍然希望得到一些帮助。提前谢谢你们了。
到目前为止我已经搞乱了EXTI寄存器值的内容,但没有效果
先说一下,根据导师的建议,有些东西已经做了相当大的改变,比如IRQ中的逻辑,union的使用,希望你们 还是能看懂代码
void Interrupt_Init(void){
EXTI15_10_Init();
NVIC->IP[EXTI15_10_IRQn] = (1 << 4);
NVIC->ISER[40 >> 5] |= (1 << (40 % 32));
}
union InterruptFlag {
struct {
volatile bool flag: 1; // Just one bit for our flag
volatile bool press: 1;
} bits_access;
uint32_t reg; // We'll use this for byte access
};
volatile union InterruptFlag flag = { .bits_access.flag = 0 }; //
Initialize
to 0
volatile uint16_t pressTime;
volatile bool lastButtonPress=0;
volatile bool buttonPress=1;
void EXTI15_10_IRQHandler(void){
flag.bits_access.flag = !flag.bits_access.flag;
EXTI->PR |= (1<<13); // Clear PR to re-enable EXTI interrupt
}
void clearIR(void){
flag.bits_access.flag = 0;
buttonPress=0;
}
现在main函数的新内容,函数的定义是一样的,只是while循环发生了变化; 而 (1) {
int x;
for(x=0; x<500; x++)
{
if(flag.bits_access.flag== 1){
x=x-1;
TIM2->CCR1=x;
}
else{
TIM2->CCR1=x;
delayTRIP(1);
}}
for(x=500; x>0; x--)
{
if(flag.bits_access.flag== 1){
x=x+1;
TIM2->CCR1=x;
}
else{
TIM2->CCR1=x;
delayTRIP(1);
}
}
}}