查看: 1428|回复: 0

【SAMV71精讲精练系列】2、通用IO实操

[复制链接]

该用户从未签到

发表于 2015-11-24 10:20:43 | 显示全部楼层 |阅读模式
分享到:
前一篇帖子算是开了一个好头。

另外,需要补充说明的一点是,上一篇验证了,SAMV71的CPU时钟是可以
高达300MHZ的,但是你千万别指望外设的时钟也能达到300MHZ。
这就好比我们的大脑与四肢,大脑(CPU)的反应速度总是要快于你的手脚
(外设),否则岂不是违背科学了?
有兴趣的可以编程验证一下,当外设时钟设置过高时,CPU会启用一个自保护
程序,阻止程序的烧录,此时,你需要将芯片擦除一次,并且将外设时钟设置
到一个合理的范围,可以继续烧录。


另外,一边读(写)程序,一边学习的方法,是不是比单纯阅读数据手册和
应用文档,更有效率和更有趣一些?
论坛发帖毕竟是一种简单的学习方式,督促自己也方便他人,如果你也是一个
技术狂热者,还可以加群交流 - 单片机嵌入式技术群 162388414,广告或者
素质不佳者免入


这里有两个概念首先需要了解一下,通用GPIO和外设PIO。
这个并不是什么新鲜词,也不是爱特梅尔公司独创。我们都知道,从最基础的
8051单片机开始,IO复用就普遍存在。这涉及到芯片设计的范畴,试想一下,
若非如此,MCU的每一个功能我们都为它单独设计一个PIN,甭说ARM了,就算
8051恐怕也会臃肿成一个“多足虫”。然后焊接、布线、PCBA面积、产品体积等
一系列的问题都出来了……

了解到这些,就足够了。学习一定是要有的放矢,才不至于眉毛胡子一把抓而不得其法。
我记得念书的时候,不少同学非常刻苦却成绩平平,反倒有些该玩玩的那种很拔尖。
你说他聪明吧,肯定是聪明,当然最主要的还是方法,此类人擅长把握事物的核心和本质。
就好像第一次我听说电路板这个词的时候,我们都管它叫PCB,后来工作了发现也
有叫PCBA的。当然这些都不是重点,我们也没必要纠结它到底该叫PCB还是PCBA?

我们只需要了解,GPIO、PIO这二者在写程序的时候是互斥的、有你无我就行。
以下是本篇的正题 - 使用GPIO模式点亮LED0,LED1




需要注意的几点
1、定义一个PIN
#define LED0_PIN PIO_PA23_IDX#define LED1_PIN PIO_PC9_IDX

2、GPIO使用之前需要初始化,调用如下函数
static inline void ioport_init(void)
{
      arch_ioport_init();
}

函数体如下
__always_inline static void arch_ioport_init(void)
{
#ifdef ID_PIOA
      sysclk_enable_peripheral_clock(ID_PIOA);
#endif
#ifdef ID_PIOB
      sysclk_enable_peripheral_clock(ID_PIOB);
#endif
#ifdef ID_PIOC
      sysclk_enable_peripheral_clock(ID_PIOC);
#endif
#ifdef ID_PIOD
      sysclk_enable_peripheral_clock(ID_PIOD);
#endif
#ifdef ID_PIOE
      sysclk_enable_peripheral_clock(ID_PIOE);
#endif
#ifdef ID_PIOF
      sysclk_enable_peripheral_clock(ID_PIOF);
#endif
}

如果我们只使用PA和PC,可以提取出来单独调用如下两个函数
      sysclk_enable_peripheral_clock(ID_PIOA);
      sysclk_enable_peripheral_clock(ID_PIOC);

3、系统时钟初始化void sysclk_init(void)
如果初始化不调用该函数,将默认使用片内4MRC振荡器


以下贴出全部测试代码
----------------------------------------------------------------------------------------------------------------------
main.c
#define LED0_PIN PIO_PA23_IDX
#define LED1_PIN PIO_PC9_IDX

int main(void)
{
      sysclk_init();
      sysclk_enable_peripheral_clock(ID_PIOA);
      sysclk_enable_peripheral_clock(ID_PIOC);
      
      ioport_set_pin_dir(LED0_PIN,IOPORT_DIR_OUTPUT);
      ioport_set_pin_dir(LED1_PIN,IOPORT_DIR_OUTPUT);
      ioport_set_pin_level(LED0_PIN,IOPORT_PIN_LEVEL_LOW);
      ioport_set_pin_level(LED1_PIN,IOPORT_PIN_LEVEL_LOW);
      
      while(true) {
            
      }

}
时钟配置文件与上一篇相同
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /5 下一条

手机版|小黑屋|与非网

GMT+8, 2024-12-19 17:56 , Processed in 0.133809 second(s), 15 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.