基于士兰微SC53128芯片串口中断函数UART1_IRQHandler实现
时间: 2024-03-09 22:50:14 浏览: 141
利用中断实现UART串口.pdf
以下是基于士兰微SC53128芯片UART1串口中断函数的示例代码:
```
// 定义串口接收缓冲区大小
#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;
// 定义UART1中断处理函数
void UART1_IRQHandler(void)
{
// 判断是接收中断还是发送中断
if(UART1->ISR & UART_ISR_RXNE)
{
// 接收中断
// 读取接收数据
uint8_t rx_data = UART1->RDR;
// 将数据存入接收缓冲区
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 << 12)) | (0x2 << 12);
GPIOB->CON = (GPIOB->CON & ~(0x3 << 14)) | (0x2 << 14);
// 配置UART1参数
RCC->APB2ENR |= RCC_APB2ENR_UART1EN; // 使能UART1时钟
UART1->CR1 |= UART_CR1_UE | UART_CR1_TE | UART_CR1_RE; // 使能UART1、发送和接收
UART1->CR1 &= ~(UART_CR1_M | UART_CR1_OVER8); // 8位数据位,无奇偶校验
UART1->CR2 &= ~(UART_CR2_STOP); // 1位停止位
UART1->BRR = 0x9; // 波特率为115200,时钟为24MHz
// 注册UART1中断处理函数
NVIC_EnableIRQ(UART1_IRQn);
NVIC_SetPriority(UART1_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;
}
```
以上代码实现了UART1串口的初始化、发送和接收函数,以及UART1串口中断处理函数。在串口中断处理函数中,判断接收中断和发送中断,并分别进行处理。在接收中断中,将接收到的数据存入接收缓冲区中。在接收函数中,从接收缓冲区中读取数据。
阅读全文