Nuvoton N76E003的UART线性缓冲区实现与C语言支持

版权申诉
0 下载量 53 浏览量 更新于2024-10-13 收藏 94KB ZIP 举报
资源摘要信息:"Nuvoton N76E003 UART线性缓冲区的实现及C语言的printf支持和可定制内存区域" 本文介绍的资源主要涉及嵌入式开发领域,特别是针对Nuvoton N76E003这一8位微控制器(MCU)的UART(通用异步收发传输器)通信。N76E003是由Nuvoton Technology公司生产的一款基于8051内核的微控制器,具有丰富的外设和较高的性能,广泛应用于工业、家用电器、个人电子产品等领域。本资源为开发者提供了一个具有线性缓冲区的UART实现,并集成了C语言的printf函数支持,同时提供了对内存区域的自定义设置。 知识点详细说明如下: 1. Nuvoton N76E003微控制器概述: Nuvoton N76E003是基于经典的8051内核设计的微控制器,拥有多种封装形式,支持最高25MHz的CPU时钟频率。该MCU具有较大的片上存储器(包括闪存和RAM),并集成了一系列的通信接口,例如UART、I2C、SPI等,以及用于各种应用的模拟外设,如模数转换器(ADC)和数模转换器(DAC)。 2. UART通信基础: UART是一种广泛使用的异步串行通信协议。它允许微控制器与PC、外围设备或其他微控制器进行数据交换。UART通信包括发送(TX)和接收(RX)两个方向的数据流,支持全双工通信。在UART通信中,数据以帧的形式发送,每一帧包括一个起始位、数据位、可选的奇偶校验位和停止位。 3. 线性缓冲区: 线性缓冲区是一种数据存储结构,它按照线性顺序存储数据元素,类似于数组的结构。在线性缓冲区中,数据的读取和写入通常从缓冲区的两端进行,即一端用于读取,另一端用于写入,这样可以有效地提高数据处理的效率。在UART通信中,线性缓冲区用于暂存接收到的数据或待发送的数据,以避免因为数据处理不及时而导致的信息丢失。 4. printf支持: 在C语言中,printf函数是一个常用的用于输出的函数,它支持格式化输出,可以将数据转换为字符串并打印到标准输出设备。在嵌入式系统中,标准输出设备可能是通过串口连接到PC的终端。在本资源中,提供了对printf的支持,意味着开发者可以在程序中直接使用printf函数,将需要的数据通过UART发送出去。 5. 可定制内存区域: 在嵌入式开发中,为提高系统的灵活性和可扩展性,常常需要对程序中使用的内存区域进行自定义配置。本资源提供了定制内存区域的功能,使得开发者可以根据需要在程序中选择合适的内存区域用于UART数据的存储,进而优化整体的性能。 6. C语言实现: 本资源使用C语言编写,C语言在嵌入式系统编程中有着广泛的应用,它提供了丰富的数据类型和控制结构,非常适合编写底层硬件操作的代码。此外,C语言编写的程序具有较高的可移植性和效率。 综上所述,本资源针对Nuvoton N76E003微控制器提供了一个具有线性缓冲区的UART通信接口,并且支持C语言的printf输出,允许用户自定义内存区域。这对于需要在嵌入式系统中实现高效、可靠的串行通信的开发者来说,是一个非常有价值的资源。

