串口,这个对于大家学过MCU的人来说,都不陌生。在ATSAM4L这个系列的单片机上的串口是。普通MCU的串口是是通用异步收发器,简称UART,全称是Universal Asynchronous Receiver/Transmitter,而在ATSAM4L单片机中的串口是是通用同步和异步收发器,简称USART,全称是Universal Synchronous Asynchronous Receiver/Transmitter。 关于串口的基本知识请大家自行百度了。 下面,我来教大家怎样使用ATSAM4L的USART模块。 我是在之前自己新建的模板基础上添加的,用的是库函数。 这次使用了两个函数新的函数,ioport_set_pin_mode(xx,xx),ioport_disable_pin(xx,xx); 还要增加4个文件,write.c和read.c,usart.c和usart.h文件。把write.c,read.c和usart.c文件放到LIB->src文件夹中,usart.h放在LIB->inc文件夹中,大家也可以放到别的文件夹,我建议是分类
现在我来说说该怎样配置usart模块吧,我这次是用usart1模块。 我们的步奏是: (1)打开IO口外设的时钟 (2)设置IO为usart口复用 (3)设置usart (4)用户功能实现 首先打开IO口外设的时钟是用arch_ioport_init()函数,不打开时钟外设是工作不了的,这个大家要注意一下。 接着设置IO为usart口复用,这里要用到ioport_set_pin_mode(xx,xx),ioport_disable_pin(xx,xx); 这两个函数,第一个函数是设定IO的模式,第二个函数是打开复用功能。笔者我粗心,一开始没注意打开外设复用,导致串口不能工作。我放出ioport_disable_pin的底层吧,如图:
这个在手册能查到它是打开外设功能的作用,如图:
当这个GPER位写0就代表打开外设功能。 接下来就是串口的参数设置了,我就贴上函数了: - static void configure_console(void)
- {
- #if 0
- const usart_serial_options_t uart_serial_options = {
- .baudrate = CONF_UART_BAUDRATE,
- #ifdef CONF_UART_CHAR_LENGTH
- .charlength = CONF_UART_CHAR_LENGTH,
- #endif
- .paritytype = CONF_UART_PARITY,
- #ifdef CONF_UART_STOP_BITS
- .stopbits = CONF_UART_STOP_BITS,
- #endif
- };
- #else
- usart_serial_options_t uart_serial_options;
- uart_serial_options.baudrate = CONF_UART_BAUDRATE;
- uart_serial_options.charlength = CONF_UART_CHAR_LENGTH;
- uart_serial_options.paritytype = CONF_UART_PARITY;
- uart_serial_options.stopbits = CONF_UART_STOP_BITS;
- #endif
- /* Configure console UART. */
- stdio_serial_init(CONF_UART, &uart_serial_options);
- }
复制代码上面有两种的串口初始化的方式,我用条件编译把他们区分开来,两种初始化的方式实现效果都是一样的。一些参数的宏定义是: /** USART Interface */ #define CONF_UART USART1 /** Baudrate setting */ #define CONF_UART_BAUDRATE 115200 /** Character length setting */ #define CONF_UART_CHAR_LENGTH US_MR_CHRL_8_BIT /** Parity setting */ #define CONF_UART_PARITY US_MR_PAR_NO /** Stop bits setting */ #define CONF_UART_STOP_BITS US_MR_NBSTOP_1_BIT 做好这些工作后,就可以开始用个printf函数打印了,我就贴上主函数的代码了: - int main()
- {
- sysclk_init();
- arch_ioport_init();
- ioport_set_pin_dir(PIN_PC07, IOPORT_DIR_OUTPUT);
- ioport_set_pin_level(PIN_PC07, IOPORT_PIN_LEVEL_LOW);
-
-
- ioport_set_pin_mode(PIN_PC26A_USART1_RXD, MUX_PC26A_USART1_RXD);
- ioport_disable_pin(PIN_PC26A_USART1_RXD);
- ioport_set_pin_mode(PIN_PC27A_USART1_TXD, MUX_PC27A_USART1_TXD);
- ioport_disable_pin(PIN_PC27A_USART1_TXD);
-
- configure_console();
- while (1)
- {
- //printf("\r\n\r\n-- GPIO interrupt and event example --\r\n");
- printf("\r\n\r\n-- 爱板越办越火 --\r\n");
- printf("\r\n\r\n-- 爱板越办越火 --\r\n");
- }
-
- }
复制代码功能就是不断打印"爱板越办越火"的信息。 套件的串口接线如图:
串口打印的信息:
下面放出我的工程文件:
串口.zip
(856.63 KB, 下载次数: 5)
|