找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1284|回复: 1
收起左侧

纯寄存器 stm32单片机外部中断程序不好使

[复制链接]
回帖奖励 20 黑币 回复本帖可获得 2 黑币奖励! 每人限 1 次(中奖概率 50%)
ID:1009775 发表于 2022-5-2 23:28 | 显示全部楼层 |阅读模式
因为学长要求不能使用库函数 所以所有的代码都必须用寄存器来写 然而网上写的代码都调用了库函数 没法做参考 于是搞了好久……劳烦大佬们看一眼
我想实现的效果的是 button 按下 小灯 用的是Proteus仿真(方针的配置没问题)
1.png
就一个文件
单片机源程序如下:
  1. #include "stm32f10x.h"
  2. int main(){
  3. //配置优先级分组
  4.         SCB->AIRCR |= 0x05FA0000 | 0x400;
  5.         //使能GPIOB GPIOA AFIO
  6.         RCC->APB2ENR |= 0x01 << 0 | 0x01 << 3 | 0x01 << 2;
  7.         //设置GPIOB pin2位 led 通用推挽输出
  8.         GPIOB->CRL &= 0xffffff0f;
  9.         GPIOB->CRL |= 0x03 << 4;
  10.         //设置GPIOA pin2为 button 上拉输入
  11.         GPIOA->CRL &= 0xffffff0f;
  12.         GPIOA->CRL |= (0x01 << 3) << 4;
  13.         //设置GPIOA pin1 为中断线
  14.         AFIO->EXTICR[0] |= 0x00 << 4;
  15.         //使能中断线1
  16.         EXTI->IMR |= 0x01 << 1;
  17.         //设置中断线为下降沿触发
  18.         EXTI->FTSR |= 0x01 << 1;
  19.         //设置IP寄存器
  20.         NVIC->IP[EXTI1_IRQn] |= (0x01 << 2 | 0x01) << 4;
  21.         //使能中断
  22.         NVIC->ISER[0] |= 0x01 << 1;
  23.         while(1){
  24.                
  25.         }
  26. }
  27. //重定义中断函数1
  28. void EXTI1_IRQHandler(){
  29.         if((GPIOA->IDR & 0x02) == 0){
  30.                 GPIOB->BSRR |= 0x01 << 1;
  31.         }
  32.         while((GPIOA->IDR & 0x02) == 0);
  33.         GPIOB->BRR |= 0x01 << 1;
复制代码
失败在附件
WeChat_20220502232302_.gif

按键中断.7z

70.37 KB, 下载次数: 1

回复

使用道具 举报

ID:1009775 发表于 2022-5-2 23:38 | 显示全部楼层
最后的啊代码一直被吞也不知道为啥
  1. void EXTI1_IRQHandler(){
  2.         if((GPIOA->IDR & 0x02) == 0){
  3.                 GPIOB->BSRR |= 0x01 << 1;
  4.         }
  5.         while((GPIOA->IDR & 0x02) == 0);
  6.         GPIOB->BRR |= 0x01 << 1;
  7. }
  8. //启动文件里的这个函数学长说也不能用 骗过编译
  9. void SystemInit(void){

  10. }
复制代码
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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