拜见大师
引用
评论
/*定时器初始化*/
/*定义一个TIM_TimeBaseInitTypeDef 类型的结构体,名字叫TIM_TimeBaseStructure*/
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
/*定义一个TIM_ICInitTypeDef 类型的结构体,名字叫TIM_ICInitStructure*/
TIM_ICInitTypeDef TIM_ICInitStructure;
/* 定时器基本设置:*/
/*计数器每次计数的最高值*/
TIM_TimeBaseStructure.TIM_Period = 0xffff;
/* 时钟预分频数 72M/1+1 = 36M 所采集的频率的最小值应该为 36M/60000=600HZ*/
TIM_TimeBaseStructure.TIM_Prescaler = 720;
/* 采样分频 */
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
/* 向上计数模式 */
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
/*调用库函数,初始化TIM2*/
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/*输入捕获设置*/
/*设置频道1,即PA0*/
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
/*设置捕获模式为上升沿捕获*/
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;
/*设置输入1与IC1相连*/
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
/*设置TIM捕获在捕获输入上每探测到一个边沿执行一次*/
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
/*设置输入比较滤波器*/
TIM_ICInitStructure.TIM_ICFilter = 0x00;
/*初始化输入捕获设置*/
TIM_ICInit(TIM2, &TIM_ICInitStructure);
TIM_Cmd(TIM2, ENABLE);
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
/*定时器初始化*/void NVIC_Config(void)
{
/*定义一个NVIC_InitTypeDef 类型的结构体,名字叫NVIC_InitStructure*/
NVIC_InitTypeDef NVIC_InitStructure;
/**********************************************
NVIC_PriorityGroup_0:先占优先级0位从优先级4位
NVIC_PriorityGroup_1:先占优先级1位从优先级3位
NVIC_PriorityGroup_2:先占优先级2位从优先级2位
NVIC_PriorityGroup_3:先占优先级3位从优先级1位
NVIC_PriorityGroup_4:先占优先级4位从优先级0位
***********************************************/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
/*配置选中的中断向量*/
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;; //TIM2捕获比较中断
/*设置了成员NVIC_IRQChannel中的先占优先级*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
/*设置了成员NVIC_IRQChannel中的响应优先级*/
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
/*使能中断向量*/
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
/*调用库函数,初始化中断向量*/
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_GPIO_Config(void)
{
/*定义一个GPIO_InitTypeDef 类型的结构体,名字叫GPIO_InitStructure*/
GPIO_InitTypeDef GPIO_InitStructure;
/*开启TIM2的时钟*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/*开启GPIOA的时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
/*选择PA0引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
/*引脚模式设置为下拉输入*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
/*设置引脚速度*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*初始化所设置的PA管脚*/
GPIO_Init(GPIOA, &GPIO_InitStructure);
}unsigned int Tim_RIsing_count = 0; //上升沿计数
unsigned int Tim_Falling_count = 0;//下降沿计数
static char Time_State = RIsing;
void TIM2_IRQHandler(void) //中断函数
{
/*检测中断标志位*/
if (TIM_GetITStatus(TIM2, TIM_IT_CC1) == SET) /*重置中断标志位*/
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
if (Time_State == RIsing)
{
Time_State = Falling;
TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Falling);
TIM2->CNT = 0x04;
Tim_RIsing_count = TIM_GetCapture1(TIM2);
}
else
{
Time_State = RIsing;
TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Rising);
Tim_Falling_count = TIM_GetCapture1(TIM2);
}
//TIM_UpdateRequestConfig(TIM2, TIM_UpdateSource_Global); 中断源
}引用 张静茹:目前打算24帧每秒。。。。。。。之前用12864LCD放屏幕花的要死,正好手上有个超大号的双色LED12864显示屏。。。。。。。今天一下午基本把硬件驱动搞定了
刷屏有多少帧?
引用 张静茹:测试对象是人肉怎么样,没有骨头的部分
厘米级,不过也有非常准的时候 摆在钢卷尺的一米上显示0.9999400 瞬间醉了
引用 华蓥:想法非常好,但可能存在互相影响吧,精确度和准确度够呛。不过想法确实很好!
玩过51单片机超声波测距,STM32有可能还玩不转. 给个小建议:用两个超声波模块,两个超声波发射方向90度放置,把一个当X的坐标,一个当Y坐标, 这样当手指放到两个模块发射方向上,可以得到XY坐标.实现手式输入
引用 华蓥:以前看过超声波做的雷达帖子,不知道到底可行不?
玩过51单片机超声波测距,STM32有可能还玩不转. 给个小建议:用两个超声波模块,两个超声波发射方向90度放置,把一个当X的坐标,一个当Y坐标, 这样当手指放到两个模块发射方向上,可以得到XY坐标.实现手式输入