CC2538 UART0的初始化和发送代码
各位大神们好。
经过了一番挣扎,我终于让CC2538的Uart0打印出东西了。
现在将代码上传,欢迎大家下载测试。
请将测试结果及时跟贴回复,以便我修改代码
请一定要仔细阅读代码中的注释!
8117.Uart0Util.h
4263.Uart0Util.c
提供的代码不错;
1、参考HalUARTInitIsr函数,详细阅读注释应该会简单些。
2、TI的万能引脚功能映射,看似完美方案,假如硬件设计错了,可以重新映射接口,照样能用,我就这么干过,^_^。
3、万能引脚映射,但也造成很多人困惑,以为像别的MCU或者MPU,某个引脚固定几个功能,然后分时复用,使用前设定好模式即可,CC2538还要额外设置引脚和功能映射。
4、注释一下:
//映射UART1的TXD引脚,你可以改为UART0,参数二改为IOC_MUX_OUT_SEL_UART0_TXD IOCPinConfigPeriphOutput(GPIO_A_BASE, GPIO_PIN_1, IOC_MUX_OUT_SEL_UART1_TXD); //映射UART1的RXD引脚,可以改为UART0,参数二为IOC_UARTRXD_UART0 IOCPinConfigPeriphInput(GPIO_A_BASE, GPIO_PIN_0, IOC_UARTRXD_UART1); //接下来这两句是映射具体的端口的,这里是PA0和PA1,你可以改为PB1和PB2也是可以的,相信知道base+offset这种寻址方式的人都了解 GPIOPinTypeUARTInput(GPIO_A_BASE, GPIO_PIN_0); GPIOPinTypeUARTOutput(GPIO_A_BASE, GPIO_PIN_1);
当然还有几个地方要注意:
1、搜搜HAL_UART_PORT宏
2、搜搜HAL_UART_SYS_CTRL宏
不好意思,没仔细看你代码,不过看到里面有static的东西,在这种捉襟见肘的MCU上,最好还是能省则省,不要用全局的,恨死XDATA报错了
感谢您的回复。
关于全局变量,代码中只是用了一个全局变量。
之所以用static修饰,是为了限定该变量只在该文件内使用。
ZStack中的uart api有个陷阱
uint8 HalUARTOpenIsr(uint8 port, halUARTCfg_t *config)这个函数用来打开uart,port参数指定是哪个uart
但是这个函数最后调用了UARTEnable(HAL_UART_PORT);
HAL_UART_PORT是一个宏,打开的是UART1。
我发现这个uart api就是给MT定制的,不是给开发者调用的。
对了,请教您一个问题,我的uart打印用的UARTCharPut这个函数
我看uart api里面用的UARTCharPutNonBlocking
我用UARTCharPutNonBlocking发现只打印17个字符就结束了,换成UARTCharPut这个函数就正常了
使用UARTCharPut这个函数会有什么问题吗?
我看这两个函数都没有提供原始代码,所以没办法仔细分析。
1、HalUARTOpenIsr看似指定了port,但是实际上这个参数并没有使用,TI应该是根据具体的UARTEnable来决定使用哪路串口,当然两路串口应该是可以同时工作的,不过一路是DMA,一路是ISR
2、UARTCharPutNonBlocking和UARTCharPut的区别,应该是一个非阻塞,一个阻塞,可能针对不同的应用场景的,非阻塞用于单次小数据量,直接放到缓缓区不需要等发送完成就返回,阻塞,就是等数据全部发完了再返回。
3、如果都提供了代码,这帮FAE就闲着没事干了都得辞掉,这是非技术因素
我已经实现了两路UART串口同时使用,比你的方便很多,链接如下,希望能够帮助更多的人:
CC2538 ZigBee 芯片 两路UART串口同时使用
吐槽一句,TI论坛跟帖不让发超链接,直接把超链接符号弄成灰色,太扯淡了,还得让我用html文本编辑才能添加超链接!