|
串口通讯的应用也是非常广泛的,所以本期给大家介绍一下ADuCM360的串口通讯的编程。因为之前已经把用到的所有库函数“封装”在了一个.h文件中,所以编程就比较方便。首先还是要初始化函数的,代码给大家看一下。
void Uart_Init(){ WdtCfg(T3CON_PRE_DIV1,T3CON_IRQ_EN,T3CON_PD_DIS); ClkDis(CLKDIS_DISSPI0CLK|CLKDIS_DISSPI1CLK|CLKDIS_DISI2CCLK|CLKDIS_DISPWMCLK|CLKDIS_DIST0CLK|CLKDIS_DIST1CLK|CLKDIS_DISDMACLK); ClkCfg(CLK_CD0,CLK_HF,CLKSYSDIV_DIV2EN_DIS,CLK_UCLKCG); ClkSel(CLK_CD7,CLK_CD7,CLK_CD0,CLK_CD7); pADI_GP0->GPCON |= 0x3C; UrtCfg(pADI_UART,B9600,COMLCR_WLS_8BITS,0); UrtIntCfg(pADI_UART,COMIEN_ETBEI|COMIEN_ERBFI); NVIC_EnableIRQ(UART_IRQn); printf("串口已开启\r\n");}初始化函数的前四行之间介绍过了,都是通用的套路,所以这里就不介绍了。来看下一行,这行代码作用是选择CD0作为串口的时钟,确定完串口时钟后要选择串口RX/TX引脚了,因为该芯片具有好几组串口,所以这里选择的的是P0.1和P0.2口。然后对数据传输格式进行配置,选择9600波特率,8位数据位,1位停止位,不设奇偶校验位。然后下一行代码是配置中断,之后就是中断使能语句了。最后我又加了一句输出文本语句,目的是看一下串口是否进行了初始化。对了,这里要调用printf()函数也需要对其进行初始化的,初始化代码和串口的完全一样。另外还需要一个printf的重定向函数。
int fputc(int ch, FILE *f) { while(!TxBufferEmpty); UrtTx(pADI_UART,ch); TxBufferEmpty = 0; return (ch); }这样初始化就完成了,之后再主函数中调用初始化函数就好了。因为我采用了模块化编程,所以两个初始化函数都要调用,不然运行会出错的。 接下来就是串口中断函数的编写了,代码先贴出来,这样比较容易讲解。
void UART_Int_Handler () { volatile unsigned char UART_IntID = 0; UART_IntID= UrtIntSta(pADI_UART); if((UART_IntID & 0x02) == 0x02) { TxBufferEmpty = 1; } if((UART_IntID & 0x4) == 0x4) { Tab[count]=UrtRx(pADI_UART); count++; if(count==3) count=0; }<br>}中断函数就是上面的代码了。简单讲就是判断一下数据是否发送完毕,发送完毕后发送标志位置1,然后是判断一下数据是否接收完毕。将接收到的数据暂存到一个数组中,之后可以根据收到的数据判断回传数据。为此我特地写了一个函数,代码如下。void Text(){ if(Tab[0]==0x01) { printf("show=%d\r\n",0x01); Tab[0]=0x00; Tab[1]=0x00; Tab[2]=0x00; } else if(Tab[0]==0x02) { printf("show=%d\r\n",0x02); Tab[0]=0x00; Tab[1]=0x00; Tab[2]=0x00; }}我相信大家很容易就能理解这个函数,就是根据发送数据的首位进行判断然后进行判断要输出的数据。这个函数要放在主函数的while循环里面。这样所有的准备工作就完成了,编译通过后就可以烧录到开发板中了,一个简单的串口测试程序也就完成了。 |
|