基于士兰微SC53128芯片串口中断函数代码
时间: 2023-12-14 19:03:53 浏览: 248
以下是基于士兰微SC53128芯片串口中断函数的示例代码:
```
// 定义串口接收缓冲区大小
#define UART_RX_BUF_SIZE 64
// 定义串口接收缓冲区
static uint8_t uart_rx_buf[UART_RX_BUF_SIZE];
// 定义串口接收缓冲区指针和长度
static volatile uint16_t uart_rx_buf_ptr = 0;
static volatile uint16_t uart_rx_buf_len = 0;
// 定义串口中断处理函数
void uart_interrupt_handler(void)
{
// 判断是接收中断还是发送中断
if(SCU->UARTSTS & SCU_UARTSTS_RXINT)
{
// 接收中断
// 读取接收数据
uint8_t rx_data = SCU->UARTDATA;
// 将数据存入接收缓冲区
if(uart_rx_buf_len < UART_RX_BUF_SIZE)
{
uart_rx_buf[uart_rx_buf_ptr++] = rx_data;
uart_rx_buf_len++;
if(uart_rx_buf_ptr >= UART_RX_BUF_SIZE)
{
uart_rx_buf_ptr = 0;
}
}
}
else
{
// 发送中断
// TODO: 处理发送中断
}
}
// 定义串口初始化函数
void uart_init(void)
{
// 配置GPIO口为UART功能
GPIOB->CON = (GPIOB->CON & ~(0x3 << 10)) | (0x2 << 10);
GPIOB->CON = (GPIOB->CON & ~(0x3 << 12)) | (0x2 << 12);
// 配置UART参数
SCU->UARTCON = (0x1 << 0) | // UART使能
(0x1 << 2) | // 8位数据位
(0x0 << 3) | // 1位停止位
(0x0 << 4) | // 无校验位
(0x0 << 6) | // 无流控
(0x1 << 10); // 接收中断使能
// 设置UART时钟源为PLL
SCU->CLKCFG = (SCU->CLKCFG & ~(0x3 << 0)) | (0x1 << 0);
// 设置UART时钟分频系数
SCU->UARTBAUD = 0x9; // 波特率为115200,时钟为24MHz
// 注册串口中断处理函数
NVIC_EnableIRQ(UART_IRQn);
NVIC_SetPriority(UART_IRQn, 0);
}
// 定义串口发送函数
void uart_send(uint8_t *data, uint16_t len)
{
// TODO: 实现串口发送函数
}
// 定义串口接收函数
uint16_t uart_receive(uint8_t *buf, uint16_t len)
{
uint16_t i = 0;
while(uart_rx_buf_len > 0 && i < len)
{
buf[i++] = uart_rx_buf[uart_rx_buf_ptr++];
uart_rx_buf_len--;
if(uart_rx_buf_ptr >= UART_RX_BUF_SIZE)
{
uart_rx_buf_ptr = 0;
}
}
return i;
}
// 串口中断处理函数
void UART_IRQHandler(void)
{
uart_interrupt_handler();
}
```
以上代码实现了串口的初始化、发送和接收函数,以及串口中断处理函数。在串口中断处理函数中,判断接收中断和发送中断,并分别进行处理。在接收中断中,将接收到的数据存入接收缓冲区中。在接收函数中,从接收缓冲区中读取数据。
阅读全文