根据已有电路(ch340连接了uart2的两个口),写了一段程序,想实现每次电脑向tm4c发送字符串时,tm4c向电脑发送相应字符串
程序如下,但是电脑发送字符串后,tm4c并没用回复
代码如下
void main()
{
char cThisChar;
// uint32_t ui32Ints;
ROM_SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_XTAL_16MHZ|SYSCTL_USE_OSC|SYSCTL_OSC_MAIN);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
HWREG(GPIO_PORTD_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; //解锁
HWREG(GPIO_PORTD_BASE + GPIO_O_CR) = 0xFF;
ROM_GPIOPinConfigure(GPIO_PD6_U2RX);
ROM_GPIOPinConfigure(GPIO_PD7_U2TX);
ROM_GPIOPinTypeUART(GPIO_PORTD_BASE,GPIO_PIN_6|GPIO_PIN_7);
// ui32Ints = ROM_UARTIntStatus(UART2_BASE, true);
// ROM_UARTIntClear(UART2_BASE, ui32Ints);
ROM_UARTConfigSetExpClk(UART2_BASE,ROM_SysCtlClockGet(),115200,UART_CONFIG_WLEN_8|UART_CONFIG_STOP_ONE|UART_CONFIG_PAR_NONE);
ROM_UARTCharPut(UART2_BASE,'!');
do
{
cThisChar=ROM_UARTCharGet(UART2_BASE);
ROM_UARTCharPut(UART2_BASE,cThisChar);
}while((cThisChar!='\n')&&(cThisChar!='\r'));
}
望前辈帮帮忙!!!谢谢
Hancheng Zhao:
回复 xyz549040622:
解锁位置调整试了下,没有变化,我进行下面修改,将
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
改为
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART2);
修改后电脑可以收到由tm4c发来的‘!’了
但是还是不能显示由电脑发送的字符串
在调试时发现,do while 第一周期cThisChar被赋值为‘/0’
而do while 第二周期 时在
cThisChar=ROM_UARTCharGet(UART2_BASE);
这条语句执行时停止,用电脑向TM4C发送字符依然没有回应。。。卡死在词语处
Hancheng Zhao:
回复 xyz549040622:
下一步我应该怎么调呢
xyz549040622:
回复 Hancheng Zhao:
看来TI对时序的要求果然好严格,必须先使能GPIO,才能继续使能串口外设。
cThisChar=ROM_UARTCharGet(UART2_BASE);
进去里面的函数,看看再哪个寄存器那里停止了。你再看看UART 数据寄存器(UARTDR)中有没有值了,应该是接收出错了,你再试试用UARTCharGet试试,不要用ROM中的函数,我晚上试试这个例子。
Hancheng Zhao:
回复 xyz549040622:
我不会进函数里面运行。。。点步入还是卡死。。。
不过我把ROM_UARTCharGet(UART2_BASE)改成了ROM_UARTCharGetNonbBocking(UART2_BASE);
读到cThisChar的第一值为‘/0’后面全为空,也就是说FIFO里面没有数据了
推断OM_UARTCharGet(UART2_BASE)卡死的原因是等待FIFO中有数
接下来怎么解决好呢???
xyz549040622:
回复 Hancheng Zhao:
没有数据的话,你给TM4发动一个数据实时,然后再读取fifo中的数据是否是你发送的,然后再把这个数据发送出去
Hancheng Zhao:
回复 xyz549040622:
数据实时是什么?
我将后面改成了
do { if(ROM_UARTCharsAvail(UART2_BASE)) { cThisChar=ROM_UARTCharGet(UART2_BASE); ROM_UARTCharPut(UART2_BASE,cThisChar); } }while((cThisChar!='\n')&&(cThisChar!='\r'));
我用电脑每1s发送一个字符,结果if句只有在第一次循环时会进入,FIFO完全没有数~~
数据实时那个怎么弄呀?
xyz549040622:
回复 Hancheng Zhao:
do{
断点1if(ROM_UARTCharsAvail(UART2_BASE)){
断点2cThisChar=ROM_UARTCharGet(UART2_BASE);ROM_UARTCharPut(UART2_BASE,cThisChar);}}while((cThisChar!='\n')&&(cThisChar!='\r'));
断点3
看到了吧,你判断程序停止没反应了,你要判断是在这三个断点的哪个地方停止了,然后才能进一步找到原因
Hancheng Zhao:
回复 xyz549040622:
关于
do{
断点1if(ROM_UARTCharsAvail(UART2_BASE)){
断点2cThisChar=ROM_UARTCharGet(UART2_BASE);ROM_UARTCharPut(UART2_BASE,cThisChar);}}while((cThisChar!='\n')&&(cThisChar!='\r'));
断点3
现象是ROM_UARTCharsAvail(UART2_BASE)恒等于0
原来用ROM_UARTCharGet(UART2_BASE)会在这地方停止。。。因为没有数据。。。
现在的现象是这样的参考图片
这个问题怎么解决呢?谢谢