您的位置 首页 主动

SAM4E16E单片机对LED灯的闪耀操控规划

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

现在关于这芯片能参阅的书本大约就只有英文手册了。用的板子是SAM4E16E。IDE用的是Atmel Studio。既然是学习单片机,就没有运用asf结构,而是直接选用拜访寄存器的办法了。

第一个程序便是操控板子上一个LED灯的闪耀了。

一、电路

SAM4E16E单片机对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 ) ;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/zhudong/346395.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部