串口使用示例

## 串口使用示例 ```language /** * @file uart_demo1.c * @ingroup peripheral * @brief UART外设Demo * ***********************************************************************************/ #include "softap_api.h" #if DEMO_TEST #include "xy_peripheral.h" // CSP prot and PIN set #define UART_PRCM_CLK PRCM_CKG_CTL_USART1 #define UART_PORT UART1 #define UART_INT_VECTOR UART1_IRQn #define UART_REMAP_TX REMAP_UART_TXD #define UART_REMAP_RX REMAP_UART_RXD #define UART_TX_PIN GPIO_PIN_NUM_6 #define UART_RX_PIN GPIO_PIN_NUM_7 // task config #define UART_TASK_PRIORITY 10 #define UART_TASK_STACK_SIZE 1024 // task handler and semaphore UINT32 g_uart_TskHandle_demo1 = -1; UINT32 g_uart_sem_demo1 = -1; /** * @brief 这个demo是uart的简单回写demo。仅用来检测uart是否通信正常,输入的数据不能超过128个字节,否则会产生错误。 * */ void uart_task_demo1(void) { char rcv_buf[128] = {0}; int len = 0; while(1) { xy_Semaphore_Take(&g_uart_sem_demo1, K_FOREVER); len = xy_UART_ReadBuf(UART_PORT, rcv_buf, sizeof(rcv_buf)); xy_UART_WriteBuf(UART_PORT, rcv_buf, len); } } void uart_int_handler_demo1(void) __attribute__((section(".ramtext"))); /** * @brief 这个函数是UART中断处理函数 * @note 需要清除中断标志位 * * @code * int_sta = xy_UART_ReadAndClearIntState(UART_PORT); * @endcode * */ void uart_int_handler_demo1(void) { volatile uint32_t int_sta; int_sta = xy_UART_ReadAndClearIntState(UART_PORT); //if(int_sta & UART_INTTYPE_RTRIG) xy_Semaphore_Give(&g_uart_sem_demo1); } /** * @brief UART初始化函数 * @note 在配置IO前需要清空配置寄存器并开启外设时钟 * * @code * xy_PRCM_ClockCmd(UART_PRCM_CLK, ENABLE); xy_PRCM_ClockCmd(PRCM_CKG_CTL_GPIO, ENABLE); //uart config xy_GPIO_ClearConfig(UART_TX_PIN); xy_GPIO_ClearConfig(UART_RX_PIN); xy_GPIO_Remapping(UART_TX_PIN, UART_REMAP_TX); xy_GPIO_Remapping(UART_RX_PIN, UART_REMAP_RX); xy_GPIO_SetIOMode(UART_TX_PIN, GPIO_MODE_HW_PER); xy_GPIO_SetIOMode(UART_RX_PIN, GPIO_MODE_HW_IN_PU); xy_UART_Init(UART_PORT, 9600, UART_DATA_BITS_8, UART_STOP_BITS_1, UART_PARITY_NONE); xy_UART_FIFO_Level_Set(UART_PORT, 32, 1); xy_UART_TIMEOUT_Set(UART_PORT, 10); xy_Semaphore_Create(&g_uart_sem_demo1); xy_NVIC_IntRegister(UART_INT_VECTOR, 1, uart_int_handler_demo1); // UART interrupt enable xy_UART_IntCmd(UART_PORT, UART_INTTYPE_RTRIG, ENABLE); // UART enable xy_UART_Cmd(UART_PORT, ENABLE); * @endcode * */ void uart_gpio_init_demo1(void) { xy_PRCM_ClockCmd(UART_PRCM_CLK, ENABLE); xy_PRCM_ClockCmd(PRCM_CKG_CTL_GPIO, ENABLE); //uart config xy_GPIO_ClearConfig(UART_TX_PIN); //清除串口引脚上的其它配置功能 xy_GPIO_ClearConfig(UART_RX_PIN); //清除串口引脚上的其它配置功能 xy_GPIO_Remapping(UART_TX_PIN, UART_REMAP_TX); //重映射串口引脚功能 xy_GPIO_Remapping(UART_RX_PIN, UART_REMAP_RX); //重映射串口引脚功能 xy_GPIO_SetIOMode(UART_TX_PIN, GPIO_MODE_HW_PER); //设置串口引脚的工作模式 xy_GPIO_SetIOMode(UART_RX_PIN, GPIO_MODE_HW_IN_PU); //设置串口引脚的工作模式 xy_UART_Init(UART_PORT, 9600, UART_DATA_BITS_8, UART_STOP_BITS_1, UART_PARITY_NONE); xy_UART_FIFO_Level_Set(UART_PORT, 32, 1); xy_UART_TIMEOUT_Set(UART_PORT, 10); xy_Semaphore_Create(&g_uart_sem_demo1); xy_NVIC_IntRegister(UART_INT_VECTOR, 1, uart_int_handler_demo1); // UART interrupt enable xy_UART_IntCmd(UART_PORT, UART_INTTYPE_RTRIG, ENABLE); // UART enable xy_UART_Cmd(UART_PORT, ENABLE); } /** * @brief 这个函数为UARTdemo提供了一个工作线程 * */ UINT32 uart_task_init_demo1(void) { UINT32 uwRet = LOS_NOK; uwRet = xy_TaskCreate((TaskFunc_t)uart_task_demo1, "uart_task_demo1", UART_TASK_STACK_SIZE, NULL, UART_TASK_PRIORITY, &g_uart_TskHandle_demo1); return uwRet; } #endif ```