BF706的开发入门,手把手教你(含源码)
作者的话
BF706是ADI的Blackfin处理器之一,具体性能参数可以通过官网去查,我的这个文章,是写给已经准备,或者正在使用BF706的用户看,怎么从0开始进入开发呢?
硬件准备
ADSP-BF760-CORE核心板
AD-HP530ICE仿真器
软件准备
CCES软件
开发说明
- 工程的加载
打开 CCES 软件,选择工作组,点击 OK。(程序需要放在纯英文目录下,默认为下面红框所示)
在空白处点击鼠标右键,点击 Import
Next,选择程序所放置的位置:
导入完成:
仿真器(AD-HP530ICE)连接及工程的编译
首先要将仿真器与 ADSP-BF706-CORE 连接好,仿真器和 ADSP-BF706-CORE 上电鼠标右键点击工程文件夹:
确认之后,选择 Debug,开始编译:
编译完成:
如下图,点击运行,并按开发板上的按键,可以看到 LED 灯的开启,关闭,跑马灯。点击暂停,跑马灯停下来。完成运行操作。
驱动代码说明
硬件实现原理
利用 ADSP-BF706 处理器上的 IO 接口,以及外部中断,通过按键控制 LED 灯的点亮和熄灭,跑马灯功能,学习 ADSP-BF706 处理器 IO 接口输出及中断的使用方法。
测试步骤
1. 将仿真器( ICE)与 ADSP-BF706-CORE 板卡和计算机连接好。
2. 先给 ADSP-BF706-CORE 板卡上电,再为仿真器( ICE)上电。
3. 运行 CCES 软件,选择合适的 BF706 的 session 将仿真器与软件连接。
4. 加载工程文件,编译并全速运行。
测试结果
运行代码后,按下按键,板上的四个 LED 灯会显示不同的状态。
代码呈现
main.c
#include “post_common.h”
#include “adi_initialize.h”
#include <signal.h>
#include “post_debug.h”
#include “pbled_test.h”
#include “timer_isr.h”
#include <services/gpio/adi_gpio.h>
/* firmware version definitions /
#define FIRMWARE_MAJOR_REV 1
#define FIRMWARE_MINOR_REV 3
extern volatile bool g_button_0_pushed;
extern volatile bool g_button_1_pushed;
extern volatile bool g_button_2_pushed;
extern volatile bool g_button_3_pushed;
int main()
{
adi_initComponents();
adi_osal_Init();
/ Initialize Power service /
power_init();
/ display some debug info /
DEBUG_HEADER( "ADSP-BF706-CORE LED-KEY " );
DEBUG_PRINT(“Built on %s, at %s”, DATE, TIME);
DEBUG_PRINT( “\nFirmware version: %d.%d\n\n”, FIRMWARE_MAJOR_REV, FIRMWARE_MINOR_REV );
Init_Timers();
Init_Timer_Interrupts();
Init_LEDs();
Init_PushButtons();
/ loop forever */
while (1)
{
if(g_button_0_pushed == true)
{
g_button_1_pushed = false;
Blink_LED(500);
}
if(g_button_1_pushed == true)
{
g_button_0_pushed = false;
LED_Bar_Reverse(500);
}
if(g_button_2_pushed == true)
{
g_button_0_pushed = false;
g_button_1_pushed = false;
g_button_2_pushed = false;
// DEBUG_HEADER( "KEY is KEY2 " );
adi_gpio_Clear(LED_PORT, LED0_PIN);
adi_gpio_Clear(LED_PORT, LED1_PIN);
adi_gpio_Clear(LED_PORT, LED2_PIN);
adi_gpio_Clear(LED_PORT, LED3_PIN);
}
if(g_button_3_pushed == true)
{
g_button_0_pushed = false;
g_button_1_pushed = false;
g_button_3_pushed = false;
// DEBUG_HEADER( “KEY is KEY3” );
adi_gpio_Set(LED_PORT, LED0_PIN);
adi_gpio_Set(LED_PORT, LED1_PIN);
adi_gpio_Set(LED_PORT, LED2_PIN);
adi_gpio_Set(LED_PORT, LED3_PIN);
}
}
}
PB.C
#include <signal.h>
#include “post_common.h”
#include “post_debug.h”
#include “pbled_test.h”
#include “timer_isr.h”
#include <services/gpio/adi_gpio.h>
#define GPIO_MEMORY_SIZE (ADI_GPIO_CALLBACK_MEM_SIZE*2)
static uint8_t gpioMemory[GPIO_MEMORY_SIZE];
/*******************************************************************
- global variables
******************************************************************/
int g_LEDs[] = {LED3, LED2, LED1, LED0};
volatile bool g_button_0_pushed = false;
volatile bool g_button_1_pushed = false;
volatile bool g_button_2_pushed = false;
volatile bool g_button_3_pushed = false;
/ - pint handler
*/
void pintCallback(ADI_GPIO_PIN_INTERRUPT ePinInt, uint32_t PinIntData, void pCBParam)
{
if (ePinInt == ADI_GPIO_PIN_INTERRUPT_1)
{
/ push button 1 /
if (PinIntData & ADI_GPIO_PIN_7)
{
g_button_0_pushed = true;
// DEBUG_HEADER( “The KEY is KEY0”);
// adi_gpio_Clear(LED_PORT, LED0_PIN);
// adi_gpio_Clear(LED_PORT, LED1_PIN);
// adi_gpio_Clear(LED_PORT, LED2_PIN);
// adi_gpio_Clear(LED_PORT, LED3_PIN);
}
/ push button 1 /
if (PinIntData & ADI_GPIO_PIN_6)
{
g_button_1_pushed = true;
// DEBUG_HEADER( “The KEY is KEY1”);
// adi_gpio_Clear(LED_PORT, LED0_PIN);
// adi_gpio_Set(LED_PORT, LED1_PIN);
// adi_gpio_Clear(LED_PORT, LED2_PIN);
// adi_gpio_Set(LED_PORT, LED3_PIN);
}
if (PinIntData & ADI_GPIO_PIN_5)
{
g_button_2_pushed = true;
// DEBUG_HEADER( “The KEY is KEY2”);
// adi_gpio_Set(LED_PORT, LED0_PIN);
// adi_gpio_Clear(LED_PORT, LED1_PIN);
// adi_gpio_Set(LED_PORT, LED2_PIN);
// adi_gpio_Clear(LED_PORT, LED3_PIN);
}
/ push button 1 */
if (PinIntData & ADI_GPIO_PIN_4)
{
g_button_3_pushed = true;
// DEBUG_HEADER( “The KEY is KEY3”);
// adi_gpio_Set(LED_PORT, LED0_PIN);
// adi_gpio_Set(LED_PORT, LED1_PIN);
// adi_gpio_Set(LED_PORT, LED2_PIN);
// adi_gpio_Set(LED_PORT, LED3_PIN);
}
}
return;
}
/*
- Function: Init_LEDs
- Description: This function configures PORTx for LEDs.
*/
void Init_LEDs(void)
{
adi_gpio_SetDirection(
ADI_GPIO_PORT_C,
ADI_GPIO_PIN_3|ADI_GPIO_PIN_2|ADI_GPIO_PIN_1|ADI_GPIO_PIN_0,
ADI_GPIO_DIRECTION_OUTPUT);
/* PB1 C2 PINT0 */
adi_gpio_EnablePolar(ADI_GPIO_PORT_C,ADI_GPIO_PIN_3|ADI_GPIO_PIN_2|ADI_GPIO_PIN_1|ADI_GPIO_PIN_0,true);
}
/*
- Function: Init_PushButtons
- Description: This function configures PORTB, PORTC and PORTF and interrupts
for push buttons.
/
void Init_PushButtons(void)
{
uint32_t gpioMaxCallbacks;
uint32_t nPortValue = 0;
/ init the GPIO service /
/ init the GPIO service /
ADI_GPIO_RESULT result = adi_gpio_Init(
(void)gpioMemory,
GPIO_MEMORY_SIZE,
&gpioMaxCallbacks);
if((result != ADI_GPIO_SUCCESS) || ( gpioMaxCallbacks < 2 )) return;
/* PB1 C2 PINT0 /
if(adi_gpio_SetDirection(
ADI_GPIO_PORT_C,
ADI_GPIO_PIN_4|ADI_GPIO_PIN_5|ADI_GPIO_PIN_6|ADI_GPIO_PIN_7,
ADI_GPIO_DIRECTION_INPUT) != ADI_GPIO_SUCCESS)
return;
/ set edge sense mode (PORT B is connected to Pin Interrupt 0) /
if( adi_gpio_SetPinIntEdgeSense(
ADI_GPIO_PIN_INTERRUPT_1,
ADI_GPIO_PIN_4|ADI_GPIO_PIN_5|ADI_GPIO_PIN_6|ADI_GPIO_PIN_7,
ADI_GPIO_SENSE_RISING_EDGE) != ADI_GPIO_SUCCESS)
return;
/ register pint 0 callback /
if( adi_gpio_RegisterCallback(
ADI_GPIO_PIN_INTERRUPT_1,
ADI_GPIO_PIN_4|ADI_GPIO_PIN_5|ADI_GPIO_PIN_6|ADI_GPIO_PIN_7,
pintCallback,
(void)0) != ADI_GPIO_SUCCESS)
return;
/* set pin interrupt mask */
if( adi_gpio_EnablePinInterruptMask(
ADI_GPIO_PIN_INTERRUPT_1,
ADI_GPIO_PIN_4|ADI_GPIO_PIN_5|ADI_GPIO_PIN_6|ADI_GPIO_PIN_7,
true) != ADI_GPIO_SUCCESS)
return;
}
/*
- Function: LED_Bar_Reverse
- Description: Display a blinking LED bar in reverse
*/
void LED_Bar_Reverse(const int iSpeed)
{
int n;
for( n = 3; n >= 0; n-- )
{
ClearSet_LED(g_LEDs[n], 3);
Delay(iSpeed);
}
}
/*
- Function: Blink_LED
- Description: Blink various LEDs
*/
void Blink_LED(const int iSpeed)
{
int n;
for( n = 0; n <= 3; n++ )
{
ClearSet_LED(g_LEDs[n], 3);
Delay(iSpeed);
}
}
/*
- Function: ClearSet_LED
- Description: Clear or set a particular LED (NOT A GROUP).
*/
void ClearSet_LED(const int led, const int bState)
{
/* if bState is 0 we clear the LED,if bState is 1 we set the LED,else we toggle the LED */
/* LEDx_PORT and LEDx_PIN defined in pbled_test.h */if( led == LED0 )
{if( 0 == bState ){adi_gpio_Clear(LED_PORT, LED0_PIN);}else if( 1 == bState ){adi_gpio_Set(LED_PORT, LED0_PIN);}else{adi_gpio_Toggle(LED_PORT, LED0_PIN);}
}
if( led == LED1 ){if( 0 == bState ){adi_gpio_Clear(LED_PORT, LED1_PIN);}else if( 1 == bState ){adi_gpio_Set(LED_PORT, LED1_PIN);}else{adi_gpio_Toggle(LED_PORT, LED1_PIN);}}
if( led == LED2 ){if( 0 == bState ){adi_gpio_Clear(LED_PORT, LED2_PIN);}else if( 1 == bState ){adi_gpio_Set(LED_PORT, LED2_PIN);}else{adi_gpio_Toggle(LED_PORT, LED2_PIN);}}
if( led == LED3 ){if( 0 == bState ){adi_gpio_Clear(LED_PORT, LED3_PIN);}else if( 1 == bState ){adi_gpio_Set(LED_PORT, LED3_PIN);}else{adi_gpio_Toggle(LED_PORT, LED3_PIN);}}
}
BF706的开发入门,手把手教你(含源码)相关推荐
- 太强了!Java毕业设计分享—基于Java开发的毕业设计实战项目(含源码+论文)
你的毕业设计做好了吗? 上学是个苦差事,终于要毕业了还要被毕业设计绊一跤,别的专业且不说,计算机软件应用的学生最苦恼了,是不是还在为做毕业设计而烦恼? 以下为各位奉上25套毕业设计的精品,包括选题,论 ...
- 音乐播放器开发实例(可毕设含源码)
一.开发基础 最近很多大学生都快毕业了在整理毕业论文以及毕业作品,其实在大三的时候就可以开始考虑了并且可以提前和自己的导师进行沟通,让自己的作品直接成为论文选题,在国产操作系统上开发一个简易音乐播放器 ...
- 多线程应用---使用WaveOut* API开发AMR音频播放器(含源码下载)
[源代码以及工程实例下载 ] 1. 语音播放API 1.1 waveOutOpen - 打开播放设备 [cpp] view plaincopyprint? MMRESULT waveOutOpen( ...
- 零基础学习嵌入式入门以及项目实战开发【手把手教+国内独家+原创】
零基础学习嵌入式入门以及项目实战开发[手把手教+国内独家+原创] 独家拥有,绝对经典 创 科 之 龙 嵌入式开发经典系列教程 [第一期] 主讲人: ...
- 手把手教你SSM整合开发办公系统(OA)——报销单(含源码)
文章目录 前言 项目展示 技能要求 一.开始前的准备 1.OA系统是什么? 2.人员权利与报销流程 3.数据库设计 4.创建项目及作用说明 5.包与全局变量配置 6.编写过滤器 7.静态资源的复制与请 ...
- java队名,《JavaWeb程序开发入门》课后练习(含答案)
<<JavaWeb程序开发入门>课后练习(含答案)>由会员分享,可在线阅读,更多相关<<JavaWeb程序开发入门>课后练习(含答案)(10页珍藏版)> ...
- 用python画皇冠_【推荐】手把手教你如何用Python画一棵漂亮樱花树含源码
最近给大家整理了一下,挑了一些我觉得不错的代码分享给大家手把手教你如何用Python画一棵漂亮樱花树含源码. 动态生成樱花 效果图(这个是动态的): import turtle as T import ...
- 【嵌入式开发】手把手教你4418/6818开发板屏幕修改 本文转自迅为: http://www.topeetboard.com 开发平台:iTOP-4418/6818开发板 44186818屏幕
[嵌入式开发]手把手教你4418/6818开发板屏幕修改 本文转自迅为: http://www.topeetboard.com 开发平台:iTOP-4418/6818开发板 4418&6818 ...
- Android 开发之手把手教你写 ButterKnife 框架(三)
系列文章目录导读: Android开发之手把手教你写ButterKnife框架(一) Android开发之手把手教你写ButterKnife框架(二) Android开发之手把手教你写ButterKn ...
- Hyperledger Fabric Rest API服务开发教程【含源码】
Hyperledger Fabric Rest API服务开发教程[含源码] Hyperledger Fabric 提供了软件开发包/SDK以帮助开发者访问fabric网络 和部署在网络上的链码,但是 ...
最新文章
- 「自己开发直播」rtmp-nginx-module实现直播状态、观看人数控制
- Linux下编译一个静态链接的程序的注意点
- Spring MVC+Spring +Hibernate配置事务,但是事务不起作用
- Php和Mysql乱码问题
- ajax_异步交互-get/post方式
- kalman滤波器公式的推导
- Golang Java 实现 【将有序数组装换为二叉搜索树】
- rabbitmq php类库,RabbitMQ客户端的PHP库
- python人脸识别系统界面_人脸识别演示界面:python GUI--tkinter实战(1)
- 设计一个具有大纯时延时间的一阶惯性环节的计算机控制系统,具有纯滞后一阶惯性系统计算机控制系统设计.pdf...
- bootice添加黑苹果引导_黑苹果OC(OpenCore)引导升级教程
- 云计算认证哪个好?考什么内容?
- python绘制彩色地震剖面断层解释_地震剖面上的断层分析及相关意义
- 数据集拆分data_spilt
- java用ssm框架开发的空气质量检测系统源码网站实战项目
- 一个简单的CORBA例子
- python视频搬运_拒绝降权!教你用 Python 确保制作的短视频独一无二
- 用matlab求一组数据的分布函数,求任意一组数据的概率密度函数
- Box2D 实现不倒翁效果 绘制扇形
- 仿大逃杀源码_破咒不是您的典型大逃杀