在工作中接触到了cc2530,并在上面使用contiki系统。以下是使用串口时遇到的坑。
第一个坑。
首先我尝试在contiki做一个串口回显例程。串口输入可以使用printf函数,可串口输入不是使用scanf函数,我查看源代码了好久,才发现只需要在contiki-conf.h中修改一下配置即可使用串口输入功能。
在contiki-conf.h文件中找到如下代码
/* * USARTs: * SmartRF RS232 -> USART0 / Alternative 1 (UART) * SmartRF LCD -> USART1 / Alternative 2 (SPI) */ #define UART_ON_USART 0 #define UART1_CONF_ENABLE 0 #ifndef UART0_CONF_ENABLE #define UART0_CONF_ENABLE 1 #endif #ifndef UART0_CONF_WITH_INPUT #define UART0_CONF_WITH_INPUT 1 #endif #ifndef UART0_CONF_HIGH_SPEED #define UART0_CONF_HIGH_SPEED 0 #endif
第二个坑。
串口输入功能开启了,现在测试一下串口回显,我输入1234567890给cc2530,返回的却是134690,有时候还是1346790。
很奇怪,数字2、5、8都没有回显。
经过仔细排查,我查到了UART0中断函数那里,代码如下:
#if UART0_CONF_WITH_INPUT #ifdef SDCC void uart0_rx_isr(void) __interrupt (URX0_VECTOR) #else #pragma vector=URX0_VECTOR __near_func __interrupt void uart0_rx_isr(void) #endif { ENERGEST_ON(ENERGEST_TYPE_IRQ); leds_toggle(LEDS_YELLOW); URX0IF = 0; if(uart0_input_handler != NULL) { uart0_input_handler(U0DBUF); } ENERGEST_OFF(ENERGEST_TYPE_IRQ); } #endif
void uart0_rx_isr(void) __interrupt (URX0_VECTOR) { ENERGEST_ON(ENERGEST_TYPE_IRQ); leds_toggle(LEDS_YELLOW); URX0IF = 0; if(uart0_input_handler != NULL) { uart0_input_handler(U0DBUF); } ENERGEST_OFF(ENERGEST_TYPE_IRQ); }
以上是使用contiki串口遇到的坑。