atmel ASF学习笔记

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Atmel asf学习笔记

前言

前一段时间入手了一块Arduino DUE开发板,入手后网上查询资料发现资料很少,并且和很多的模块不兼容,这块板子的IO口只能承受3.3v的电压,如果想使用5v的模块,又要动手做兼容模块。又因为这块板子采用的MCU是SAM3X8E 是一款ARM的主控,就想把它作为cortex M3开发板使用。

环境搭建

开发工具:atmel studio 6.1

烧写工具:bossac.exe

开发工具可以在Atmel官网下载,bossac.exe可以从arduino中提取

建立工程

为了快速上手这块板子,我决定采用atmel的asf框架

创建示例工程,由于在单片机程序开发中,需要通过串口输入输出调试信息,所以首先要实现串口通讯,这里先创建一个串口通讯程序的模板

接下来就ok了

编译通过下载到mcu中

接下来打开串口,查看输出信息

测试通过!

ASF之串口学习

#include

#include "asf.h"//包含了所需要的模块

#include "stdio_serial.h"//串口的出入输出定义

#include "conf_board.h"

#include "conf_clock.h"

#include "conf_example.h"//定义了串口中断入口函数,波特率,串口端口号

/** Size of the receive buffer used by the PDC, in bytes. */

#define BUFFER_SIZE 100 //定义外设DMA控制器缓冲区大小(字节)

/** USART PDC transfer type definition. */

#define PDC_TRANSFER 1 //串口发送类型定义

/** USART FIFO transfer type definition. */

#define BYTE_TRANSFER 0 //串口发送队列类型定义

/** Max buffer number. */

#define MAX_BUF_NUM 1

/** All interrupt mask. */

#define ALL_INTERRUPT_MASK 0xffffffff

/** Timer counter frequency in Hz. */

#define TC_FREQ 1

#define STRING_EOL "\r"

#define STRING_HEADER "-- USART Serial Example --\r\n" \

"-- "BOARD_NAME" --\r\n" \

"-- Compiled: "__DATE__" "__TIME__" --"STRING_EOL

/** Receive buffer. */

static uint8_t gs_puc_buffer[2][BUFFER_SIZE];

/** Next Receive buffer. */

static uint8_t gs_puc_nextbuffer[2][BUFFER_SIZE];

/** Current bytes in buffer. */

static uint32_t gs_ul_size_buffer = BUFFER_SIZE;

/** Current bytes in next buffer. */

static uint32_t gs_ul_size_nextbuffer = BUFFER_SIZE;

/** Byte mode read buffer. */

static uint32_t gs_ul_read_buffer = 0;

/** Current transfer mode. */

static uint8_t gs_uc_trans_mode = PDC_TRANSFER;//

/** Buffer number in use. */

static uint8_t gs_uc_buf_num = 0;

/** PDC data packet. */

pdc_packet_t g_st_packet, g_st_nextpacket;

/** Pointer to PDC register base. */

Pdc *g_p_pdc;

/** Flag of one transfer end. */

static uint8_t g_uc_transend_flag = 0;

/**

* \brief Interrupt handler for USART. Echo the bytes received and start the

* next receive.

*/

void USART_Handler(void)

{

uint32_t ul_status;

/* Read USART Status. */

//函数返回p_usart->US_CSR,USART0的基地址((Usart *)0x40098000U) ,US_CSR 的偏移地址0x0014

//由于c语言为结构体分配的空间是连续的所以很容易实现基地址+偏移地址

ul_status = usart_get_status(BOARD_USART);

//判断当前的传输模式是否为DMA方式

if (gs_uc_trans_mode == PDC_TRANSFER) {

/* Receive buffer is full. */

//? RXBUFF: Reception Buffer Full

//0: The signal Buffer Full from the Receive PDC channel is inactive.

//1: The signal Buffer Full from the Receive PDC channel is active

//在这里默认是1 在这里做与运算只要US_CSR_RXBUFF为1 结果就为真

if (ul_status & US_CSR_RXBUFF) {

/* Disable timer. */

tc_stop(TC0, 0);

/* Echo back buffer. */

//g_st_packet 有两个元素

//1:The pointer to packet data start address. For pointer or next pointer

//2:Size for counter or next counter register (_CR)

g_st_packet.ul_addr =(uint32_t)gs_puc_buffer[gs_uc_buf_num];

相关文档
最新文档