完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1,配置IO端口,与GPIO通用, ioport_configure_pin(IOPORT_CREATE_PIN(PORTC,3), IOPORT_DIR_OUTPUT |IOPORT_INIT_HIGH); ioport_configure_pin(IOPORT_CREATE_PIN(PORTC,2), IOPORT_DIR_INPUT); 2,初始化串口 |
|
|
|
|
|
在conf_board.h中定义相关的宏定义 #define UART_BAUD 19200 #define USARTC0_SERIAL &USARTC0 #define USARTC0_SERIAL_BAUDRATE UART_BAUD #define USART_SERIAL_CHAR_LENGTH USART_CHSIZE_8BIT_gc #define USART_SERIAL_PARITY USART_PMODE_DISABLED_gc #define USART_SERIAL_STOP_BIT false 结构体USART_SERIAL_OPTIONS定义了串口的基本配置包括波特率、数据位长度、奇偶校验、停止位长度;usart_init_rs232才是真正的开始配置串口参数,如果使用的是Atmel Studio 6.2的开发环境,usart_init_rs232函数是驱动中已经定义好的。所以使用模块驱动可以省很多时间,使产品上市周期大大缩短。这也是我一直使用ATMEL的原因之一。 usart_set_tx_interrupt_level函数是使能发送中断,并设置发送中断优先级; usart_set_rx_interrupt_level函数是使能接收中断,并设置接收中断优先级; 大家看到这里就知道了,我是使用中断来处理发送和接收数据,我一般都习惯使用中断源处理事件,这样能得到及时的处理,也可以减少CPU的占有率。大大提高性能。 接受和发送大家根据实际运用来初始化,如果值使用接收,那么发送中断就不是能,反之,接收中断不使能。如果是使用RS485通信,初始化相同,只需要在收发时注意控制RS485的控制管脚就可以了。 |
|
|
|
|
|
接下来处理中断接收函数:USARTC0的接收中断源是USARTC0_RXC_vect,我们xmega16A4的中断源定义在iox16a4,h中。 ISR(USARTC0_RXC_vect) { uint8_tcTempData; cTempData =USARTC0.DATA; } cTempData 就是定义每次中断接收到的一个字节数据。一般串口通信都有一定得协议,所以在根据协议做出相应处理就可以了。我一般处理的方式是接收到一个完整的帧后,先保存到队列中,然后在处理。 发送中断,其实是发送完成中断,发送完一个字节后,产生一次中断。 所以首先要在应用程序中发送一个数据来触发产生中断,剩下的数据就可以根据中断来发送了,这样就不用等待一个数据的发送完成,从而减少CPU的占有率。 在应用函数中调用下面函数开发发送,SendD为待发送数据缓冲区。 UART_SendOneByteData(&USARTC0,SendD[0]); 函数原型: void UART_SendOneByteData(USART_t*usart,uint8_t c) { (usart)->DATA= c; } 发送完成后产生中断,USARTC0的发送中断源是USARTC0_TXC_vect。 ISR(USARTC0_TXC_vect) { static uint8_tcnt = 0; UART_SendOneByteData(&USARTC0,SendD[usartc0cnt]); } 在中断处理函数中就可以依次完成数据帧的发送了。我这里只是简单的举例。实际项目中根据协议具体做出合理的处理,整体原理是这样的。 |
|
|
|
|
|
下面补充一点常使用的知识,printf重定向。 在很多时候我们需要使用串口打印信息来调试程序及设备运行情况,那么串口输出就需要直接来实现,那么有没有现成的函数可以输出呢?回答是肯定,就是使用标准输出函数printf。 怎么才能在mcu系统中使用printf函数来打印呢,其实很简单,只需要将printf重定向就可以了。增加几行代码就可以实现,比如我们使用xmega的USARTC0来作为调试口。printf输出到串口,需要将fputc里面的输出指向串口(重定向),方法如下: #ifdef __GNUC__ #define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endif PUTCHAR_PROTOTYPE { UART_SendOneByteData(&USARTC0, (uint8_t) ch); while(usart_data_register_is_empty(&USARTC0) == false) { } return ch; } 这样就可以完成按照printf的格式来输出了,使用这样的数据就不需要使能发送中断了。 |
|
|
|
|
|
学习了,谢谢分享
|
|
|
|
|
|
726 浏览 0 评论
777 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
680 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1149 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1120 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11800 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 23:13 , Processed in 0.630324 second(s), Total 74, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号