qq_62513284 2022-10-01 20:31 采纳率: 88%
浏览 15
已结题

stm32f103寄存器操作中断

有人能说下stm32f103zet6的用寄存器写的外部中断详细步骤吗,特别是NVIC部分的步骤,我搜到的文章写得跟屎一样,太垃圾了。

  • 写回答

1条回答 默认 最新

  • emXiaoMing 2022-10-02 11:25
    关注

    正点原子的例程

    //Ex_NVIC_Config专用定义
    #define GPIO_A 0
    #define GPIO_B 1
    #define GPIO_C 2
    #define GPIO_D 3
    #define GPIO_E 4
    #define GPIO_F 5
    #define GPIO_G 6 
    #define FTIR   1  //下降沿触发
    #define RTIR   2  //上升沿触发
    
    void EXTIX_Init(void)
    {
        Ex_NVIC_Config(GPIO_A, 0, RTIR);     //上升沿触发
        MY_NVIC_Init(2, 3, EXTI0_IRQn, 2);    //抢占2,子优先级3,组2
    }
    //外部中断配置函数
    //只针对GPIOA~G;不包括PVD,RTC和USB唤醒这三个
    //参数:
    //GPIOx:0~6,代表GPIOA~G
    //BITx:需要使能的位;
    //TRIM:触发模式,1,下升沿;2,上降沿;3,任意电平触发
    //该函数一次只能配置1个IO口,多个IO口,需多次调用
    //该函数会自动开启对应中断,以及屏蔽线
    void Ex_NVIC_Config(u8 GPIOx, u8 BITx, u8 TRIM)
    {
        u8 EXTADDR;
        u8 EXTOFFSET;
        EXTADDR = BITx / 4; //得到中断寄存器组的编号
        EXTOFFSET = (BITx % 4) * 4;
        RCC->APB2ENR |= 0x01; //使能io复用时钟
        AFIO->EXTICR[EXTADDR] &= ~(0x000F << EXTOFFSET); //清除原来设置!!!
        AFIO->EXTICR[EXTADDR] |= GPIOx << EXTOFFSET; //EXTI.BITx映射到GPIOx.BITx
        //自动设置
        EXTI->IMR |= 1 << BITx; //  开启line BITx上的中断
        //EXTI->EMR|=1<<BITx;//不屏蔽line BITx上的事件 (如果不屏蔽这句,在硬件上是可以的,但是在软件仿真的时候无法进入中断!)
        if(TRIM & 0x01)EXTI->FTSR |= 1 << BITx; //line BITx上事件下降沿触发
        if(TRIM & 0x02)EXTI->RTSR |= 1 << BITx; //line BITx上事件上升降沿触发
    }
    //设置NVIC
    //NVIC_PreemptionPriority:抢占优先级
    //NVIC_SubPriority       :响应优先级
    //NVIC_Channel           :中断编号
    //NVIC_Group             :中断分组 0~4
    //注意优先级不能超过设定的组的范围!否则会有意想不到的错误
    //组划分:
    //组0:0位抢占优先级,4位响应优先级
    //组1:1位抢占优先级,3位响应优先级
    //组2:2位抢占优先级,2位响应优先级
    //组3:3位抢占优先级,1位响应优先级
    //组4:4位抢占优先级,0位响应优先级
    //NVIC_SubPriority和NVIC_PreemptionPriority的原则是,数值越小,越优先
    void MY_NVIC_Init(u8 NVIC_PreemptionPriority, u8 NVIC_SubPriority, u8 NVIC_Channel, u8 NVIC_Group)
    {
        u32 temp;
        MY_NVIC_PriorityGroupConfig(NVIC_Group);//设置分组
        temp = NVIC_PreemptionPriority << (4 - NVIC_Group);
        temp |= NVIC_SubPriority & (0x0f >> NVIC_Group);
        temp &= 0xf;                                //取低四位
        NVIC->ISER[NVIC_Channel / 32] |= (1 << NVIC_Channel % 32); //使能中断位(要清除的话,相反操作就OK)
        NVIC->IP[NVIC_Channel] |= temp << 4;        //设置响应优先级和抢断优先级
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月11日
  • 已采纳回答 10月3日
  • 创建了问题 10月1日

悬赏问题

  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 请求分析基于spring boot+vue的前后端分离的项目
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?