void UART_Open(UART0_Type uart, uint32_t baudrate, uint8_t parityoption, uint8_t rxinttriggerlevel){uint32_t volatile delays;if (uart==UART0){//初始化时关闭UART0 IRQNVIC_DisableIRQ(UART0_IRQn);//使能 UART0 时钟SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=1; //enable UART0 PCLKSYSCON->UART0CLKDIV_b.DIV = 0x1; / divided by 1 ///复位 UART0SYSCON->PRESETCTRL_b.UART0_RST_N=0;SYSCON->PRESETCTRL_b.UART0_RST_N=1;} else if (uart==UART1){//初始化时关闭UART1 IRQNVIC_DisableIRQ(UART1_IRQn);//使能 UART1 时钟SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=1; //enable UART1 PCLKSYSCON->UART1CLKDIV_b.DIV = 0x1; / divided by 1 ///复位 UART1SYSCON->PRESETCTRL_b.UART1_RST_N=0;SYSCON->PRESETCTRL_b.UART1_RST_N=1;} else return ;//设置波特率uart->BAUDDIV_b.BAUDDIV = MainClock/baudrate;//设置奇偶校验if (parityoption==UART_ODD_PARITY)uart->CTRL_b.PARISEL=1;if (parityoption!=UART_NO_PARITY)uart->CTRL_b.PARIEN=1;//设置中断触发条件if (rxinttriggerlevel==UART_RX_NOT_EMPTY)uart->CTRL_b.RXNEIE=1;if (rxinttriggerlevel==UART_RX_HALF_FULL)uart->CTRL_b.RXHLFIE=1;if (rxinttriggerlevel==UART_RX_FULL)uart->CTRL_b.RXFIE=1;//使能发送和接收功能uart->CTRL_b.TXEN=1;uart->CTRL_b.RXEN=1;//插入延时SYS_DelaymS(1);//清空 FIFOuart->FIFOCLR=0xFF;return;}
3-2 UART关闭这段函数用来关闭UART0或者UART1,只需要传入需要关闭的串口即可void UART_Close(UART0_Type uart){if (uart==UART0){//关闭UART0_IRQNVIC_DisableIRQ(UART0_IRQn);//关闭UART0时钟SYSCON->SYSAHBCLKCTRL_b.UART0_CLK=0;}else if (uart==UART1){//关闭UART1_IRQNVIC_DisableIRQ(UART1_IRQn);//关闭UART1时钟SYSCON->SYSAHBCLKCTRL_b.UART1_CLK=0;} else return ;//关闭相应UART的中断,并清除中断标志UART_DisableInt(uart);UART_ClearIntFlag(uart);return;}
学习心得23-3 UART读取单个字节这段函数的作用是UART读取单个字节的数据uint8_t UART_ByteRead(UART0_Type uart, uint8_t data){if (uart->STATE_b.RXNE){data=uart->DATA;return 0;} elsereturn 1;}
3-4 UART连续读取多个字节UART连续读取串口数据,直到读取到指定长度的数据void UART_Read(UART0_Type uart, uint8_t rxbuf, uint8_t readbytes){uint8_t temp=0;//get all datawhile ((uart->STATE_b.RXNE)&&((readbytes)--)){rxbuf++=uart->DATA;temp++;}//return number of readreadbytes=temp;return;}
3-5 UART发送单个字节这段函数的作用是UART发送单个字节的数据uint8_t UART_ByteWrite(UART0_Type uart, uint8_t data){if (uart->STATE_b.TXF)return 1;uart->DATA=data;return 0;}
3-6 UART连续发送多个字节UART连续发送串口数据,直到发送完指定长度的数据void UART_Send(UART0_Type uart, uint8_t txbuf, uint32_t sendbytes){while (sendbytes--){while (uart->STATE_b.TXF);uart->DATA=txbuf++;}return;}
3-7 UART发送字符串UART发送一段字符串数据,只需要将要发送的字符串数据首地址传入即可void UART_PutString (UART0_Type uart, uint8_t str){while (!( str=='\0')){while (uart->STATE_b.TXF);uart->DATA=str++;}return;}
3-8 UART使能中断有两个参数项,第一个是选择需要使能的UART,第二个选择触发中断的条件void UART_EnableInt(UART0_Type uart, uint32_t intcon){uart->CTRL |= intcon;return;}
3-9 UART关闭中断调用该函数后,所有的串口的中断触发条件都将关闭void UART_DisableInt(UART0_Type uart){uart->CTRL &= 0xFFFFFF00;return;}
学习心得34、串口中断例程介绍完UART常用的驱动函数,接下来用个小例程来演示下UART的驱动测试程序的功能是:通过串口助手发送一个字节的数据到单片机,单片机收到该数据后,将该数据通过单片机的串口发送到串口助手程序设计思路首先是对UART0端口的初始化,将IO口复用为串口UART0的TX、RX功能随后将UART0初始化为波特率115200,无奇偶校验,接收非空触发中断下一步就是使能UART0的中断,中断触发条件为接收FIFO非空最后使能UART0_IRQn中断服务子程序测试程序的代码如下:int main(void){//UART0 端口初始化PA_2_INIT(PA_2_TX0);PA_3_INIT(PA_3_RX0);//UART0 寄存器初始化UART_Open(UART0,115200,UART_NO_PARITY,UART_RX_NOT_EMPTY);UART_EnableInt(UART0,UART_RX_NOT_EMPTY);NVIC_EnableIRQ(UART0_IRQn);while(1){}}//UART0 中断服务子程序void UART0_IRQHandler(void){uint8_t cdata;//判断中断状态位if (UART0->INTSTATUS_b.RXNEINT ){cdata = UART0->DATA; //将接收到的数据返回UART0->DATA=cdata;}//清除中断状态UART0->INTSTATUS = 0x0F;}
程序调试编写完程序,首先要在编译环境下进行编译、连接没有错误后(最好连警告也没有)就可以实际连接到电路板进行程序调试运行了在实验前需要先确定U转串所使用的的串口号,通过windows的设备管理器中的端口(COM和LPT)查看我们的串口,比如本例中是COM7图8 串口端口号选择接下来打开串口上位机工具,本例使用的是“大傻串口工具”按照程序中设置的串口参数配置好串口端口选择COM7,波特率115200,数据位8位,无奇偶校验,1位停止位最后点击打开串口即可打开后如图所示:图9 串口配置上位机环境配置好之后,接下里就可以下载并仿真程序了首先我们在UART0_IRQ中断子程序中位置打上断点随后全速运行程序图10 仿真界面然后我们在上位机发送一个数据进行测试,例如发送一个字节0x11这时候单片机便会进入串口中断服务程序,并且停止在断点处这时候我们听过watch窗口看到接收的数据,就是0x11图11 数据发送继续单步运行并退出中断服务程序,这时候我们再去看上位机,发现收到了单片机返回的数据图12 数据接收(图片来源网络,侵删)
0 评论