野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 414|回复: 3

关于STM32F030C8T6的外断中断问题

[复制链接]
发表于 2024-10-7 10:49:24 | 显示全部楼层 |阅读模式
#ifndef __LED_H
#define __LED_H

#include "stm32f0xx.h"



/* 强制转换相关寄存器地址为指针变量,指向相关寄存器 */
#define RCC_AHBENR     (*(volatile unsigned *)(RCC_BASE + 0x14))  //外设时钟使能寄存器映射地址强制转换为指针变量
#define GPIOB_MODER    (*(volatile unsigned *)(GPIOB_BASE + 0x00))//模式选择寄存器映射地址强制转换为指针变量
#define GPIOB_OTYPER   (*(volatile unsigned *)(GPIOB_BASE + 0x04)) //输出方式选择寄存器映射地址强制转换为指针变量
#define GPIOB_OSPEEDR  (*(volatile unsigned *)(GPIOB_BASE + 0x08)) //输出速度选择寄存器映射地址强制转换为指针变量
#define GPIOB_PUPDR    (*(volatile unsigned *)(GPIOB_BASE + 0x0c))//上下拉选择寄存器映射地址强制转换为指针变量
#define GPIOB_ODR      (*(volatile unsigned *)(GPIOB_BASE + 0x14))//输出数据设置寄存器映射地址强制转换为指针变量


void GPIO_Init();

#endif

#ifndef __KEY_H
#define __KEY_H

#include "stm32f0xx.h"
#include "sys.h"
#include "delay.h"
#include "led.h"

#if!defined RCC_AHBENR
#define RCC_AHBENR     (*(volatile unsigned *)(RCC_BASE + 0x14))  //外设时钟使能寄存器映射地址强制转换为指针变量
#endif


#define GPIOA_MODER    (*(volatile unsigned *)(GPIOA_BASE + 0x00))
#define GPIOA_OTYPER   (*(volatile unsigned *)(GPIOA_BASE + 0x04)) //输出方式选择寄存器映射地址强制转换为指针变量
#define GPIOA_OSPEEDR  (*(volatile unsigned *)(GPIOA_BASE + 0x08)) //输出速度选择寄存器映射地址强制转换为指针变量
#define GPIOA_PUPDR    (*(volatile unsigned *)(GPIOA_BASE + 0x0c)) //上下拉选择寄存器映射地址强制转换为指针变量
#define GPIOA_IDR      (*(volatile unsigned *)(GPIOA_BASE + 0x10)) //输入数据寄存器(只读)映射地址强制转换为指针变量


#define GPIOA_AFRH     (*(volatile unsigned *)(GPIOA_BASE + 0x24)) //GPIOA复用功能寄存器高32位映射地址强制转换了指针变量
       
#define KEY_GPIO_PIN  SYS_GPIO_PIN15    //GPIOA_PIN15引脚置1的宏定义(定义详情查阅SYS.H头文件相关引脚宏定义)



void Key_Init();

void Key_Init(void)
{
        RCC_AHBENR |= 1 << 17;                     //使能GPIO外设时钟
       
        GPIOA_MODER &= ~(3 << (2 * 15));           //设置为输入模式

       
        GPIOA_PUPDR &= ~(3 << (2 * 15));           //端口15位清除置零  
        GPIOA_PUPDR |=  (1 << (2 * 15));           //端口15输出方式设置为PULL-UP(上拉模式)
}

void Exti_Init(uint8_t prio,uint8_t ch)
{
        uint8_t temp = 0;
       
        /* 外部中断相关寄存器初始化设置,IO口与中断功能映射初始化(端口复用功能) */

        Key_Init();
       
        RCC_APB2ENR &= ~(1 << 0);
        RCC_APB2ENR |=  (1 << 0);              //SYSCFG外设时钟使能
       
        SYSCFG->EXTICR[3] &= ~(0xf << (4 * 3));
       

       
        EXTI->IMR  &= ~(1 << 15);
        EXTI->IMR  |=  (1 << 15);    //开启中断模式,15LINE中断屏蔽关闭(中断模式:开启中断触发模式)
       

       
        EXTI->FTSR &= ~(1 << 15);
        EXTI->FTSR |=  (1 << 15);   //下降沿触发
       
       
        /* NVIC初始化,包括:中断优先级设置,中断使能(根据中断编号计算) */
        temp = ((prio << 6) & 0xc0);                   //每个中断优先级由8 bit表示,只有最高7,6两位有效,其他位填0
        NVIC->IP[ch/4] |= (temp << ((ch % 4) * 8));   //每8位表示一个中断,则每个32寄存器有4个中断
       
        NVIC->ISER[0] |= 1 << ch ;                      //使能外部中断(中断使能寄存器数组只有一个成员)
}

void KEY_INT_IRQHandler(void)
{
        delay_ms(20);            //按键消抖
       
        EXTI->PR |= KEY_GPIO_PIN;     //清除中断标志位
       
        if(!(GPIOA_IDR & KEY_GPIO_PIN))
        {
                GPIOB_ODR |= (1<<5);   //GPIOb_5输出高电平,绿灯亮
                GPIOB_ODR &= ~(1<<6);  //GPIOb_6输出低电平,蓝灯不亮
                GPIOB_ODR &= ~(1<<7);  //GPIOb_7输出低电平,红灯不亮
       }
}


int main(void)
{
        sys_stm32_clock_init(6);
        GPIO_Init();
        delay_init(48);
        Exti_Init(2,KEY_INT_IRQn);
       
        while(1)
        {

}
}

void SystemInit(void)    //骗过编译器,否则可能SystemInit报错
{
       

}


回复

使用道具 举报

 楼主| 发表于 2024-10-7 10:52:55 | 显示全部楼层
最近在做的一个STM32F030的板子,使用查询方式测试按键扫描功能都正常,硬件经测试正常,但使用中断方式时外部中断一直无法正常触发,相关寄存器初始化及关键代码如上所示,泣血请求各位大佬指教问题出在哪里?这里卡了很久,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-8 14:48:29 | 显示全部楼层
这个论坛里没有人吗?
回复 支持 反对

使用道具 举报

发表于 2024-10-9 17:28:58 | 显示全部楼层
和正点原子是同一个人么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-1 09:29 , Processed in 0.140001 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表