找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1346|回复: 4
收起左侧

stm32f103r6单片机的中断程序 PA5也莫名其妙的是低电平?

[复制链接]
ID:995903 发表于 2022-4-27 15:20 | 显示全部楼层 |阅读模式
求帮忙指点一下 谢谢大家
程序写出来后仿真功能一直不实现

PA5也莫名其妙的是低电平
中断前000-999递增计数
中断后显示6个数字
6c7308f2fe80e528b320b0a89660635.png
用proteus8.9以上打开

单片机源程序如下:
  1. #include "stm32f10x.h"
  2. #define GPIO_InitStructure g

  3. uint16_t table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
  4. uint16_t wei[]={0x0fe,0x0fd,0x0fb,0x0f7,0x0ef,0x0df,0xff,0xff};
  5. uint16_t xuehao[]={0x7d,0x4f,0x3f,0x5b,0x5b,0x6f};
  6. u16 i;
  7. u8 ssec,sec,min; //毫秒,秒,分
  8. u8 DisplayData[3];
  9. uint8_t flag_led_bling=1;

  10. void EXTI0_IRQHandler(void)
  11. {
  12.         if(EXTI_GetITStatus(EXTI_Line0)!=RESET)
  13.         {
  14.                         flag_led_bling=1-flag_led_bling;
  15.                         EXTI_ClearITPendingBit(EXTI_Line0);
  16.         }
  17. }
  18. /**
  19.   * @简介:NVIC初始化
  20.   * @参数: 无
  21.   * @返回值:无
  22.   */
  23. void NVIC_Configure(void)
  24. {
  25.         /* 定义NVIC结构体 */
  26.         NVIC_InitTypeDef NVIC_InitStructure;
  27.         /* 选择中断分组 */
  28.           NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);        
  29.   
  30.           /* 配置P[A|B|C|D|E]0为中断源 */
  31.         /* 选择中断通道 */
  32.           NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  33.         /* 设置抢占优先级 */
  34.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  35.         /* 设置响应优先级 */
  36.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  37.         /* 中断使能 */         
  38.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;        
  39.         /* 调用NVIC_Init()完成中断配置 */        
  40.           NVIC_Init(&NVIC_InitStructure);                                                
  41. }


  42. /**
  43.   * @简介:按键初始化,带中断
  44.   * @参数: 无
  45.   * @返回值:无
  46.   */
  47. void KEY_Configure(void)
  48. {
  49.         /* 定义GPIO初始化结构体 */
  50.         GPIO_InitTypeDef GPIO_InitStructure;
  51.         /* 定义EXTI初始化结构体 */
  52.         EXTI_InitTypeDef EXTI_InitStructure;
  53.         
  54.         /* 打开GPIOA和AFIO时钟 */
  55.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);

  56.         /* 配置PA0为上拉输入 */
  57.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  58.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  59.         
  60.         /* 完成配置 */
  61.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  62.         
  63.         /* 选择中断管脚 */
  64.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
  65.         /* 选择中断线路 */
  66.           EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  67.         /* 设置为中断请求 */                        
  68.           EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;        
  69.         /* 设置中断触发方式:双边沿触发 */
  70.           EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  71.         /* 中断线使能 */
  72.           EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  73.         /* 调用EXTI_Init()函数完成中断初始化 */                        
  74.           EXTI_Init(&EXTI_InitStructure);                 

  75. }

  76. /**
  77.   * @简介:按键状态
  78.   * @参数: 无
  79.   * @返回值:按键状态,0-按下,1-松开
  80.   */
  81. uint8_t KEY_Down_Up(void)
  82. {
  83.         return GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);
  84. }


  85. void SEG_Init(void)
  86. {
  87.         GPIO_InitTypeDef  g;
  88. //使能GPIOC时钟
  89.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);
  90.         g.GPIO_Pin = 0x00ff;                                        //PC0-PC7引脚配置
  91.         g.GPIO_Mode = GPIO_Mode_Out_PP;   //配置为推挽输出
  92.         g.GPIO_Speed = GPIO_Speed_50MHz;   //GPIOC速度为50MHz
  93.   GPIO_Init(GPIOC, &g);                                //初始化PC0-PC7
  94.         g.GPIO_Pin = 0x003f;                                        //PB0-PC5引脚配置
  95.         g.GPIO_Mode = GPIO_Mode_Out_PP;   //配置为推挽输出
  96.         g.GPIO_Speed = GPIO_Speed_50MHz;   //GPIOB速度为50MHz
  97.   GPIO_Init(GPIOB, &g);                                //初始化PB0-PB5
  98.         
  99. }

  100. void delay(u16 i)
  101. {
  102.         while(i--);        
  103. }

  104. void DigDisplay()
  105. {
  106.         u8 i;
  107.         for(i=0;i<4;i++)
  108.         {
  109.                 switch(i)         //位选,选择点亮的数码管,
  110.                 {
  111.                         
  112.                         case(0):
  113.                                 GPIO_Write(GPIOB,wei[0]); break;//显示第2位
  114.                         case(1):
  115.                                 GPIO_Write(GPIOB,wei[1]); break;//显示第1位
  116.                         case(2):
  117.                                 GPIO_Write(GPIOB,wei[2]); break;//显示第0位        
  118.                 }
  119.                 GPIO_Write(GPIOC,DisplayData[i]);//发送段码
  120.                 delay(65535); //间隔一段时间扫描        
  121.                 GPIO_Write(GPIOC,0x000);//消隐
  122.                 delay(10);
  123.         }
  124. }

  125. void datapros()
  126. {

  127.         
  128.         DisplayData[2]=table[sec%10];
  129.         
  130.         DisplayData[1]=table[ssec/10];
  131.         DisplayData[0]=table[ssec%10];
  132. }

  133. int main()
  134. {        
  135.         
  136.         SEG_Init();
  137.         NVIC_Configure();//NVIC 配置
  138.         KEY_Configure();//KEY 配置
  139.         
  140.                 if(flag_led_bling)
  141.                         {
  142.        for(i=0;i<1000;i++)
  143.                          {
  144.                                 ssec++;
  145.                                 if(ssec==100)
  146.                                 {sec++; ssec=0;}
  147.                                 datapros();
  148.                                 DigDisplay();        
  149.                          }
  150.               }
  151.                
  152.                 else{
  153.                                         while(1)
  154.                 {
  155.                 for(i=1;i<7;i++)
  156.                 {
  157.                         GPIO_Write(GPIOB,wei[i-1]);
  158.                         GPIO_Write(GPIOC,xuehao[i-1]);

  159.                         delay(2300);
  160.                         GPIO_Write(GPIOB,0x0ff);
  161.                         delay(2300);

  162.                 }
  163.           }        
  164.          }
  165. }               
