一、前言

这篇文章主要实现了串口单字节发送、printf格式化发送和通过接收中断接收数据。

用到的工具如下:

IDE:AtmelStudio 7

芯片:ATSAM4LS2C (M4内核,主频48M)

ASF版本:3.47

仿真器:JLink v9

二、串口初始化

2.1 ASF添加USART-Serial interface和Standard serial I/O 模块

2.2 官网找到串口的快速开发指南

https://asf.microchip.com/docs/latest/sam4l/html/serial_quickstart.html

2.3 根据快速指南的说法,通常将配置放在conf_uart_serial.h里

打开conf_uart_serial.h,添加配置代码,我们这里用串口0,波特率9600,数据宽度8位等等,如下:

#define USART_SERIAL                 USART0              //串口0
#define USART_SERIAL_BAUDRATE        9600               //波特率
#define USART_SERIAL_CHAR_LENGTH     US_MR_CHRL_8_BIT   //数据位8位
#define USART_SERIAL_PARITY          US_MR_PAR_NO       //无奇偶校验
#define USART_SERIAL_STOP_BIT        US_MR_NBSTOP_1_BIT //1位停止位#define USART_SERIAL_RX_PIN                PIN_PA11A_USART0_RXD//接收引脚
#define USART_SERIAL_RX_MUX                MUX_PA11A_USART0_RXD//复用Usart0接收#define USART_SERIAL_TX_PIN                PIN_PA12A_USART0_TXD//发送引脚
#define USART_SERIAL_TX_MUX                MUX_PA12A_USART0_TXD//复用Usart0发送

串口0引脚复用PA11和PA12,可以在数据手册里的GPIO功能复用表里查到。

2.4 打开main.c,添加初始化代码,usart_options 变量用到上面定义的配置,串口初始化函数用stdio_serial_init而不是usart_serial_init,这样可以重定向printf。

#include <asf.h>#define NVIC_PriorityGroup_2         ((uint32_t)0x5) /*!< 2 bits for pre-emption priority   2 bits for subpriority */int main (void)
{/* Insert system clock initialization code here (sysclk_init()). */sysclk_init();board_init();delay_init();NVIC_SetPriorityGrouping(NVIC_PriorityGroup_2); //中断分组2 2位抢占,2位响应/* Insert application code here, after the board has been initialized. *///配置TX端口模式ioport_set_pin_mode(USART_SERIAL_TX_PIN, USART_SERIAL_TX_MUX);ioport_disable_pin( USART_SERIAL_TX_PIN);//关闭普通io功能//配置RX端口模式ioport_set_pin_mode( USART_SERIAL_RX_PIN,  USART_SERIAL_RX_MUX);ioport_disable_pin( USART_SERIAL_RX_PIN);//串口配置选项usart_serial_options_t usart_options = {.baudrate = USART_SERIAL_BAUDRATE,     //波特率.charlength = USART_SERIAL_CHAR_LENGTH,   //数据位宽.paritytype = USART_SERIAL_PARITY,       //奇偶校验.stopbits = USART_SERIAL_STOP_BIT};          //停止位//usart_serial_init(USART_SERIAL, &usart_options);//只是初始化串口// 初始化串口,重定向printfstdio_serial_init(USART_SERIAL, &usart_options);//串口0总中断 抢占优先级0,响应优先级0NVIC_SetPriority(USART0_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),0, 0));//使能USART0总中断NVIC_EnableIRQ(USART0_IRQn);//使能串口0接收中断usart_enable_interrupt(USART_SERIAL, US_IER_RXRDY);//使能发送usart_enable_tx(USART_SERIAL);//使能接收usart_enable_rx(USART_SERIAL);while(1){}
}

三、串口发送

