找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1379|回复: 2
收起左侧

我这个是用stm32通过定时器中断驱动hcsr04,但是驱动不了

[复制链接]
ID:660005 发表于 2021-8-6 17:22 | 显示全部楼层 |阅读模式
void HCSR04(void)
{
        GPIO_InitTypeDef GPIO_Initure;
        __HAL_RCC_GPIOB_CLK_ENABLE();//开启GPIOB时钟
        
         GPIO_Initure.Pin=GPIO_PIN_13;                         //PB13
   GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出
   GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
   GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
   HAL_GPIO_Init(GPIOB,&GPIO_Initure);
        
         GPIO_Initure.Pin=GPIO_PIN_14;                         //PB14
   GPIO_Initure.Mode=GPIO_MODE_EVT_FALLING;  //输入
   GPIO_Initure.Pull=GPIO_PULLUP;          //上拉
   GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速
   HAL_GPIO_Init(GPIOB,&GPIO_Initure);
}



对hcsr04的定义
extern int time;
long long d=0;
int main(void)
{

        
    HAL_Init();                                     //初始化HAL库   
    Stm32_Clock_Init(RCC_PLL_MUL9);           //设置时钟,72M
                delay_init(72);                               //初始化延时函数
                uart_init(115200);                                        //初始化串口
    HCSR04();                TIM3_Init(71,65535);
        while(1)
    {
                            delay_ms(100);      //消抖                                d=time*170*0.000000001;
                        printf("距离为:%d cm\r\n",d);//打印总的距离
    }

}


以上是主函数
int time=0;

TIM_HandleTypeDef TIM3_Handler;      //定时器句柄

//通用定时器3中断初始化
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!
void TIM3_Init(u16 arr,u16 psc)
{  
    TIM3_Handler.Instance=TIM3;                          //通用定时器3
    TIM3_Handler.Init.Prescaler=psc;                     //分频系数
    TIM3_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;    //向上计数器
    TIM3_Handler.Init.Period=arr;                        //自动装载值
    TIM3_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
    HAL_TIM_Base_Init(&TIM3_Handler);

    HAL_TIM_Base_Start_IT(&TIM3_Handler); //使能定时器3和定时器3更新中断:TIM_IT_UPDATE   
}

//定时器底册驱动,开启时钟,设置中断优先级
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
    if(htim->Instance==TIM3)
        {
                __HAL_RCC_TIM3_CLK_ENABLE();            //使能TIM3时钟
                HAL_NVIC_SetPriority(TIM3_IRQn,1,3);    //设置中断优先级,抢占优先级1,子优先级3
                HAL_NVIC_EnableIRQ(TIM3_IRQn);          //开启ITM3中断   
        }
}

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&TIM3_Handler);
}

//回调函数,定时器中断服务函数调用
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

        
    if(htim==(&TIM3_Handler))
    {
                        HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
//        delay_us(10);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_SET);
                delay_us(10);
                HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET);
       if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==0)
                        {
                         TIM3->CNT=0;
                        }
                        if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)==1)
                        {
                                time=TIM3->CNT;
                        }
    }
}

以上定时器
哪里出问题了?

回复

使用道具 举报

ID:584195 发表于 2021-8-6 20:53 | 显示全部楼层
中断里面不能有delay!
回复

使用道具 举报

ID:660005 发表于 2021-8-7 15:02 | 显示全部楼层
zyluglugl 发表于 2021-8-6 20:53
中断里面不能有delay!

那个问题不大吧,我修改了,它也没有改变呀
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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