UART编程指南示例配置控制器功能本示例配置字符帧、波特率、FIFO触发水平、接收器超时机制并使能控制器。所有这些步骤在复位后都是必需的但在控制器使能与禁用之间则不必重复执行。配置 UART 字符帧。uart.mode_reg0 写入 0x0000_0020a.禁止时钟预分频器UART_REF_CLK/8[CLKS] 0b. 选择8位字符长度[CHRL] 00c. 选择无奇偶校验[PAR] 100d. 选择1个停止位[NBSTOP] 00e. 选择正常通道模式模式开关[CHMODE] 00配置波特率。写入三个寄存器uart.Control_reg0、uart.Baud_rate_gen_reg0 和 uart.Baud_rate_divider_reg0。a. 禁止接收通路设置 uart.Control_reg0 [RXEN] 0 和 [RXDIS] 1。b. 禁止发送通路设置 uart.Control_reg0 [TXEN] 0 和 [TXDIS] 1。c. 将计算得到的CD值写入 uart.Baud_rate_gen_reg0 [CD] 位字段。d. 将计算得到的BDIV值写入 uart.Baud_rate_divider_reg0 [BDIV] 位字段。e. 复位发送和接收通路uart.Control_reg0 [TXRST] 和 [RXRST] 1。这些位自清零。f. 使能接收通路设置 [RXEN] 1 和 [RXDIS] 0。g. 使能发送通路设置 [TXEN] 1 和 [TXDIS] 0。设置 RxFIFO触发水平。将触发水平写入 uart.Rcvr_FIFO_trigger_level0 寄存器。选项 a使能 Rx 触发水平。向 [RTRIG] 位字段写入 1 到 63 之间的值。选项 b禁用 Rx 触发水平。向 [RTRIG] 位字段写入 0。使能控制器。向 uart.Control_reg0 寄存器写入 0x0000_0117。a. 复位发送和接收通路uart.Control_reg0 [TXRST] 和 [RXRST] 1。这些位自清零。b. 使能接收通路[RXEN] 1 和 [RXDIS] 0。c. 使能发送通路[TXEN] 1 和 [TXDIS] 0。d. 重启接收器超时计数器[RSTTO] 1。e. 不开始发送 break 信号[STTBRK] 0。f. 停止 break 发送[STPBRK] 1。编程接收器超时机制。将超时值写入 uart.Rcvr_timeout_reg0 寄存器。a. 要使能超时机制向 [RTO] 位字段写入 1 到 255 之间的值。注意原文写的是 [RSTTO]但根据前面章节 Rcvr_timeout_reg0 的位字段应为 [RTO]此处按合理逻辑修正为 [RTO]b. 要禁用超时机制向 [RTO] 位字段写入 0。发送数据软件可以使用轮询或中断方式控制数据流向 TxFIFO 和 RxFIFO。注意当TxFIFO空状态为真时软件可以一次性写入64字节TxFIFO的大小而无需检查TxFIFO状态。实际上当发送器处于活动状态时软件可以写入超过64字节的数据因为在软件向TxFIFO写入数据的同时控制器正在取出数据并将其串行化到TxD信号上。示例使用轮询方法发送数据在本示例中软件可以选择持续填充 TxFIFO 直到满状态位置位或者等待 TxFIFO变空然后写入最多64字节。当 TxFIFO几乎满时软件始终可以写入一个字节。检查 TxFIFO 是否为空。等待直到 uart.Channel_sts_reg0[TEMPTY] 1。向 TxFIFO 填充数据。向 uart.TX_RX_FIFO0 寄存器写入64字节数据。向 TxFIFO 写入更多数据。有两种方法选项A检查 TxFIFO 是否有空间再写入一个字节的数据即 TxFIFO 未满读取 uart.Channel_sts_reg0[TFUL] 直到其等于 0。当[TFUL] 0 时向 TxFIFO 写入一个字节的数据然后再次读取 [TFUL]。选项B等待 TxFIFO 变空。读取 uart.Channel_sts_reg0[TEMPTY] 直到其等于 1然后转到步骤 2再次向 TxFIFO 填充 64 字节数据。示例使用中断方法发送数据本示例首先以与轮询方法类似的方式填充 TxFIFO。然后软件使能 TxFIFO空中断以提醒软件再次填充 TxFIFO。禁用TxFIFO空中断。向 uart.Intrpt_dis_reg0[TEMPTY] 写入 1。向 TxFIFO填充数据。向 uart.TX_RX_FIFO0 寄存器写入 64 字节数据。检查 TxFIFO 是否有空间再写入一个字节的数据即 TxFIFO 未满读取 uart.Channel_sts_reg0[TFUL] 直到其等于 0。当 [TFUL] 0 时向 TxFIFO 写入一个字节的数据然后再次读取 [TFUL]。重复步骤 2 和 3。重复直到 uart.Channel_sts_reg0[TFUL]未被置位。使能中断。向 uart.Intrpt_en_reg0[TEMPTY] 写入 1 以使能中断。等待 TxFIFO 变空。当 uart.Channel_int_sts_reg0[TEMPTY] 被置为 1 时从步骤 1 开始重复。接收数据示例使用轮询方法接收数据等待 RxFIFO 填充至触发水平。检查 uart.Channel_sts_reg0[RTRIG] 1 或 uart.Chnl_int_sts_reg0[TIMEOUT] 1。从 RxFIFO读取数据。从 uart.TX_RX_FIFO0 寄存器读取数据。重复步骤 2直到 FIFO 为空。检查 uart.Channel_sts_reg0[REMPTY] 1。若接收超时中断状态位置位则清除。向 Chnl_int_sts_reg0[TIMEOUT] 写入 1。示例使用中断方法接收数据使能中断。向 uart.Intrpt_en_reg0[TIMEOUT] 和 uart.Intrpt_en_reg0[RTRIG] 各写入 1。等待 RxFIFO 填充至触发水平或发生接收超时。检查 uart.Chnl_int_sts_reg0[RTRIG] 1 或 uart.Chnl_int_sts_reg0[TIMEOUT] 1。从 RxFIFO 读取数据。从uart.TX_RX_FIFO0寄存器读取数据。重复步骤 2 和 3直到 FIFO为空。检查 uart.Channel_sts_reg0[REMPTY] 1。若中断状态位置位则清除。向 Chnl_int_sts_reg0[TIMEOUT] 或 Chnl_int_sts_reg0[RTRIG] 写入 1。RxFIFO触发水平中断示例设置RxFIFO触发水平并使能中断Intrpt_en_reg0 寄存器的各位用于使能中断掩码Intrpt_dis_reg0 寄存器的各位用于强制禁用中断。每对位应互斥设置即一个寄存器的对应位为 1另一个寄存器的对应位为 0Intrpt_en_reg0只写。使能中断位。Intrpt_dis_reg0只写。强制禁用中断位。编程触发水平。写入 6 位字段 uart.Rcvr_FIFO_trigger_level0[RTRIG]。使能RTRIG中断。设置使能位清除禁用位并验证掩码值a.设置uart.Intrpt_en_reg0[RTRIG] 1。b.清除uart.Intrpt_dis_reg0[RTRIG] 0。c.回读uart.intrpt_mask_reg0[RTRIG] 1中断已使能。禁用RTRIG中断。设置禁用位清除使能位并验证掩码值a.设置uart.Intrpt_dis_reg0[RTRIG] 1。b.清除uart.Intrpt_en_reg0[RTRIG] 0。c.回读uart.intrpt_mask_reg0[RTRIG] 0中断已禁用。清除RTRIG中断。向 uart.Intrpt_dis_reg0[RTRIG] 位字段写入 1。当某个中断的使能位和禁用位同时被置位时该中断被禁用。中断使能/禁用机制的状态可通过读取 uart.Intrpt_mask_reg0 寄存器来确定。若掩码位 1则表示中断已使能。UART寄存器总览功能uart.寄存器名称说明配置Control_reg0配置模式和波特率mode_reg0Baud_rate_gen_reg0Baud_rate_divider_reg0中断处理Intrpt_en_reg0使能/禁用中断掩码、通道中断状态、通道状态Intrpt_dis_reg0Intrpt_mask_reg0Chnl_int_sts_reg0Channel_sts_reg0接收和发送数据TX_RX_FIFO0读取已接收的数据写入待发送的数据接收器Rcvr_timeout_reg0配置接收器超时和RxFIFO触发水平值Rcvr_FIFO_trigger_level0发送器Tx_FIFO_trigger_level0配置TxFIFO触发水平值调制解调器Modem_ctrl_reg0配置类似调制解调器的应用Modem_sts_reg0Flow_delay_reg0
ZYNQ学习笔记2-ZYNQ的UART控制器2
UART编程指南示例配置控制器功能本示例配置字符帧、波特率、FIFO触发水平、接收器超时机制并使能控制器。所有这些步骤在复位后都是必需的但在控制器使能与禁用之间则不必重复执行。配置 UART 字符帧。uart.mode_reg0 写入 0x0000_0020a.禁止时钟预分频器UART_REF_CLK/8[CLKS] 0b. 选择8位字符长度[CHRL] 00c. 选择无奇偶校验[PAR] 100d. 选择1个停止位[NBSTOP] 00e. 选择正常通道模式模式开关[CHMODE] 00配置波特率。写入三个寄存器uart.Control_reg0、uart.Baud_rate_gen_reg0 和 uart.Baud_rate_divider_reg0。a. 禁止接收通路设置 uart.Control_reg0 [RXEN] 0 和 [RXDIS] 1。b. 禁止发送通路设置 uart.Control_reg0 [TXEN] 0 和 [TXDIS] 1。c. 将计算得到的CD值写入 uart.Baud_rate_gen_reg0 [CD] 位字段。d. 将计算得到的BDIV值写入 uart.Baud_rate_divider_reg0 [BDIV] 位字段。e. 复位发送和接收通路uart.Control_reg0 [TXRST] 和 [RXRST] 1。这些位自清零。f. 使能接收通路设置 [RXEN] 1 和 [RXDIS] 0。g. 使能发送通路设置 [TXEN] 1 和 [TXDIS] 0。设置 RxFIFO触发水平。将触发水平写入 uart.Rcvr_FIFO_trigger_level0 寄存器。选项 a使能 Rx 触发水平。向 [RTRIG] 位字段写入 1 到 63 之间的值。选项 b禁用 Rx 触发水平。向 [RTRIG] 位字段写入 0。使能控制器。向 uart.Control_reg0 寄存器写入 0x0000_0117。a. 复位发送和接收通路uart.Control_reg0 [TXRST] 和 [RXRST] 1。这些位自清零。b. 使能接收通路[RXEN] 1 和 [RXDIS] 0。c. 使能发送通路[TXEN] 1 和 [TXDIS] 0。d. 重启接收器超时计数器[RSTTO] 1。e. 不开始发送 break 信号[STTBRK] 0。f. 停止 break 发送[STPBRK] 1。编程接收器超时机制。将超时值写入 uart.Rcvr_timeout_reg0 寄存器。a. 要使能超时机制向 [RTO] 位字段写入 1 到 255 之间的值。注意原文写的是 [RSTTO]但根据前面章节 Rcvr_timeout_reg0 的位字段应为 [RTO]此处按合理逻辑修正为 [RTO]b. 要禁用超时机制向 [RTO] 位字段写入 0。发送数据软件可以使用轮询或中断方式控制数据流向 TxFIFO 和 RxFIFO。注意当TxFIFO空状态为真时软件可以一次性写入64字节TxFIFO的大小而无需检查TxFIFO状态。实际上当发送器处于活动状态时软件可以写入超过64字节的数据因为在软件向TxFIFO写入数据的同时控制器正在取出数据并将其串行化到TxD信号上。示例使用轮询方法发送数据在本示例中软件可以选择持续填充 TxFIFO 直到满状态位置位或者等待 TxFIFO变空然后写入最多64字节。当 TxFIFO几乎满时软件始终可以写入一个字节。检查 TxFIFO 是否为空。等待直到 uart.Channel_sts_reg0[TEMPTY] 1。向 TxFIFO 填充数据。向 uart.TX_RX_FIFO0 寄存器写入64字节数据。向 TxFIFO 写入更多数据。有两种方法选项A检查 TxFIFO 是否有空间再写入一个字节的数据即 TxFIFO 未满读取 uart.Channel_sts_reg0[TFUL] 直到其等于 0。当[TFUL] 0 时向 TxFIFO 写入一个字节的数据然后再次读取 [TFUL]。选项B等待 TxFIFO 变空。读取 uart.Channel_sts_reg0[TEMPTY] 直到其等于 1然后转到步骤 2再次向 TxFIFO 填充 64 字节数据。示例使用中断方法发送数据本示例首先以与轮询方法类似的方式填充 TxFIFO。然后软件使能 TxFIFO空中断以提醒软件再次填充 TxFIFO。禁用TxFIFO空中断。向 uart.Intrpt_dis_reg0[TEMPTY] 写入 1。向 TxFIFO填充数据。向 uart.TX_RX_FIFO0 寄存器写入 64 字节数据。检查 TxFIFO 是否有空间再写入一个字节的数据即 TxFIFO 未满读取 uart.Channel_sts_reg0[TFUL] 直到其等于 0。当 [TFUL] 0 时向 TxFIFO 写入一个字节的数据然后再次读取 [TFUL]。重复步骤 2 和 3。重复直到 uart.Channel_sts_reg0[TFUL]未被置位。使能中断。向 uart.Intrpt_en_reg0[TEMPTY] 写入 1 以使能中断。等待 TxFIFO 变空。当 uart.Channel_int_sts_reg0[TEMPTY] 被置为 1 时从步骤 1 开始重复。接收数据示例使用轮询方法接收数据等待 RxFIFO 填充至触发水平。检查 uart.Channel_sts_reg0[RTRIG] 1 或 uart.Chnl_int_sts_reg0[TIMEOUT] 1。从 RxFIFO读取数据。从 uart.TX_RX_FIFO0 寄存器读取数据。重复步骤 2直到 FIFO 为空。检查 uart.Channel_sts_reg0[REMPTY] 1。若接收超时中断状态位置位则清除。向 Chnl_int_sts_reg0[TIMEOUT] 写入 1。示例使用中断方法接收数据使能中断。向 uart.Intrpt_en_reg0[TIMEOUT] 和 uart.Intrpt_en_reg0[RTRIG] 各写入 1。等待 RxFIFO 填充至触发水平或发生接收超时。检查 uart.Chnl_int_sts_reg0[RTRIG] 1 或 uart.Chnl_int_sts_reg0[TIMEOUT] 1。从 RxFIFO 读取数据。从uart.TX_RX_FIFO0寄存器读取数据。重复步骤 2 和 3直到 FIFO为空。检查 uart.Channel_sts_reg0[REMPTY] 1。若中断状态位置位则清除。向 Chnl_int_sts_reg0[TIMEOUT] 或 Chnl_int_sts_reg0[RTRIG] 写入 1。RxFIFO触发水平中断示例设置RxFIFO触发水平并使能中断Intrpt_en_reg0 寄存器的各位用于使能中断掩码Intrpt_dis_reg0 寄存器的各位用于强制禁用中断。每对位应互斥设置即一个寄存器的对应位为 1另一个寄存器的对应位为 0Intrpt_en_reg0只写。使能中断位。Intrpt_dis_reg0只写。强制禁用中断位。编程触发水平。写入 6 位字段 uart.Rcvr_FIFO_trigger_level0[RTRIG]。使能RTRIG中断。设置使能位清除禁用位并验证掩码值a.设置uart.Intrpt_en_reg0[RTRIG] 1。b.清除uart.Intrpt_dis_reg0[RTRIG] 0。c.回读uart.intrpt_mask_reg0[RTRIG] 1中断已使能。禁用RTRIG中断。设置禁用位清除使能位并验证掩码值a.设置uart.Intrpt_dis_reg0[RTRIG] 1。b.清除uart.Intrpt_en_reg0[RTRIG] 0。c.回读uart.intrpt_mask_reg0[RTRIG] 0中断已禁用。清除RTRIG中断。向 uart.Intrpt_dis_reg0[RTRIG] 位字段写入 1。当某个中断的使能位和禁用位同时被置位时该中断被禁用。中断使能/禁用机制的状态可通过读取 uart.Intrpt_mask_reg0 寄存器来确定。若掩码位 1则表示中断已使能。UART寄存器总览功能uart.寄存器名称说明配置Control_reg0配置模式和波特率mode_reg0Baud_rate_gen_reg0Baud_rate_divider_reg0中断处理Intrpt_en_reg0使能/禁用中断掩码、通道中断状态、通道状态Intrpt_dis_reg0Intrpt_mask_reg0Chnl_int_sts_reg0Channel_sts_reg0接收和发送数据TX_RX_FIFO0读取已接收的数据写入待发送的数据接收器Rcvr_timeout_reg0配置接收器超时和RxFIFO触发水平值Rcvr_FIFO_trigger_level0发送器Tx_FIFO_trigger_level0配置TxFIFO触发水平值调制解调器Modem_ctrl_reg0配置类似调制解调器的应用Modem_sts_reg0Flow_delay_reg0