-
利用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的设置贴图如下: [url=/data/attachment/album/202504/23/175722ez7fixqiia7iyf77.jpg][img]/data/attachment/album/202504/23/175722ez7fixqiia7iyf77.jpg[/img][/url][url=/data/attachment/album/202504/23/175722ez7fixqiia7iyf77.jpg][img]/data/attachment/album/202504/23/175722ez7fixqiia7iyf77.jpg[/img][/url] 这是参考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有成功过的经验,应该可以弄出来。
124浏览量 1回复量 关注量