|
今天做作品 單個(gè)的超聲波模塊解決了 但是當(dāng)多個(gè) 修改代碼后 編譯沒有問題 缺無法正常運(yùn)行 不知道問題出在哪里 有大佬解答下嗎?
可運(yùn)行的csb0.c
#include "csb0.h"
#include "stm32f10x.h"
#include "delay.h"
/*記錄定時(shí)器溢出次數(shù)*/
unsigned int overcount1 = 0;
/**
* Function bsp_getUltrasonicDistance
* @brief 獲取超聲距離
* @param[in] void
* @param[out] void
* @return 距離浮點(diǎn)值
* @par History 無
*/
void Ultrasonic_GPIO_Init(void)
{
/*定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
GPIO_InitTypeDef GPIO_InitStructure;
/*開啟外設(shè)時(shí)鐘*/
RCC_APB2PeriphClockCmd(TRIG_RCC0, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁能jtag
/*TRIG觸發(fā)信號(hào)*/
GPIO_InitStructure.GPIO_Pin = TRIG_PIN0;
/*設(shè)置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設(shè)置引腳速率為50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*調(diào)用庫函數(shù),初始化*/
GPIO_Init(TRIG_PORT0, &GPIO_InitStructure);
/*開啟外設(shè)時(shí)鐘*/
RCC_APB2PeriphClockCmd(ECHO_RCC0, ENABLE);
/*ECOH回響信號(hào)*/
GPIO_InitStructure.GPIO_Pin = ECHO_PIN0;
/*設(shè)置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
/*調(diào)用庫函數(shù),初始化PORT*/
GPIO_Init(ECHO_PORT0, &GPIO_InitStructure);
}
/**
* Function bsp_Ultrasonic_Timer2_Init
* @brief 初始化定時(shí)器TIM2
* @param[in] void
* @param[out] void
* @return 距離浮點(diǎn)值
* @par History 無
*/
void bsp_Ultrasonic_Timer2_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
NVIC_InitTypeDef NVIC_InitStructer;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/*定時(shí)器TIM2初始化*/
TIM_DeInit(TIM2);
TIM_TimeBaseInitStructer.TIM_Period = 999;//定時(shí)周期為1000
TIM_TimeBaseInitStructer.TIM_Prescaler = 71; //分頻系數(shù)72
TIM_TimeBaseInitStructer.TIM_ClockDivision = TIM_CKD_DIV1;//不分頻
TIM_TimeBaseInitStructer.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructer);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//開啟更新中斷
NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructer.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructer.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructer.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructer);
TIM_Cmd(TIM2, DISABLE);//關(guān)閉定時(shí)器使能 使接收到信號(hào)后再計(jì)時(shí)
}
void TIM2_IRQHandler(void) //中斷,當(dāng)回響信號(hào)很長是,計(jì)數(shù)值溢出后重復(fù)計(jì)數(shù),用中斷來保存溢出次數(shù)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);//清除中斷標(biāo)志
overcount1++; //統(tǒng)計(jì)計(jì)數(shù)器的計(jì)時(shí)周期
}
}
float bsp_getUltrasonicDistance(void)
{
float length1 = 0, sum1 = 0;
u16 tim;
unsigned int i = 0;
/*測(cè)5次數(shù)據(jù)計(jì)算一次平均值*/
while(i != 5)
{
GPIO_SetBits(TRIG_PORT0, TRIG_PIN0); //拉高信號(hào),作為觸發(fā)信號(hào)
delay_us(20); //高電平信號(hào)超過10us
GPIO_ResetBits(TRIG_PORT0, TRIG_PIN0);
/*等待回響信號(hào)*/
while(GPIO_ReadInputDataBit(ECHO_PORT0, ECHO_PIN0) == 0);
TIM_Cmd(TIM2,ENABLE);//回響信號(hào)到來,開啟定時(shí)器計(jì)數(shù)
i+=1; //每收到一次回響信號(hào)+1,收到5次就計(jì)算均值
while(GPIO_ReadInputDataBit(ECHO_PORT0, ECHO_PIN0) == 1);//回響信號(hào)消失
TIM_Cmd(TIM2, DISABLE);//關(guān)閉定時(shí)器
tim = TIM_GetCounter(TIM2);//獲取計(jì)TIM2數(shù)寄存器中的計(jì)數(shù)值,一邊計(jì)算回響信號(hào)時(shí)間
length1 = (tim + overcount1 * 1000) / 58.0;//通過回響信號(hào)計(jì)算距離
sum1 = length1 + sum1;
TIM2->CNT = 0; //將TIM2計(jì)數(shù)寄存器的計(jì)數(shù)值清零
overcount1 = 0; //中斷溢出次數(shù)清零
delay_ms(1);
}
length1 = sum1 / 5;
return length1; //距離作為函數(shù)返回值
}
csb0.h
#define __BSP_ULTRASONIC_H__
#define __BSP_ULTRASONIC_H__
#define TRIG_RCC0 RCC_APB2Periph_GPIOB
#define ECHO_RCC0 RCC_APB2Periph_GPIOB
#define TRIG_PIN0 GPIO_Pin_6
#define ECHO_PIN0 GPIO_Pin_7
#define TRIG_PORT0 GPIOB
#define ECHO_PORT0 GPIOB
//#define HC_GPIO_PIN GPIO_Pin_7
//#define HC_PORT GPIOB
void Ultrasonic_GPIO_Init(void);
extern float bsp_getUltrasonicDistance(void);
extern void bsp_Ultrasonic_Timer2_Init(void);
修改后 無法使用的 (定時(shí)器 打算使用3)
csb1.c
#include "csb1.h"
#include "stm32f10x.h"
#include "delay.h"
/*記錄定時(shí)器溢出次數(shù)*/
unsigned int overcount2 = 0;
/**
* Function bsp_getUltrasonicDistance
* @brief 獲取超聲距離
* @param[in] void
* @param[out] void
* @return 距離浮點(diǎn)值
* @par History 無
*/
void Ultrasonic_GPIO_Init2(void)
{
/*定義一個(gè)GPIO_InitTypeDef類型的結(jié)構(gòu)體*/
GPIO_InitTypeDef GPIO_InitStructure;
/*開啟外設(shè)時(shí)鐘*/
RCC_APB2PeriphClockCmd(TRIG_RCC1, ENABLE);
//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); //禁能jtag
/*TRIG觸發(fā)信號(hào)*/
GPIO_InitStructure.GPIO_Pin = TRIG_PIN1;
/*設(shè)置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*設(shè)置引腳速率為50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*調(diào)用庫函數(shù),初始化*/
GPIO_Init(TRIG_PORT1, &GPIO_InitStructure);
/*開啟外設(shè)時(shí)鐘*/
RCC_APB2PeriphClockCmd(ECHO_RCC1, ENABLE);
/*ECOH回響信號(hào)*/
GPIO_InitStructure.GPIO_Pin = ECHO_PIN1;
/*設(shè)置引腳模式為通用推挽輸出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
/*調(diào)用庫函數(shù),初始化PORT*/
GPIO_Init(ECHO_PORT1, &GPIO_InitStructure);
}
/**
* Function bsp_Ultrasonic_Timer3_Init
* @brief 初始化定時(shí)器TIM3
* @param[in] void
* @param[out] void
* @return 距離浮點(diǎn)值
* @par History 無
*/
void bsp_Ultrasonic_Timer3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructer;
NVIC_InitTypeDef NVIC_InitStructer;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/*定時(shí)器TIM3初始化*/
TIM_DeInit(TIM3);
TIM_TimeBaseInitStructer.TIM_Period = 999;//定時(shí)周期為1000
TIM_TimeBaseInitStructer.TIM_Prescaler = 71; //分頻系數(shù)72
TIM_TimeBaseInitStructer.TIM_ClockDivision = TIM_CKD_DIV1;//不分頻
TIM_TimeBaseInitStructer.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructer);
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//開啟更新中斷
NVIC_InitStructer.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructer.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructer.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructer.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructer);
TIM_Cmd(TIM3, DISABLE);//關(guān)閉定時(shí)器使能 使接收到信號(hào)后再計(jì)時(shí)
}
void TIM3_IRQHandler(void) //中斷,當(dāng)回響信號(hào)很長是,計(jì)數(shù)值溢出后重復(fù)計(jì)數(shù),用中斷來保存溢出次數(shù)
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除中斷標(biāo)志
overcount2++; //統(tǒng)計(jì)計(jì)數(shù)器的計(jì)時(shí)周期
}
}
float bsp_getUltrasonicDistance2(void)
{
float length2 = 0, sum2 = 0;
u16 tim;
unsigned int x = 0;
/*測(cè)5次數(shù)據(jù)計(jì)算一次平均值*/
while(x != 5)
{
GPIO_SetBits(TRIG_PORT1, TRIG_PIN1); //拉高信號(hào),作為觸發(fā)信號(hào)
delay_us(20); //高電平信號(hào)超過10us
GPIO_ResetBits(TRIG_PORT1, TRIG_PIN1);
/*等待回響信號(hào)*/
while(GPIO_ReadInputDataBit(ECHO_PORT1, ECHO_PIN1) == 0);
TIM_Cmd(TIM3,ENABLE);//回響信號(hào)到來,開啟定時(shí)器計(jì)數(shù)
x+=1; //每收到一次回響信號(hào)+1,收到5次就計(jì)算均值
while(GPIO_ReadInputDataBit(ECHO_PORT1, ECHO_PIN1) == 1);//回響信號(hào)消失
TIM_Cmd(TIM3, DISABLE);//關(guān)閉定時(shí)器
tim = TIM_GetCounter(TIM3);//獲取計(jì)TIM3數(shù)寄存器中的計(jì)數(shù)值,一邊計(jì)算回響信號(hào)時(shí)間
length2 = (tim + overcount2 * 1000) / 58.0;//通過回響信號(hào)計(jì)算距離
sum2 = length2 + sum2;
TIM3->CNT = 0; //將TIM3計(jì)數(shù)寄存器的計(jì)數(shù)值清零
overcount2 = 0; //中斷溢出次數(shù)清零
delay_ms(1);
}
length2 = sum2 / 5;
return length2; //距離作為函數(shù)返回值
}
csb.h
#ifndef __BSP_ULTRASONIC_H__
#define __BSP_ULTRASONIC_H__
#define TRIG_RCC1 RCC_APB2Periph_GPIOB
#define ECHO_RCC1 RCC_APB2Periph_GPIOB
#define TRIG_PIN1 GPIO_Pin_6
#define ECHO_PIN1 GPIO_Pin_7
#define TRIG_PORT1 GPIOB
#define ECHO_PORT1 GPIOB
void Ultrasonic_GPIO_Init(void);
extern float bsp_getUltrasonicDistance2(void);
extern void bsp_Ultrasonic_Timer3_Init(void);
#endif
當(dāng)時(shí)為了分開調(diào)試 所以將端口定義的一樣 求大佬 可以幫忙看出程序的錯(cuò)誤
|
|