打印
[AT32 WorkBench]

AT WorkBench的TMR设置

[复制链接]
212|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhjb1|  楼主 | 2025-4-25 11:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zhjb1 于 2025-4-25 11:52 编辑

首先向 亚特利BBS表示深切的歉意,由于粗心大意将WorkBench,写成BenchMark,让有人删了两次帖子,错了认罚,再次致歉!言归正传。
前几天发的关于ADC的帖子,由于总是不正常,因此前天重新开始做实验:
第一步:老老实实从仅仅开通4线LCD,ADC1-3,USART1,RTC开始,其他不设置。结果3路ACD出来了,只是数据不对(居然全是8位数据),但可以随电位器而变化,并且两块板子都正常打印和显示,这是良好的开端。
第二步将ADC增加到ADC1-4(ADC1,2,3,6,Temperature-16),结果两块板子一款【以后简称A】4路正常,一款板子【以后简称B】3路正常,结果如下:
两款板子的ADC1一样的结果从463->44067,超出了12位ADC4095的范围(VREF+通过RC滤波直接接在VCC上,VREF-接GND);
内部温度时A板子可以随着加热芯片变化,B板子***显示3988,偶尔个位跳一下,估计芯片有问题,此问题可以忽略,无碍大局。
ADC基本正常后,直接将原设想的模块在WorkBench中都加上了,具体详情以前有帖子已经说明,此不啰嗦了。

第三步调试GPIO外部中断触发,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工程也打开,对比编程,发现两者差别比较大,先将STM32FRCT6的编程如下:


1.1 这是在main前边启动TMR2中断的几行语句//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);


1.2 这是在stm32f4xx_it.c中的TMR2中断向量中设置
if(__HAL_TIM_GET_FLAG(&htim2,TIM_FLAG_UPDATE)!=RESET){
  kk=ttc-8;ttc=0;
  __HAL_TIM_CLEAR_IT(&htim2,TIM_IT_UPDATE);
}
//}
ttc++;


其中kk是送LCD显示的参数,ttc是中断表中定义的计数值。
这样就可以正确打印和输出显示计数值了,见下边的照片

目前的设置最高可以测到100KHz,误差优于万分之一。


2.1参考STM的CubeMX的WorkBench的设置:

TMR2通道1直接输入,通道2间接输入(不占用GPIO),时钟设置为0.1秒[10HZ],
TMR2是用来外部脉冲计数,可以理解为采用1个TMR,1个GPIO直接完成单位时间的循环计数功能。
2.2 在at32f403a_407_int.c中TMR2中断向量函数中添加如下语句
/**
  * @brief  this function handles TMR2 handler.
  * @param  none
  * @retval none
  */
void TMR2_GLOBAL_IRQHandler(void){
  /* add user code begin TMR2_GLOBAL_IRQ 0 */
  /* add user code end TMR2_GLOBAL_IRQ 0 */
if(tmr_flag_get(TMR2,TMR_OVF_INT!=RESET))//TMR_TRIGGER_INT==SET))//TMR_C1_FLAG != RESET))//TMR_C1_RECAPTURE_FLAG==SET))//
{
  kk=ttc;ttc=0;
  tmr_flag_clear(TMR2,TMR_OVF_INT);//TMR_C1_FLAG);//TMR_TRIGGER_INT);//
  //tmr_counter_enable(TMR2,TRUE);
}
ttc++;
  /* add user code begin TMR2_GLOBAL_IRQ 1 */
  /* add user code end TMR2_GLOBAL_IRQ 1 */
}
后边//注释的是认为可能的中断标记选试。

2.3 在main中需要的TMR2中断启动函数
在at32f403a_407_tmr.c中遍历没有对应的函数,参考本网站其他友的文章看说明采用了以下语句:
tmr_interrupt_enable(TMR2,TMR_TRIGGER_INT,TRUE);//,TMR_OVF_INT,TRUE);//
用TMR_TRIGGER_INT也好,TMR_OVF_INT也好只要外接信号单片机就不动了,由后者还是能在动起来,没有任何计脉冲的数据。
最后的需求:
参考STM32,在main函数中有4行启动TMR2中断的语句;在AT32F407中也应该有相应的启动中断和响应终端的语句。
网站里没有类似文章,无从参考,恳请厂家技术老师和网站大佬们指点迷津。
最后声明,所做的测试属于基本功能模块实验,完成后会形成一个系列文档和工程文件放在网上,共同学习提高
不知为何,图片太小了。重新编辑看能否扩大。



TMR2_WB设置.jpg (296.01 KB )

TMR2_WB设置.jpg

使用特权

评论回复
沙发
zhjb1|  楼主 | 2025-4-26 09:35 | 只看该作者
自己回复一下:
几年前就进行过国产买IP核的芯片测试,可以说向下兼容性非常大!
举例:采用AT32F407VGT7芯片,用STMCubeMX创建的STM32F103VET6工程,用FSMC控制16位并口TFTLCD,只需要将divece选设为GD32F307VExx(实际上有许多芯片可选,我是选尽量高点靠近4系列这个点)就可以完全驱显,视频在早年已经发表过了。则此想综测——从EDA开始直到需要的模块都测试完成之后以一些具体应用结束。但断续花了差不多近一个月的测试不尽如意。目前的测试ADC不太圆满(ADC1的第一路出现5位)、DAC、RTC、PWM、EXINT、GPIO口、I2C、SPI、暂时都没有问题了;而在TMR2测试中花了近一个星期,在多处求助无果;我可以把我的测试思路说一下:
打开成功的STM工程的TMR2的所有函数,找到语句,搜语句中的句柄;同时打开AT工程TMR2 的相关函数,找到语句,搜语句中的句柄,而后比较它们对应的值,比如0x0000000;如果没有则按照顺序将他们分别代入;无果!有些句柄的数量比STM的少了许多条,也尝试过少了没有事,将后边的值代人,也不行!又像几年前一样可能会半途而废——仅仅是从完全国产化操作上;目标还要进行,只不过换了平台——既然CubeMX的工程可以运行不妨再用CubeMX创建工程做测试。如果测试成功会将结果做个汇报。
当然我会关注本站的所有信息的。非常希望能有可行的解决方案和思路提供。其实我也非常希望用国产(台湾的)的东西,很在就使用新塘的ARM,现在手里还有一堆,在生态上看来人数不是太多。感觉想深入将一款芯片玩的比较透的人群不多,就像新塘的arm0,有位“飘渺九哥”玩的非常深入,也做了大量推广,......。
最后感谢所有回复问答的老师、工程师、网友们。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:永远好心情 [img]https://bbs.21ic.com/static/image/s

69

主题

297

帖子

1

粉丝