怎么使用这个函数初始化串口3HAL_StatusTypeDef HAL_UART_Init(UART_HandleTypeDef huart) { / Check the UART handle allocation / if (huart == NULL) { return HAL_ERROR; } / Check the parameters / if (huart->Init.HwFlowCtl != UART_HWCONTROL_NONE) { / The hardware flow control is available only for USART1, USART2, USART3 and USART6. Except for STM32F446xx devices, that is available for USART1, USART2, USART3, USART6, UART4 and UART5. / assert_param(IS_UART_HWFLOW_INSTANCE(huart->Instance)); assert_param(IS_UART_HARDWARE_FLOW_CONTROL(huart->Init.HwFlowCtl)); } else { assert_param(IS_UART_INSTANCE(huart->Instance)); } assert_param(IS_UART_WORD_LENGTH(huart->Init.WordLength)); assert_param(IS_UART_OVERSAMPLING(huart->Init.OverSampling)); if (huart->gState == HAL_UART_STATE_RESET) { / Allocate lock resource and initialize it / huart->Lock = HAL_UNLOCKED; #if (USE_HAL_UART_REGISTER_CALLBACKS == 1) UART_InitCallbacksToDefault(huart); if (huart->MspInitCallback == NULL) { huart->MspInitCallback = HAL_UART_MspInit; } / Init the low level hardware / huart->MspInitCallback(huart); #else / Init the low level hardware : GPIO, CLOCK / HAL_UART_MspInit(huart); #endif / (USE_HAL_UART_REGISTER_CALLBACKS) / } huart->gState = HAL_UART_STATE_BUSY; / Disable the peripheral / __HAL_UART_DISABLE(huart); / Set the UART Communication parameters / UART_SetConfig(huart); / In asynchronous mode, the following bits must be kept cleared: - LINEN and CLKEN bits in the USART_CR2 register, - SCEN, HDSEL and IREN bits in the USART_CR3 register./ CLEAR_BIT(huart->Instance->CR2, (USART_CR2_LINEN | USART_CR2_CLKEN)); CLEAR_BIT(huart->Instance->CR3, (USART_CR3_SCEN | USART_CR3_HDSEL | USART_CR3_IREN)); / Enable the peripheral / __HAL_UART_ENABLE(huart); / Initialize the UART state */ huart->ErrorCode = HAL_UART_ERROR_NONE; huart->gState = HAL_UART_STATE_READY; huart->RxState = HAL_UART_STATE_READY; return HAL_OK; }

205 浏览量

注释以下每一行代码#include "bflb_mtimer.h" #include "bflb_uart.h" #include "bflb_clock.h" #include "board.h" struct bflb_device_s *uartx; void uart_isr(int irq, void *arg) { uint32_t intstatus = bflb_uart_get_intstatus(uartx); int ret; uint32_t baudrate; if (intstatus & UART_INTSTS_RX_AD5) { bflb_uart_int_clear(uartx, UART_INTCLR_RX_AD5); ret = bflb_uart_feature_control(uartx, UART_CMD_GET_AUTO_BAUD, UART_AUTO_BAUD_0X55); baudrate = bflb_clk_get_peripheral_clock(BFLB_DEVICE_TYPE_UART, uartx->idx) / (ret + 1); printf("Detected baudrate by 0x55 is %d\r\n", baudrate); } if (intstatus & UART_INTSTS_RX_ADS) { bflb_uart_int_clear(uartx, UART_INTCLR_RX_ADS); ret = bflb_uart_feature_control(uartx, UART_CMD_GET_AUTO_BAUD, UART_AUTO_BAUD_START); baudrate = bflb_clk_get_peripheral_clock(BFLB_DEVICE_TYPE_UART, uartx->idx) / (ret + 1); printf("Detected baudrate by startbit is %d\r\n", baudrate); } } int main(void) { board_init(); board_uartx_gpio_init(); uartx = bflb_device_get_by_name(DEFAULT_TEST_UART); struct bflb_uart_config_s cfg; cfg.baudrate = 2000000; cfg.data_bits = UART_DATA_BITS_8; cfg.stop_bits = UART_STOP_BITS_1; cfg.parity = UART_PARITY_NONE; cfg.flow_ctrl = 0; cfg.tx_fifo_threshold = 7; cfg.rx_fifo_threshold = 7; bflb_uart_init(uartx, &cfg); bflb_uart_feature_control(uartx, UART_CMD_SET_AUTO_BAUD, 1); bflb_uart_feature_control(uartx, UART_CMD_SET_ABR_ALLOWABLE_ERROR, 3); bflb_irq_attach(uartx->irq_num, uart_isr, NULL); bflb_irq_enable(uartx->irq_num); while (1) { } }

262 浏览量