当前位置:首页 > 单片机 > 单片机
[导读]最近因为导师要写一本关于SAME4单片机的书籍,而我也作为一个嵌入式的初学者看了这本书。现在也让我写写几个小的程序,做做示例。既然写了文档之类的,就发到博客上来吧。目前关于这芯片能参考的书籍大概就只有英文手

最近因为导师要写一本关于SAME4单片机的书籍,而我也作为一个嵌入式的初学者看了这本书。现在也让我写写几个小的程序,做做示例。既然写了文档之类的,就发到博客上来吧。

目前关于这芯片能参考的书籍大概就只有英文手册了。用的板子是SAM4E16E。IDE用的是Atmel Studio。既然是学习单片机,就没有使用asf框架,而是直接采用访问寄存器的方法了。

第一个程序就是控制板子上一个LED灯的闪烁了。

一、电路

通过查看电路图,可以发现有一个蓝色的LED灯连接在PA0引脚上。我们可以通过改变PA0输出的电平实现LED灯的闪烁。

二、寄存器的访问和CMSIS

对单片机的操作需要通过对相关寄存器的访问来实现。比如,为调节PA0引脚上的电平,首先我们需要允许PIOA控制PA0引脚。通过查看寄存器说明可知,这只要向相应的PIO使能寄存器(PIO_PER)写入0x01就可以了。同时,也可以查到PIOA的PIO_PER被映射到地址0x400E0E00上了。所以通过如下代码就可以达到目的:

123/* 假设 unsigned int长度为32位 */unsigned int* PIOA_PER_p = (unsigned int*)0x400E0E00u;(*PIOA_PER_p) = 0x01;

这样做非常繁琐,而且我们也不能保证unsigned int总是32位长。 而且当我们换一块开发板的时候,外设的寄存器地址可能会不同,导致移植起来十分困难。

所以CMSIS出现了。

ARM? Cortex? 微控制器软件接口标准 (CMSIS) 是Cortex-M 处理器系列的与供应商无关的硬件抽象层。CMSIS 可实现与处理器和外设之间的一致且简单的软件接口,从而简化软件的重用,缩短微控制器开发人员新手的学习过程,并缩短新设备的上市时间。

软件的创建是嵌入式产品行业的一个主要成本因素。通过跨所有 Cortex-M 芯片供应商产品将软件接口标准化(尤其是在创建新项目或将现有软件迁移到新设备时),可以大大降低成本。

《CMSIS到底是什么》介绍了大概介绍了CMSIS。在这里,我们可以使用它提供的微控制器专用头文件(我们这使用的就是sam.h了),这里提供里外设寄存器的定义,中断号码等:

12#include PIOA->PIO_PER = (uint32_t)0x01;

我们在以后的程序代码中也将使用CMSIS。

三、实现思路

PIO的引脚是复用的,但在这里我们直接使用PIO控制器控制引脚的电平就可以了。可以通过向PIO_SODR、PIO_CODR写入特定的值来直接控制引脚的电平。

然后,通过让程序执行一个次数较长的空循环就可以实现延时功能。

四、代码

实现较为简单,直接看代码就可以了(需要运行Debug模式下产生的代码):

12345678910111213141516171819202122232425#include intmain(void){/* PIO控制器直接控制PA0引脚 */PIOA->PIO_PER = (uint32_t)0x01;/* PA0输出使能 */PIOA->PIO_OER = (uint32_t)0x01;/* PA0输出写使能 */PIOA->PIO_OWER = (uint32_t)0x01;while(1) {/* 设置PA0引脚为高电平,灯灭 */PIOA->PIO_SODR = (uint32_t)0x01;/* 延迟 */for(inti=0; i<1024*1024*2; ++i);/* 设置PA0引脚为高电平,灯亮 */PIOA->PIO_CODR = (uint32_t)0x01;for(inti=0; i<1024*1024*2; ++i);}return0;}

五、编译器优化的副作用

上面的示例代码中,通过空循环实现延迟的语句出现了两次。很自然的会想到要将这些语句提出成一个函数,甚至可以使用一个参数来大致控制延迟时间的长短:

1234voidDelay(intnum){for(inti = 0; i < 1024 * 1024 * num; ++i );}

然后试着通过这个函数来进行延迟。很遗憾,再运行程序时我们发现LED会一直亮着,而不会闪烁。即使是在Debug模式下,编译器也把这个函数调用给优化掉。类似的情况也会出现不少,这给我们对程序的调试造成一定的不便。原因是Atmel Studio默认的Debug配置中,使用了O1级别的优化,可以在项目属性中关闭它。

我们试着使用宏来实现这个“函数”:

1234#define Delay(num) do{ for(inti = 0; i < 1024 * 1024 * (num); ++i ); }while(0)

再运行一下,很好,LED又开始闪烁了。

程序发布的时候,我们一般会使用Release模式生成代码。Atmel Studio使用的gcc编译器果然“不负众望”,把这个空循环语句直接优化掉了。

我们可以使用如下语句阻止编译器的优化:

12for(inti = 0; i < 1024 * 1024 * num; ++i )asm ("");

或者使用volatile关键字:

1for(volatileinti = 0; i < 1024 * 1024 * num; ++i ) ;


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

特朗普集团近日取消了其新推出的T1智能手机“将在美国制造”的宣传标语,此举源于外界对这款手机能否以当前定价在美国本土生产的质疑。

关键字: 特朗普 苹果 AI

美国总统特朗普在公开场合表示,他已要求苹果公司CEO蒂姆·库克停止在印度建厂,矛头直指该公司生产多元化的计划。

关键字: 特朗普 苹果 AI

4月10日消息,据媒体报道,美国总统特朗普宣布,美国对部分贸易伙伴暂停90天执行新关税政策,同时对中国的关税提高到125%,该消息公布后苹果股价飙升了15%。这次反弹使苹果市值增加了4000多亿美元,目前苹果市值接近3万...

关键字: 特朗普 AI 人工智能 特斯拉

3月25日消息,据报道,当地时间3月20日,美国总统特朗普在社交媒体平台“真实社交”上发文写道:“那些被抓到破坏特斯拉的人,将有很大可能被判入狱长达20年,这包括资助(破坏特斯拉汽车)者,我们正在寻找你。”

关键字: 特朗普 AI 人工智能 特斯拉

1月22日消息,刚刚,新任美国总统特朗普放出重磅消息,将全力支持美国AI发展。

关键字: 特朗普 AI 人工智能

特朗普先生有两件事一定会载入史册,一个是筑墙,一个是挖坑。在美墨边境筑墙的口号确保边境安全,降低因非法移民引起的犯罪率过高问题;在中美科技产业之间挖坑的口号也是安全,美国企业不得使用对美国国家安全构成威胁的电信设备,总统...

关键字: 特朗普 孤立主义 科技产业

据路透社1月17日消息显示,知情人士透露,特朗普已通知英特尔、铠侠在内的几家华为供应商,将要撤销其对华为的出货的部分许可证,同时将拒绝其他数十个向华为供货的申请。据透露,共有4家公司的8份许可被撤销。另外,相关公司收到撤...

关键字: 华为 芯片 特朗普

曾在2018年时被美国总统特朗普称作“世界第八奇迹”的富士康集团在美国威斯康星州投资建设的LCD显示屏工厂项目,如今却因为富士康将项目大幅缩水并拒绝签订新的合同而陷入了僵局。这也导致富士康无法从当地政府那里获得约40亿美...

关键字: 特朗普 富士康

今年5月,因自己发布的推文被贴上“无确凿依据”标签而与推特发生激烈争执后,美国总统特朗普签署了一项行政令,下令要求重审《通信规范法》第230条。

关键字: 谷歌 facebook 特朗普

众所周知,寄往白宫的所有邮件在到达白宫之前都会在他地进行分类和筛选。9月19日,根据美国相关执法官员的通报,本周早些时候,执法人员截获了一个寄给特朗普总统的包裹,该包裹内包含蓖麻毒蛋白。

关键字: 美国 白宫 特朗普
关闭