//main.c
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
#include "hc_sr04.h"
#include "oled.h"
extern u16 TIM4_STA;
extern u32 TIM4_VAL;
int main(void)
{
float length;
Hcsr04Init();
delay_init();
OLED_Init();
OLED_Clear();
while(1)
{
PBout(11)=1;
delay_us(20);
PBout(11)=0;
if(TIM4_STA&0x80)
{
length=TIM4_VAL/1000000*170;
OLED_Clear();
OLED_ShowFloat(3,3,length,6);
}
delay_ms(10000);
}
}
//hc_sr04.c
#include "hc_sr04.h"
#define HCSR04_PORT GPIOB
#define HCSR04_PORTC_CLK_FUN RCC_APB2PeriphClockCmd
#define HCSR04_CLK RCC_APB2Periph_GPIOB
#define HCSR04_TRIG GPIO_Pin_5
#define HCSR04_ECHO GPIO_Pin_6
void gpioinit(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(HCSR04_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin =HCSR04_TRIG;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
GPIO_ResetBits(HCSR04_PORT,HCSR04_TRIG);
GPIO_InitStructure.GPIO_Pin = HCSR04_ECHO;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(HCSR04_PORT, &GPIO_InitStructure);
GPIO_ResetBits(HCSR04_PORT,HCSR04_ECHO);
}
void Hcsr04Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_ICInitTypeDef TIM_ICInitStruct;
gpioinit();
// TIM_TimeBaseStructure.
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
TIM_DeInit(TIM4);
TIM_TimeBaseStructure.TIM_Period=0XFFFF;
TIM_TimeBaseStructure.TIM_Prescaler=71;
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);
TIM_ARRPreloadConfig(TIM4,DISABLE);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;
TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;
TIM_ICInitStruct.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStruct.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStruct.TIM_ICFilter = 0X00;
TIM_ICInit(TIM4, &TIM_ICInitStruct);
NVIC_InitStructure.NVIC_IRQChannel=TIM4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_ClearFlag(TIM4,TIM_FLAG_Update|TIM_IT_CC1);
TIM_ITConfig(TIM4,TIM_IT_Update|TIM_IT_CC1,ENABLE);
TIM_Cmd(TIM4,ENABLE);
}
u16 TIM4_STA=0;
u32 TIM4_VAL=0;
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4,TIM_IT_Update)!=RESET)
{
}
if(TIM_GetITStatus(TIM4,TIM_IT_CC1)!=RESET)
{
if(TIM4_STA&0X40)
{
TIM4_STA|=0X80;
TIM4_VAL=TIM_GetCapture1(TIM4);
TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Rising);
}else{
TIM4_STA=0;
TIM4_VAL=0;
TIM_SetCounter(TIM4,0);
TIM4_STA|=0X40;
TIM_OC1PolarityConfig(TIM4,TIM_ICPolarity_Falling);
}
}
TIM_ClearITPendingBit(TIM4,TIM_IT_CC1|TIM_IT_Update);
}
hc_sr04.h
#ifndef __HC_SR04_H
#define __HC_SR04_H
#include "sys.h"
#include "stm32f10x.h"
#include "stdlib.h"
#include "delay.h"
void Hcsr04Init(void);
void TIM4_IRQHandler(void);
#endif
運行的結果一直跳而且沒一個正確的 是哪里有問題哦。
uj5u.com熱心網友回復:
定時器period設為5000 prescaler設成0,TIM中斷函式設成下面看看。void TIM4_IRQHandler(void) //TIM3中斷
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發生與否
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx更新中斷標志
msHcCount++;
}
}
uj5u.com熱心網友回復:
@precaler設為0的話他頻率變成什么了。。
uj5u.com熱心網友回復:
分頻為1。定時值=(PSC+1)(PERIOD+1)/f,f為主頻轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/71011.html
標籤:單片機/工控
上一篇:DB9標準的信號線說明
