atmel ASF学习笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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];