OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4194|回复: 2

hal库配置F103C6T6,中断问题求助

[复制链接]

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-5-28
在线时间
1 小时
发表于 2022-5-28 16:51:56 | 显示全部楼层 |阅读模式
1金钱
楼主想实现hr-sc04超声波模块采集距离,按键设置距离,并在OLED上显示的功能,但是发现有时候按下按键,就发生卡死,求助
这是while主体里的代码,OLED,显示和超声波模块获取距离
延时函数都是用的TIM1

  while (1)
  {
               
        OLED_ShowString(0,16,String1,12,1);
        OLED_ShowString(0,36,String2,12,1);
        OLED_ShowNum(20,0,Dec_NUM,1,8,1);
        OLED_ShowNum(28,0,Bit_NUM,1,8,1);
        OLED_ShowNum(44,16,Setting,2,12,1);
        OLED_Refresh();
        
        GET_Distance();
               
        OLED_ShowNum(44,36,(uint16_t)Distance,3,12,1);
        OLED_Refresh();
}




超声波获取距离的函数
uint16_t Total_us=0;//超声波时间
float Distance=0;//测量的距离
void GET_Distance(void)
{
        float One_distance=0;//单次测得的距离
        int i=0;
        for(;i<10;++i)//循环10次
        {
                        uint16_t flag=1;//判断EchoPIN是否由高电平转向低电平
                        
                        
                        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET);
                        hal_TIM1_usDelay(20);
                        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET);//发送20us给TrigPIN
                        
                        htim1.Init.Period=60000;//设置60000us为预装载值
                        HAL_TIM_Base_Init(&htim1);//初始化TIM1
                        htim1.Instance->CNT=0;//清空TIM1计数值
                        while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==GPIO_PIN_RESET)//等待高电平传入
                        {
                        }
                        HAL_TIM_Base_Start(&htim1);//高电平传入,开始计时
                        
                        while(flag==1)
                                        {
                                                if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==GPIO_PIN_RESET)//低电平,flag置零,并且获取一次测量中总的us
                                                {
                                                        HAL_TIM_Base_Stop(&htim1);//关闭定时器
                                                        Total_us=htim1.Instance->CNT;//获取计数值
                                                        flag=0;
                                                }
                                        }
                        One_distance+=340*100.0/2*Total_us/1000000;//计算距离
                        Total_us=0;//计算完一次距离后清0
        }
        Distance=One_distance/10;//求均值
}

hal库的中断函数
按键中断里只操作了一项,对数字加一
另外一个中断也是和这个类似,同样的优先级,十位换成个位数值
void EXTI3_IRQHandler(void)
{
        HAL_Delay(10);
        Dec_NUM+=1;//楼主设置距离用的十位数值
        if(Dec_NUM%5==0) Dec_NUM=0;
        Setting=(Dec_NUM*10+Bit_NUM);//
        HAL_Delay(10);
  HAL_GPIO_EXTI_IRQHandler(KEY1_Pin);
}


优先级配置

优先级配置

调试后发现,按键中断仍然可以正常进行,但是超声波测距模块不动

调试后发现,按键中断仍然可以正常进行,但是超声波测距模块不动

TIM1配置

TIM1配置

时钟

时钟




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2022-5-28
在线时间
1 小时
 楼主| 发表于 2022-5-28 17:33:36 | 显示全部楼层
如果按键中断里不添加延时消抖,就不会出现卡死,不知道是什么原因
回复

使用道具 举报

11

主题

2131

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4731
金钱
4731
注册时间
2015-1-10
在线时间
591 小时
发表于 2022-5-30 10:17:35 | 显示全部楼层
HAL的中断里面加systick延时根本不会响应,systick用的中断计数,压根进不了中断
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 01:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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