在eCos源码包的examples中有一个串口编程的应用例子。针对stm32平台,串口也可以这样应用吗?在eCos的stm32应用中,我们还需要移植或编写串口驱动吗?还是eCos中已有stm32的串口驱动了吗?
带着这些疑问和问题,我们一一来解开这些疑团!
串口驱动
实际上,eCos中已实现了stm32的串口驱动。但eCos中提供的模板(Templates)没有配置为使能。因此,如果我们要在应用程序中使用串口,则需要配置它为使能状态。
串口驱动的配置项名称:ST STM3210E EVAL board,默认值:禁止。
在图形配置工具中,搜索找到这个配置项,然后使能它。如下图所示。
串口驱动配置项的子配置项可根据需要修改(如修改波特率、设备名等),默认情况下,只使能了串口1和串口2的驱动。
串口编程
eCos串口编程也很简单,甚至比linux的还要简单。利用eCos的I/O子系统,可以非常快捷的编写出一个应用示例,就像eCos源码包中examples的serial示例那样。
需要开启eCos的I/O子系统,默认是启用的,如下图所示。
有一点与examples的serial示例不同,那就是指定的设备名不一样了,应该是:”/dev/ser0″。
包含的头文件:
#ifdef CYGPKG_IO_SERIAL # include <pkgconf/io_serial.h> #endif #include <cyg/io/io.h> /* I/O functions */
应用实例:
static void test_thread_(cyg_addrword_t data) { cyg_io_handle_t handle; Cyg_ErrNo err; cyg_uint32 len; char buf[1]; err = cyg_io_lookup("/dev/ser0", &handle); if (ENOERR != err) { diag_printf("Open /dev/ser0 failed!\n"); diag_printf("Please check if enable 'CYGPKG_IO_SERIAL_DEVICES' or not.\n"); return; } diag_printf("%s\n", TEST_HELP_INFO); while(1) { len = sizeof(buf); err = cyg_io_read(handle, buf, &len); if (ENOERR == err) { switch (buf[0]) { case '0': test_gpio_led(); break; case 'h': diag_printf("%s\n", TEST_HELP_INFO); break; default: diag_printf("\n!!!Invalid enter!!!\n\n"); diag_printf("%s\n", TEST_HELP_INFO); break; } } else { diag_printf("Read failed from serial!\n"); } } }
上面的应用例子中:
err = cyg_io_lookup(“/dev/ser0”, &handle),打开串口1设备;err = cyg_io_read(handle, buf, &len),从串口设备读取指定长度的数据。
注:这个示例是我正在编写的测试程序的一部分。有些定义没有给出来,所以直接使用的话,会编译不过。但串口编程应用很简单,就是2步:使用cyg_io_lookup()函数打开串口设备,使用cyg_io_read()或cyg_io_write()函数从串口中读写数据。
串口驱动的配置项名称:ST STM3210E EVAL board,默认值:禁止。
要使能他,请问怎么使能啊,修改cdl,配置界面上没看到可以使能他的项啊