基于士兰微SC53128芯片串口接收数据实例代码
时间: 2023-07-30 14:06:25 浏览: 115
以下是一个基于士兰微SC53128芯片串口接收数据的示例代码,您可以参考:
```
#include <stdio.h>
#include "sc5xx_uart.h"
#define UART_BASE_ADDR (0x40020000)
#define UART_BAUD_RATE (9600)
int main(void)
{
// 初始化 UART
sc5xx_uart_init(UART_BASE_ADDR, UART_BAUD_RATE);
// 接收数据
while (1)
{
if (sc5xx_uart_rx_ready(UART_BASE_ADDR))
{
char ch = sc5xx_uart_read(UART_BASE_ADDR);
printf("Received character: %c\n", ch);
}
}
return 0;
}
```
该代码使用`sc5xx_uart_init`函数初始化串口,并使用`sc5xx_uart_rx_ready`函数检查是否有数据可用。如果有数据可用,则使用`sc5xx_uart_read`函数读取数据,并将其打印到控制台上。
请注意,该代码仅供参考,您需要根据自己的具体情况进行修改和适配。
相关问题
基于士兰微SC53128芯片串口中断函数代码
以下是基于士兰微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();
}
```
以上代码实现了串口的初始化、发送和接收函数,以及串口中断处理函数。在串口中断处理函数中,判断接收中断和发送中断,并分别进行处理。在接收中断中,将接收到的数据存入接收缓冲区中。在接收函数中,从接收缓冲区中读取数据。
基于士兰微SC53128芯片串口中断函数UART1_IRQHandler实现
以下是基于士兰微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串口中断处理函数。在串口中断处理函数中,判断接收中断和发送中断,并分别进行处理。在接收中断中,将接收到的数据存入接收缓冲区中。在接收函数中,从接收缓冲区中读取数据。
阅读全文