串口使用示例
## 串口使用示例
```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
```