拜见大师
<code class="lang-cpp">/*定时器初始化*/ /*定义一个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); /*定时器初始化*/</code>
<code class="lang-cpp">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); }</code>
<code class="lang-cpp">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); 中断源 }</code>
[修改于 9年10个月前 - 2015/02/17 17:22:53]
引用 yanli12321:刷屏有多少帧?
大赞~我的FPGA 控制LED显示屏放bad apple也快搞定了
引用 张静茹:目前打算24帧每秒。。。。。。。之前用12864LCD放屏幕花的要死,正好手上有个超大号的双色LED12864显示屏。。。。。。。今天一下午基本把硬件驱动搞定了
刷屏有多少帧?
引用 张静茹:彩屏扔学校了5555555555555555这段时间没彩屏都要抓狂了
要是能刷液晶就好了
引用 天易:厘米级,不过也有非常准的时候 摆在钢卷尺的一米上显示0.9999400 瞬间醉了
测距精度如何?
引用 张静茹:测试对象是人肉怎么样,没有骨头的部分
厘米级,不过也有非常准的时候 摆在钢卷尺的一米上显示0.9999400 瞬间醉了
引用 20!不曾存在:也挺准的,白色泡沫也没问题
测试对象是人肉怎么样,没有骨头的部分
引用 张静茹:有效量程呢?
厘米级,不过也有非常准的时候 摆在钢卷尺的一米上显示0.9999400 瞬间醉了
引用 华蓥:想法非常好,但可能存在互相影响吧,精确度和准确度够呛。不过想法确实很好!
玩过51单片机超声波测距,STM32有可能还玩不转. 给个小建议:用两个超声波模块,两个超声波发射方向90度放置,把一个当X的坐标,一个当Y坐标, 这样当手指放到两个模块发射方向上,可以得到XY坐标.实现手式输入
引用 华蓥:以前看过超声波做的雷达帖子,不知道到底可行不?
玩过51单片机超声波测距,STM32有可能还玩不转. 给个小建议:用两个超声波模块,两个超声波发射方向90度放置,把一个当X的坐标,一个当Y坐标, 这样当手指放到两个模块发射方向上,可以得到XY坐标.实现手式输入
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。