21ic问答首页 - 利用TMR2进行外部采样计数器
利用TMR2进行外部采样计数器
首先想亚特利BBS表示深切的歉意,由于粗心大意将WorkBench,写成BenchMark|让有人删了两次帖子,错了认罚,再次致歉!目前ADC算是半个正常:
首先老老实实从仅仅开通4线LCD,ADC1-3,USART1,RTC开始,其他照旧。结果3路ACD出来了,只是数据不对,但可以随电位器而变化,并且两块板子都正常打印和显示。
第二步将ADC增加到ADC1-4(ADC,2,3,6,Temperature-16),结果两块板子一款【A】4路正常,一款板子【B】3路正常,结果如下:
两款板子的ADC1从463->44067,超出了12位ADC4095的范围(VREF+通过RC滤波直接接在VCC上,VREF-接GND);
内部温度时A板子可以随着加热芯片变化,B板子***是3998,偶尔各位跳一下,估计芯片有问题,此问题可以忽略,无碍大局。
ADC基本正常后,直接将设想的模块在WorkBench中都加上了,具体详情以前有帖子已经说明,此不啰嗦了。
接着是EXINT,浏览EXINT的模块函数,很快5路外部中断响应设置完成,并且测试显示正常(E2-4,E6,C5分别用aj=52,53,54,56,35表示)。这个操作是在at32f403a_407_int.c中的EXINT[2,3,4,9_5]_IRQHandler(void)中设置中断响应即可。
第三步估计比艰难,所以将STM32F401RCT6工程也打开,对比编程,发现两者差别比较大,先将我的WB的设置贴图如下:


这是参考STM的CubeMX的设置:
TMR通道1直接输入,通道2间接输入(不占用GPIO),时钟设置为0.1秒[10HZ],
TMR2是用来外部计频了。
在KEIL中,STM需要在MAIN中设置如下启动函数:
//TIM2 ExtPlus Test
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
__HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);
__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_TRIGGER);
在stm32f4xx_it.c中的TMR中断向量中设置
if(__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_UPDATE)!=RESET){
if(t2Cnt>7){t2Cnt=0;kk=ttc-8;ttc=0;}else t2Cnt++;
__HAL_TIM_CLEAR_IT(&htim2,TIM_IT_UPDATE);
}
//}
ttc++;
其中ttc是在中断没有发生累加计频,当中断产生将ttc-8付给kk送LCD显示,减8是代码运行时间的补偿,测1K-100KHz误差在万分左右。
搜索WB生成的文件at32f403a_407_conf.c中没有对应函数,在中断向量表文件at32f403a_407_int.c中的TMR2中断函数依葫芦画瓢写上:
if(tmr_interrupt_flag_get(TMR2,TMR_TRIGGER_INT==SET)){
kk=ttc;ttc=0;
tmr_flag_clear(TMR2,TMR_TRIGGER_INT);
}
ttc++;
而在main中需要的在at32f403a_407_tmr.c中遍历没有对应的函数,参考本网站其他友的文章看说明采用了以下语句:
tmr_interrupt_enable(TMR2,TMR_TRIGGER_INT,TRUE);//,TMR_OVF_INT,TRUE);//
用TMR_TRIGGER_INT也好,TMR_OVF_INT也好只要外接信号单片机就不动了,由后者还是能在动起来,没有任何计脉冲的数据。
网站里没有类似文章,无从参考,恳请老师们指点迷津。
I2C,XMC,SPI有成功过的经验,应该可以弄出来。
首先老老实实从仅仅开通4线LCD,ADC1-3,USART1,RTC开始,其他照旧。结果3路ACD出来了,只是数据不对,但可以随电位器而变化,并且两块板子都正常打印和显示。
第二步将ADC增加到ADC1-4(ADC,2,3,6,Temperature-16),结果两块板子一款【A】4路正常,一款板子【B】3路正常,结果如下:
两款板子的ADC1从463->44067,超出了12位ADC4095的范围(VREF+通过RC滤波直接接在VCC上,VREF-接GND);
内部温度时A板子可以随着加热芯片变化,B板子***是3998,偶尔各位跳一下,估计芯片有问题,此问题可以忽略,无碍大局。
ADC基本正常后,直接将设想的模块在WorkBench中都加上了,具体详情以前有帖子已经说明,此不啰嗦了。
接着是EXINT,浏览EXINT的模块函数,很快5路外部中断响应设置完成,并且测试显示正常(E2-4,E6,C5分别用aj=52,53,54,56,35表示)。这个操作是在at32f403a_407_int.c中的EXINT[2,3,4,9_5]_IRQHandler(void)中设置中断响应即可。
第三步估计比艰难,所以将STM32F401RCT6工程也打开,对比编程,发现两者差别比较大,先将我的WB的设置贴图如下:


这是参考STM的CubeMX的设置:
TMR通道1直接输入,通道2间接输入(不占用GPIO),时钟设置为0.1秒[10HZ],
TMR2是用来外部计频了。
在KEIL中,STM需要在MAIN中设置如下启动函数:
//TIM2 ExtPlus Test
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
__HAL_TIM_ENABLE_IT(&htim2,TIM_IT_UPDATE);
__HAL_TIM_CLEAR_FLAG(&htim2,TIM_FLAG_TRIGGER);
在stm32f4xx_it.c中的TMR中断向量中设置
if(__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_UPDATE)!=RESET){
if(t2Cnt>7){t2Cnt=0;kk=ttc-8;ttc=0;}else t2Cnt++;
__HAL_TIM_CLEAR_IT(&htim2,TIM_IT_UPDATE);
}
//}
ttc++;
其中ttc是在中断没有发生累加计频,当中断产生将ttc-8付给kk送LCD显示,减8是代码运行时间的补偿,测1K-100KHz误差在万分左右。
搜索WB生成的文件at32f403a_407_conf.c中没有对应函数,在中断向量表文件at32f403a_407_int.c中的TMR2中断函数依葫芦画瓢写上:
if(tmr_interrupt_flag_get(TMR2,TMR_TRIGGER_INT==SET)){
kk=ttc;ttc=0;
tmr_flag_clear(TMR2,TMR_TRIGGER_INT);
}
ttc++;
而在main中需要的在at32f403a_407_tmr.c中遍历没有对应的函数,参考本网站其他友的文章看说明采用了以下语句:
tmr_interrupt_enable(TMR2,TMR_TRIGGER_INT,TRUE);//,TMR_OVF_INT,TRUE);//
用TMR_TRIGGER_INT也好,TMR_OVF_INT也好只要外接信号单片机就不动了,由后者还是能在动起来,没有任何计脉冲的数据。
网站里没有类似文章,无从参考,恳请老师们指点迷津。
I2C,XMC,SPI有成功过的经验,应该可以弄出来。
您需要登录后才可以回复 登录 | 注册