复制代码

求各位大佬帮忙指点一下

zhongduan.7z

60.28 KB, 下载次数: 6

回复

使用道具 举报

ID:401564 发表于 2022-4-27 16:54 | 显示全部楼层
使用STM32标准库函数的话,所有中断函数都是要在stm32f10x_it.c中编写的,函数名也是固定好的你都没有添加这个文件,自然就没有中断了
就几个数码管显示,仿真干嘛呢,杜邦线一插,编译烧录不就完了
至于PA5的低电平,不知道,仿真的东西,也没有用到这个端口,管它干嘛呢
我这有一个前些天学STM32的时候写的,你参考一下,已经验证过的
EXIT中断.7z (209.88 KB, 下载次数: 8)
回复

使用道具 举报

ID:995903 发表于 2022-4-27 17:00 | 显示全部楼层
谢谢,我是学习用的,没有stm32的开发板,只有51的开发板,所以只能仿真。
回复

使用道具 举报

ID:401564 发表于 2022-4-27 20:56 | 显示全部楼层
单片机这种东西,实物不在手上,学习的进度是很慢的
STM32最小系统也可以用在8051的开发板上的,就是高低电平而已
自己买个板子和一个ST LINK就可以在线仿真了,这效果要比软件仿真好很多
回复

使用道具 举报

ID:883242 发表于 2022-4-27 21:06 | 显示全部楼层
  1. void delay(u16 i)
  2. {
  3.         while(i--);        
  4. }
复制代码


这里明显有问题,C51默认用户都是不懂volatile关键字的idiot。
在其他编译器上会被优化掉
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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