/** ************************************************************************************************ * @文件 : uart1.c * @作者 : 樊春春 * @版本 : V1.0 * @时间 : 2022/05/31 20:20:39 * @邮箱 : fanchcho@gmail.com * @说明 : uart1底层驱动,待修复 ************************************************************************************************ **/ #include "uart1.h" #include "queue.h" static uint8_t uart1_tx_buf[UART1_TX_LEN] = {0}; static uint8_t uart1_rx_buf[UART1_REC_LEN] = {0}; __IO uint8_t rx_index = 0x00; __IO uint8_t tx_index = 0x00; __IO uint8_t TimeOut = 0x00; // 重定义fputc函数 #ifdef __GNUC__ int _write(int fd, char *buffer, int size) { /* 写一个字节到USART1 */ for (int i = 0; i < size; i++) { USART_SendData(USART1, buffer[i]); /* 等待发送结束 */ while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) ; } return size; } int _read(int fd, char *buffer, int size) { for (int i = 0; i < size; i++) { /* 等待串口1输入数据 */ while (USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET) ; buffer[i] = USART_ReceiveData(USART1); } return size; } // int _write(int fd, char *buffer, int size) // { // uart1_dma_send((uint8_t *)buffer, size); // while (USART_GetITStatus(USART1, USART_IT_TC) != RESET) // ; // return size; // } // int _read(int fd, char *buffer, int size) // { // /* 等待串口1输入数据 */ // while (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) // ; // // uint8_t err = 0; // // UartFrame_TypeDef *msg; // // msg = (UartFrame_TypeDef *)OSMboxPend(uart1_mbox, 50, &err); // // return msg->len; // return (int)USART_ReceiveData(USART1); // } #endif void uart1_nvic_config(void) { NVIC_InitTypeDef NVIC_InitStructure; // Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //串口1中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // IRQ通道使能 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器 } void uart1_config(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; //波特率设置 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式 USART_Init(USART1, &USART_InitStructure); //初始化串口1 USART_Cmd(USART1, ENABLE); //使能串口1 } void uart1_init(void) { uart1_config(); uart1_nvic_config(); /* CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去 如下语句解决第1个字节无法正确发送出去的问题 */ USART_ClearFlag(USART1, USART_FLAG_TC); } void USART1_IRQHandler(void) { /* 处理接收中断 */ if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET) { if (rx_index < UART1_REC_LEN) { /* 接收数据 */ uart1_rx_buf[rx_index++] = USART_ReceiveData(USART1); } else { /* 禁止接收中断 */ USART_ITConfig(USART1, USART_IT_RXNE, DISABLE); } } /* 处理发送缓冲区空中断 */ if (USART_GetITStatus(USART1, USART_IT_TXE) == SET) { if (tx_index < UART1_TX_LEN) { /* 发送数据 */ USART_SendData(USART1, uart1_tx_buf[tx_index++]); } else { /* 禁止发送缓冲区空中断 */ USART_ITConfig(USART1, USART_IT_TXE, DISABLE); } } }