本帖最后由 le062 于 2014-9-17 23:57 编辑
在AM335X_StarterWare_02_00_01_01中就有一个操作LED的demo,不过它的工程是使用了预编译好的几个底层库,如下:
下面,将重建一个工程,把这几个库中源码导入,一起编译,实现一个流水灯。
建立新工程后,将上图中几个例程的源码导入,在main函数中简单调用gpio的操作函数,编译,发现drivers下几个c文件编译失败,可以将这几个文件注释掉(暂时用不到);还有在system下的汇编文件有几条关于NEON的指令报错,这儿需要将编译选项中的--neon勾选,重新编译通过。
在调试过程中遇到过几种问题: 1:调试器无法链接,这个问题一般通过调试器配置页面下的TEST CONNECTION进行连接测试 2:我们跑的程序默认需要加载到ddr中运行,所以需要通过一个脚本进行相关初始化。需要如下配置a8核,至于m3核,直接bypassed。
3:在脚本运行完成后报如下错误:
这个具体原因不清楚,解决方法是不要让bbb在上电时进入linux,比如在uboot中stop autoboot。
然后,基本上就可以跑起来了,当然整个过程相对于一般单片机繁琐了很多。
Main.c代码 和st的差不多吧。 - #include "soc_AM335x.h"
- #include "beaglebone.h"
- #include "gpio_v2.h"
- #define GPIO_INSTANCE_ADDRESS (SOC_GPIO_1_REGS)
- #define GPIO_INSTANCE_PIN_NUMBER (23)
- static void Delay(volatile unsigned int count)
- {
- while(count--);
- }
- int main()
- {
- GPIO1ModuleClkConfig();
- GPIOModuleEnable(GPIO_INSTANCE_ADDRESS);
- GPIOModuleReset(GPIO_INSTANCE_ADDRESS);
- GPIODirModeSet(GPIO_INSTANCE_ADDRESS,
- GPIO_INSTANCE_PIN_NUMBER,
- GPIO_DIR_OUTPUT);
- GPIODirModeSet(GPIO_INSTANCE_ADDRESS,
- 21,
- GPIO_DIR_OUTPUT);
- GPIODirModeSet(GPIO_INSTANCE_ADDRESS,
- 22,
- GPIO_DIR_OUTPUT);
- GPIODirModeSet(GPIO_INSTANCE_ADDRESS,
- 24,
- GPIO_DIR_OUTPUT);
- while(1)
- {
- GPIOPinWrite(GPIO_INSTANCE_ADDRESS,
- 24,
- GPIO_PIN_LOW);
- GPIOPinWrite(GPIO_INSTANCE_ADDRESS,
- 21,
- GPIO_PIN_HIGH);
- Delay(0x7FFFF);
- GPIOPinWrite(GPIO_INSTANCE_ADDRESS,
- 21,
- GPIO_PIN_LOW);
- GPIOPinWrite(GPIO_INSTANCE_ADDRESS,
- 22,
- GPIO_PIN_HIGH);
- Delay(0x7FFFF);
- GPIOPinWrite(GPIO_INSTANCE_ADDRESS,
- 22,
- GPIO_PIN_LOW);
- GPIOPinWrite(GPIO_INSTANCE_ADDRESS,
- 23,
- GPIO_PIN_HIGH);
- Delay(0x7FFFF);
- GPIOPinWrite(GPIO_INSTANCE_ADDRESS,
- 23,
- GPIO_PIN_LOW);
- GPIOPinWrite(GPIO_INSTANCE_ADDRESS,
- 24,
- GPIO_PIN_HIGH);
- Delay(0x7FFFF);
- }
- }
附件:工程包,a8初始化脚本(注意工程中位置),两份不错的参考资料
|