本帖最后由 wgtwgtwgt 于 2019-10-27 19:33 编辑
感谢网友@huahuagg的提醒,今天在microchip官网输入“ATmega4809”搜索:
点击上图红方框中的链接,进入到ATmega4809的资源页面:
在该资源页面的“Documents”区域,有很多非常棒的资源,其中的一个是专门讲解定时器TCA的文档(当然其它外设文档也在该页面中):
下载该文档,翻到第6页,有定时器的详细使用方法介绍,还有基于AS7的例程(托管在github上):
点击上图的github链接,可以跳转的github页面,下载例程:
解压下载好的例程后,会发现有一个.atsIn格式的工程文件:
这时,用AS7打开该工程,如下图所示:
在打开工程过程中,会弹出如下对话框:
若点击上图中的“Download and install”,因国内网络不太给力,又不支持断点续传,即使点击Retry也总是下载失败:
不妨事,直接Close上面两个对话框,不影响源码查阅。工程导入完毕后,会看到有三个可供学习的例程:
这里就拿第三个例程,即定时器的周期性中断来学习。点开该例程下面的main.c文件:
如上图代码所示,首先是一个宏定义,此宏定义指明了定时器的超时时间,时间到,定时器产生溢出中断。它是怎么计算得到的呢?看文档第7页:
由此可见,每250ms,定时器中断一次。
继续看源码,接着是两个函数TCA0_init()和PORT_init():
这两个函数的英文注释非常详细,就不多说了。接着是定时器的中断服务函数和main()函数:
此例程是针对PA0的,每隔250ms在中断服务函数中翻转一次PA0引脚上的电平。注意,在main()函数中sei()是必须的,没有此开总中断函数,是不会有定时器溢出中断响应的,即不会进入到溢出中断服务函数。
好了,编译一下,出现错误。现在就将它移植到Atmel Start工程里。创建Atmel Start工程的方法见帖子。用下述代码代替自动生成的main.c中的代码,其余的文件不用动:
编译无错误,下载到Nano小板上,用户LED灯每250ms闪烁一次:
修改PERIOD_EXAMPLE_VALUE宏的值可以修改定时器溢出时间,怎样修改呢?如下图所示:
若要1秒钟的延时,则将上图中的250改为1000,经过计算得到值0x32D8,将此值赋给PERIOD_EXAMPLE_VALUE宏,则LED0每1秒闪烁一次:
注意,上述定时器时钟使用默认配置,修改时钟频率会影响定时长短。
给microchip/atmel详细的使用文档与参考例程点赞!这些入门教程真不错:
|