3.1 添加发送代码,usart_putchar函数是单字节发送,printf可以格式化打印数据,下载到板上,顺利的话能看到串口发出的数据:

 while(1){usart_putchar(USART_SERIAL,'a');//单字节输出usart_putchar(USART_SERIAL,'\r');usart_putchar(USART_SERIAL,'\n');printf("%s:%0d\r\n","printf输出", 123);//格式化输出delay_ms(500);}

3.2 printf格式化输出浮点数可能会出错,例如代码:

     printf("%0.2f\r\n",12.3f);

会显示f:

到社区搜索一下,原来是工具链里面优化了,变成调用整型输出了。右击工程属性->Toolchain->ARM/GNU C Compiler->Symbols,找到scanf=iscanf和printf=iprintf删除,重新编译再试就可以了。

四、串口接收

4.1 先定义一个接收fifo结构体变量

#define TX_BUFFER_SIZE 128       //发送缓存长度
#define RX_BUFFER_SIZE 128      //接收缓存长度
//串口收发fifo
typedef struct
{//volatile uint16_t  rxcount;                  // 接收计数volatile uint16_t  rxindex;                  // 接收指针volatile uint16_t  rdindex;                  // 读指针volatile uint8_t  txcount;                    // 发送计数volatile uint8_t  txindex;                   // 发送指针volatile uint8_t  wrindex;                   // 写指针volatile uint8_t  txsbuf[TX_BUFFER_SIZE];  // 发送数据缓冲区volatile uint8_t  rxsbuf[RX_BUFFER_SIZE];  // 接收数据缓冲区
} Uart_fifo;Uart_fifo uart_fifo;//

4.2 编写串口0中断函数,初始化串口时使能了接收中断,所以当RXRDY为1时会触发接收中断,获取收到的字符可以用usart_getchar库函数,但是里面有个while,这里我们为了防止未知错误导致死循环,直接读取数据寄存器RHR,并且读完会自动清除RXRDY位,不用手动清除。

//串口0中断函数
void USART0_Handler(void)
{U32 u32_uart_status = usart_get_status(USART_SERIAL);/*-------------------------     接收中断处理   ------------------------------*/if (u32_uart_status & US_CSR_RXRDY)//判断接收标志{//usart_getchar(USART_SERIAL,&uart_fifo.rxsbuf[uart_fifo.rxindex]);uart_fifo.rxsbuf[uart_fifo.rxindex] = (USART0->US_RHR & US_RHR_RXCHR_Msk);//读取数据,会自动清除接收标志if (++uart_fifo.rxindex==RX_BUFFER_SIZE)                       //接收指针到末尾{uart_fifo.rxindex=0;                                         //指针置0,从头开始} if(uart_fifo.rxindex>=3){Rx_Process();//接收处理}}
}

4.3 接收处理,接收到3个字符以上开始判断指令,并回复。

//接收处理
void Rx_Process(void)
{if(uart_fifo.rxsbuf[0]==0xAA && uart_fifo.rxsbuf[1]==0x01 && uart_fifo.rxsbuf[2]==0x01){printf("开灯\r\n");}else if(uart_fifo.rxsbuf[0]==0xAA && uart_fifo.rxsbuf[1]==0x01 && uart_fifo.rxsbuf[2]==0x00){printf("关灯\r\n");}else{printf("错误\r\n");}uart_fifo.rxindex=0;                                        //指针置0,从头开始}

4.4 效果:

AtmelStudio 7 ASF库学习笔记二:串口收发和printf打印相关推荐

  1. AtmelStudio 7 ASF库学习笔记一:新建工程、配置时钟、下载程序和查看官方例程

    一.前言 由于需要学习一下atmel的atsaml 系列,使用AtmelStudio 7开发,之前主要用STM32,现在看到Atmel的库函数,其实是有许多相似之处.ASF3的库对应ST的标准库.AS ...

  2. STM32 HAL库学习笔记1-HAL库简介

    STM32 HAL库学习笔记1-HAL库简介 HAL库 SPL 库 和 HAL 库两者相互独立,互不兼容.几种库的比较如下 目前几种库对不同芯片的支持情况如下 ST 中文官网上有一篇<关于ST库 ...

  3. STM32F407霸天虎HAL库学习笔记——串口发送

    STM32F407霸天虎HAL库学习笔记--串口收发 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil printf重写 main函数 五.实验效果 一.软件准备 软件准备 二.硬件准备 ...

  4. Huggingface Transformers库学习笔记(二):使用Transformers(上)(Using Transformers Part 1)

    前言 本部分是Transformer库的基础部分的上半部分,主要包括任务汇总.模型汇总和数据预处理三方面内容,由于许多模型我也不太了解,所以多为机器翻译得到,错误再所难免,内容仅供参考. Huggin ...

  5. Boost库学习笔记(二)算法模块-C++11标准

    Boost库学习笔记(二)算法模块-C++11标准 一.综述 Boost.Algorithm是一系列人通用推荐算法的集合,虽然有用的通用算法很多,但是为了保证质量和体积,并不会将太多通用算法通过审查测 ...

  6. KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记3——串口Stdio实现

    KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记3--串口Stdio实现 一.介绍 任务目标 二.工程创建 三.软件设计 第一步,BSP构建 1, 添加前面的pll_config文件 2 ...

  7. STM32F407霸天虎HAL库学习笔记——使用ADC采集MQ135的数据并通过OLED显示

    STM32F407霸天虎HAL库学习笔记--使用ADC采集MQ135的数据并通过OLED显示 一.软件准备 二.硬件准备 三.CubeMX配置 四.Keil MQ135.c MQ135.h main函 ...

  8. stm32学习笔记----双串口同时打开时的printf()问题

    stm32学习笔记----双串口同时打开时的printf()问题 最近因为要使用串口2外接PN532芯片实现通信,另一方面,要使用串口1来将一些提示信息输出到上位机,于是重定义了printf(),使其 ...

  9. amazeui学习笔记二(进阶开发4)--JavaScript规范Rules

    amazeui学习笔记二(进阶开发4)--JavaScript规范Rules 一.总结 1.注释规范总原则: As short as possible(如无必要,勿增注释):尽量提高代码本身的清晰性. ...

  10. 项目管理学习笔记二:信息系统服务管理

    项目管理学习笔记二:信息系统服务管理 2010-10-22 09:56:33 标签:信息系统 笔记 项目管理 服务 学习 [推送到技术圈] 版权声明:原创作品,允许转载,转载时请务必以超链接形式标明文 ...

最新文章

  1. 涉及位操作的算法辑录
  2. 读书笔记-我所理解的生活
  3. java未将对象引用设置_未将对象引用到实例怎么解决_常见问题解析,java
  4. mysql基本命令入门
  5. Flask Bind-DLZ + Mysql DNS管理平台
  6. Pytorch《DCGAN模型》
  7. matlab 三维点 边界曲面,不用matlab如何从散点数据绘制极坐标三维曲面图?
  8. yolov5搭建环境_YOLOv5从入门到部署之:训练私有数据并修改模型
  9. 设备 esp32_「ESP 教程」ESP32 如何运行 TensorFlow 模型
  10. centos7 安装nginx
  11. mysql.data已拥有为,MYSQL LOAD DATA INFILE忽略重复行(自动增量作为主键)
  12. pytorch中的 nn.ModuleList 和 nn.Sequential
  13. python selenium爬虫入门案例day04:Vhiphop街舞视频
  14. 深入学习D3JS:d3-array Statistics部分 d3.min, d3.max,d3.extent,d3.sum,d3.scan,d3.ascending,d3.deviation
  15. 【SpringMVC】——图解执行流程
  16. Droid razr xt910 tegra2 地牢猎人2 dungeon hunter2
  17. [锁 Lock] Lock lock = new ReentrantLock()之自增序列号
  18. mac 怎么抓取 iphone 手机 日志
  19. MBTI职业性格测试
  20. C++ PDF文档相关操作

热门文章

  1. 基于GPT2实现考公申论文章生成
  2. 【iOS篇】在iPhone上安装描述文件
  3. 怎么用c语言测试音频文件,如果用c语言程序读取一段音频文件要如何做,具体要调用哪些函数,在网上搜索了半天,乱七八糟的,找不到什么有用的信息...
  4. 如何计算 R 中 T 检验 的 P 值
  5. 联通混改旗开得胜,这也太容易了!
  6. matlab 以10为底的对数
  7. python周环比增长率_Python如何计算环比增长率
  8. 电脑基础知识入门:键盘上的英文,意思和功能汇总!
  9. 三星电脑打开虚拟服务器,三星笔记本进BIOS后怎么开启CPU虚拟化
  10. 哪些软件可以做国外问卷调查