当前位置: 首页 > news >正文

HC32F4A0 10路串口UART 配置

HC32 小华MCU 使用一段时间了,反正芯片BUG 是比较多了,比如串口接收错误后导致再也无法接收,PWM模块无法输出 低电平 , CAN 接收错误导致 输出引脚 CAN_TXD 一直输出脉冲  。。。;好的一面也存在吧,IO 引脚 可以重定义的比较多 ,这里使用内部10路串口,初始化如下 :

源文件 :

#include "hc32_ddl.h"
#include "bsp_usart.h"
#include <stdio.h>
#include "systick.h"
#include "string.h"
#include "Global_GpioDefine.h"static int8_t golbal_regTimeout_enable =0;
static struct uart_list_table *golbal_uart_list;
static uint32_t uart_list_table_size =0;int fputc(int ch, FILE *f)
{while (Reset == USART_GetStatus(M4_USART1, USART_FLAG_TXE)){;} /* Wait Tx data register empty */USART_SendData(M4_USART1, ch);return ch;
}static void _uart_list_init(void){golbal_uart_list=NULL;uart_list_table_size =0;
}static int _add_uart_list(struct uart_list_table* add_list){struct uart_list_table *list_p = golbal_uart_list;struct uart_list_table **next_ptr=&golbal_uart_list;if(add_list==NULL)return -2;__disable_irq();if(uart_list_table_size!=0){next_ptr = &list_p->end_list;list_p= list_p->end_list;*next_ptr = add_list;next_ptr = &add_list->end_list;*next_ptr = list_p;}else{*next_ptr = add_list;next_ptr = &add_list->end_list;*next_ptr = add_list;}uart_list_table_size++;__enable_irq();return 0;   
}static int _del_uart_list(struct uart_list_table* del_list){struct uart_list_table *list_p = golbal_uart_list;struct uart_list_table **target = &golbal_uart_list;uint32_t i=0;if(del_list==NULL)return -2;if(uart_list_table_size==0) return -4;__disable_irq();for(i=0;i<uart_list_table_size;i++){if(list_p==del_list){*target = list_p->end_list;break;}target = &list_p->end_list;list_p = list_p->end_list;	}uart_list_table_size--;__enable_irq();;return i>0?0:-1;
}static void TMR0_1_ChACmp_IrqCallback(void)
{
#if	configUSE_PREEMPTION>0uint32_t ulPreviousMask= portSET_INTERRUPT_MASK_FROM_ISR();BaseType_t pxHigherPriorityTaskWoken;
#endifM4_TMR0_1->STFLR =0;  /* Clear the compare matching flag */struct uart_list_table *list_p = golbal_uart_list;uint32_t i=0,curr_dma_ptr;UART_MAG *uart_sel;for(i=0;i<uart_list_table_size;i++){uart_sel =list_p->uart_sel;if(uart_sel!=NULL){curr_dma_ptr = uart_sel->dma_mon_ptr[0];if(curr_dma_ptr != uart_sel->last_ptr){uart_sel->last_ptr = curr_dma_ptr;uart_sel->recv_flag  |=(1UL<<30) ;uart_sel->delay_tick_cnt =0;}else if(uart_sel->recv_flag &(1UL<<30)){if(++uart_sel->delay_tick_cnt >=  uart_sel->delay_tick_set){uart_sel->delay_tick_cnt =0;uart_sel->recv_flag  &=~(1UL<<30);uart_sel->recv_flag ++ ;
#if	(configUSE_PREEMPTION>0) xSemaphoreGiveFromISR(uart_sel->suart_xsem,&pxHigherPriorityTaskWoken);
#endif }}if(uart_sel->uart_SR[0]&(5UL<<1)){/*UART-ORE / FE -error*/uart_sel->uart_SR[3] |=(1UL<<19)|(1UL<<17); /*clear ORE ,FE*/}}list_p = list_p->end_list;}
#if	configUSE_PREEMPTION>0	portCLEAR_INTERRUPT_MASK_FROM_ISR( ulPreviousMask );
#endif
}static void _uart_timeout_scan_init(uint32_t output_clk){stc_tmr0_init_t stcTmr0Init;/* Enable timer0 peripheral clock */PWC_Fcg2PeriphClockCmd(PWC_FCG2_TMR0_1, Enable);uint32_t arr =0;int32_t psc =0;do{psc*=2;if(psc==0)psc=1;arr =HCLK_VALUE/2/(psc)/output_clk -1;if(psc>1024){/*param error*/psc = 1024;arr = 0xffff;break;}}while(arr>=0xffff);int i=0;for(i=0;i<10;i++){if(psc&(1UL<<i)){break;}}/* TIMER0 basetimer function initialize */(void)TMR0_StructInit(&stcTmr0Init);stcTmr0Init.u32ClockDivision = (uint32_t)i<<TMR0_BCONR_CKDIVA_POS;        stcTmr0Init.u32ClockSource = TMR0_CLK_SRC_PCLK1;        stcTmr0Init.u32Tmr0Func = TMR0_FUNC_CMP;          stcTmr0Init.u32HwTrigFunc = TMR0_BT_HWTRG_FUNC_NONE;stcTmr0Init.u16CmpValue = arr;            (void)TMR0_Init(M4_TMR0_1, TMR0_CH_A, &stcTmr0Init);DDL_DelayMS(1U); TMR0_IntCmd(M4_TMR0_1, TMR0_CH_A, Enable);stc_irq_signin_config_t stcIrqSignConfig;stcIrqSignConfig.enIRQn = Int014_IRQn;stcIrqSignConfig.enIntSrc = INT_TMR0_1_CMPA;stcIrqSignConfig.pfnCallback = &TMR0_1_ChACmp_IrqCallback;(void)INTC_IrqSignIn(&stcIrqSignConfig);NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIORITY_15);NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);_uart_list_init();TMR0_Cmd(M4_TMR0_1, TMR0_CH_A, Enable);
}
void _uart_timeout_scan_deinit(void){TMR0_Cmd(M4_TMR0_1, TMR0_CH_A, Disable);TMR0_IntCmd(M4_TMR0_1, TMR0_CH_A, Disable);
}#if defined UART1_SERIAL_TXD_GPIOX &&  \defined UART1_SERIAL_RXD_GPIOX
UART_MAG uart1_msg;
static struct uart_list_table uart1_list;
void uart1_deinit(void){__DMA_UART_DEINIT(1,0);USART_FuncCmd(M4_USART1, (USART_RX | USART_TX), Disable);_del_uart_list(&uart1_list);
}
void uart1_init(uint32_t baudrate)
{static uint8_t Uart1RecvBuf[UART1_BUFSIZEMAX];GPIO_SetFunc( UART1_SERIAL_RXD_GPIOX, \UART1_SERIAL_RXD, \UART1_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(	UART1_SERIAL_TXD_GPIOX, \UART1_SERIAL_TXD, \UART1_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(1,0,1,\uart1_msg,\Uart1RecvBuf,\UART1_BUFSIZEMAX,\uart1_list,DMA1_TRGSEL,\EVT_USART1_RI);
#if	configUSE_PREEMPTION>0uart1_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart1_list);
}uint16_t uart1_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART1->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART1->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart1_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart1_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart1_init(uint32_t baudrate){}
#endif// uart 2#if defined UART2_SERIAL_TXD_GPIOX &&  \defined UART2_SERIAL_RXD_GPIOXUART_MAG uart2_msg;
static struct uart_list_table uart2_list;
void uart2_deinit(void){__DMA_UART_DEINIT(1,1);USART_FuncCmd(M4_USART2, (USART_RX | USART_TX), Disable);_del_uart_list(&uart2_list);
}
void uart2_init(uint32_t baudrate)
{static uint8_t Uart2RecvBuf[UART2_BUFSIZEMAX];GPIO_SetFunc( 				UART2_SERIAL_RXD_GPIOX, \UART2_SERIAL_RXD, \UART2_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(				UART2_SERIAL_TXD_GPIOX, \UART2_SERIAL_TXD, \UART2_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(1,1,2,\uart2_msg,\Uart2RecvBuf,\UART2_BUFSIZEMAX,\uart2_list,DMA1_TRGSEL,\EVT_USART2_RI);
#if	configUSE_PREEMPTION>0uart2_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart2_list);
}uint16_t uart2_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART2->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART2->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart2_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart2_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart2_init(uint32_t baudrate){}
#endif// uart3#if defined UART3_SERIAL_TXD_GPIOX &&  \defined UART3_SERIAL_RXD_GPIOXUART_MAG uart3_msg;
static struct uart_list_table uart3_list;
void uart3_deinit(void){__DMA_UART_DEINIT(1,2);USART_FuncCmd(M4_USART3, (USART_RX | USART_TX), Disable);_del_uart_list(&uart3_list);
}
void uart3_init(uint32_t baudrate)
{static uint8_t Uart3RecvBuf[UART3_BUFSIZEMAX];GPIO_SetFunc( 				UART3_SERIAL_RXD_GPIOX, \UART3_SERIAL_RXD, \UART3_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(				UART3_SERIAL_TXD_GPIOX, \UART3_SERIAL_TXD, \UART3_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(1,2,3,\uart3_msg,\Uart3RecvBuf,\UART3_BUFSIZEMAX,\uart3_list,DMA1_TRGSEL,\EVT_USART3_RI);
#if	configUSE_PREEMPTION>0uart3_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart3_list);
}uint16_t uart3_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART3->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART3->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart3_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart3_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart3_init(uint32_t baudrate){}
#endif//uart 4#if defined UART4_SERIAL_TXD_GPIOX &&  \defined UART4_SERIAL_RXD_GPIOXUART_MAG uart4_msg;
static struct uart_list_table uart4_list;
void uart4_deinit(void){__DMA_UART_DEINIT(1,3);USART_FuncCmd(M4_USART4, (USART_RX | USART_TX), Disable);_del_uart_list(&uart4_list);
}
void uart4_init(uint32_t baudrate)
{static uint8_t Uart4RecvBuf[UART4_BUFSIZEMAX];GPIO_SetFunc( 				UART4_SERIAL_RXD_GPIOX, \UART4_SERIAL_RXD, \UART4_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(				UART4_SERIAL_TXD_GPIOX, \UART4_SERIAL_TXD, \UART4_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(1,3,4,\uart4_msg,\Uart4RecvBuf,\UART4_BUFSIZEMAX,\uart4_list,DMA1_TRGSEL,\EVT_USART4_RI);
#if	configUSE_PREEMPTION>0uart4_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart4_list);
}uint16_t uart4_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART4->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART4->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart4_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart4_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart4_init(uint32_t baudrate){}
#endif
// 5#if defined UART5_SERIAL_TXD_GPIOX &&  \defined UART5_SERIAL_RXD_GPIOXUART_MAG uart5_msg;
static struct uart_list_table uart5_list;
void uart5_deinit(void){__DMA_UART_DEINIT(1,4);USART_FuncCmd(M4_USART5, (USART_RX | USART_TX), Disable);_del_uart_list(&uart5_list);
}
void uart5_init(uint32_t baudrate)
{static uint8_t Uart5RecvBuf[UART5_BUFSIZEMAX];GPIO_SetFunc( 				UART5_SERIAL_RXD_GPIOX, \UART5_SERIAL_RXD, \UART5_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(				UART5_SERIAL_TXD_GPIOX, \UART5_SERIAL_TXD, \UART5_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(1,4,5,\uart5_msg,\Uart5RecvBuf,\UART5_BUFSIZEMAX,\uart5_list,DMA1_TRGSEL,\EVT_USART5_RI);
#if	configUSE_PREEMPTION>0uart5_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart5_list);
}uint16_t uart5_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART5->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART5->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart5_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart5_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart5_init(uint32_t baudrate){}
#endif// 6#if defined UART6_SERIAL_TXD_GPIOX &&  \defined UART6_SERIAL_RXD_GPIOXUART_MAG uart6_msg;
static struct uart_list_table uart6_list;
void uart6_deinit(void){__DMA_UART_DEINIT(1,5);USART_FuncCmd(M4_USART6, (USART_RX | USART_TX), Disable);_del_uart_list(&uart6_list);
}
void uart6_init(uint32_t baudrate)
{static uint8_t Uart6RecvBuf[UART6_BUFSIZEMAX];GPIO_SetFunc( 				UART6_SERIAL_RXD_GPIOX, \UART6_SERIAL_RXD, \UART6_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(				UART6_SERIAL_TXD_GPIOX, \UART6_SERIAL_TXD, \UART6_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(1,5,6,\uart6_msg,\Uart6RecvBuf,\UART6_BUFSIZEMAX,\uart6_list,DMA1_TRGSEL,\EVT_USART6_RI);
#if	configUSE_PREEMPTION>0uart6_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart6_list);
}uint16_t uart6_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART6->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART6->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart6_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart6_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart6_init(uint32_t baudrate){}
#endif
//7 #if defined UART7_SERIAL_TXD_GPIOX &&  \defined UART7_SERIAL_RXD_GPIOXUART_MAG uart7_msg;
static struct uart_list_table uart7_list;
void uart7_deinit(void){__DMA_UART_DEINIT(1,6);USART_FuncCmd(M4_USART7, (USART_RX | USART_TX), Disable);_del_uart_list(&uart7_list);
}
void uart7_init(uint32_t baudrate)
{static uint8_t Uart7RecvBuf[UART7_BUFSIZEMAX];GPIO_SetFunc( 				UART7_SERIAL_RXD_GPIOX, \UART7_SERIAL_RXD, \UART7_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(				UART7_SERIAL_TXD_GPIOX, \UART7_SERIAL_TXD, \UART7_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(1,6,7,\uart7_msg,\Uart7RecvBuf,\UART7_BUFSIZEMAX,\uart7_list,DMA1_TRGSEL,\EVT_USART7_RI);
#if	configUSE_PREEMPTION>0uart7_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart7_list);
}uint16_t uart7_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART7->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART7->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart7_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart7_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart7_init(uint32_t baudrate){}
#endif// 8#if defined UART8_SERIAL_TXD_GPIOX &&  \defined UART8_SERIAL_RXD_GPIOXUART_MAG uart8_msg;
static struct uart_list_table uart8_list;
void uart8_deinit(void){__DMA_UART_DEINIT(1,7);USART_FuncCmd(M4_USART8, (USART_RX | USART_TX), Disable);_del_uart_list(&uart8_list);
}
void uart8_init(uint32_t baudrate)
{static uint8_t Uart8RecvBuf[UART8_BUFSIZEMAX];GPIO_SetFunc( 				UART8_SERIAL_RXD_GPIOX, \UART8_SERIAL_RXD, \UART8_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(				UART8_SERIAL_TXD_GPIOX, \UART8_SERIAL_TXD, \UART8_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(1,7,8,\uart8_msg,\Uart8RecvBuf,\UART8_BUFSIZEMAX,\uart8_list,DMA1_TRGSEL,\EVT_USART8_RI);
#if	configUSE_PREEMPTION>0uart8_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart8_list);
}uint16_t uart8_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART8->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART8->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart8_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart8_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart8_init(uint32_t baudrate){}
#endif
//9#if defined UART9_SERIAL_TXD_GPIOX &&  \defined UART9_SERIAL_RXD_GPIOXUART_MAG uart9_msg;
static struct uart_list_table uart9_list;
void uart9_deinit(void){__DMA_UART_DEINIT(2,0);USART_FuncCmd(M4_USART9, (USART_RX | USART_TX), Disable);_del_uart_list(&uart9_list);
}
void uart9_init(uint32_t baudrate)
{static uint8_t Uart9RecvBuf[UART9_BUFSIZEMAX];GPIO_SetFunc( 				UART9_SERIAL_RXD_GPIOX, \UART9_SERIAL_RXD, \UART9_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(				UART9_SERIAL_TXD_GPIOX, \UART9_SERIAL_TXD, \UART9_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(2,0,9,\uart9_msg,\Uart9RecvBuf,\UART9_BUFSIZEMAX,\uart9_list,DMA1_TRGSEL,\EVT_USART9_RI);
#if	configUSE_PREEMPTION>0uart9_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart9_list);
}uint16_t uart9_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART9->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART9->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart9_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart9_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart9_init(uint32_t baudrate){}
#endif
//10#if defined UART10_SERIAL_TXD_GPIOX &&  \defined UART10_SERIAL_RXD_GPIOXUART_MAG uart10_msg;
static struct uart_list_table uart10_list;
void uart10_deinit(void){__DMA_UART_DEINIT(2,1);USART_FuncCmd(M4_USART10, (USART_RX | USART_TX), Disable);_del_uart_list(&uart10_list);
}
void uart10_init(uint32_t baudrate)
{static uint8_t Uart8RecvBuf[UART10_BUFSIZEMAX];GPIO_SetFunc( 				UART10_SERIAL_RXD_GPIOX, \UART10_SERIAL_RXD, \UART10_SERIAL_RXD_FUNC, PIN_SUBFUNC_DISABLE);GPIO_SetFunc(				UART10_SERIAL_TXD_GPIOX, \UART10_SERIAL_TXD, \UART10_SERIAL_TXD_FUNC, PIN_SUBFUNC_DISABLE);__DMA_UART_INIT(2,1,10,\uart10_msg,\Uart10RecvBuf,\UART10_BUFSIZEMAX,\uart10_list,DMA1_TRGSEL,\EVT_USART10_RI);
#if	configUSE_PREEMPTION>0uart10_msg.suart_xsem = xSemaphoreCreateBinary();
#endif_add_uart_list(&uart10_list);
}uint16_t uart10_Send(uint8_t *dat ,uint16_t len){uint16_t lens =len;while(len--){while (0 ==READ_REG32_BIT(M4_USART10->SR, USART_FLAG_TXE)){;} /* Wait Tx data register empty */M4_USART10->DR=((uint32_t)*dat++ & 0x01FFUL);}
return lens;
}uint16_t uart10_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms){uint32_t cur_tick ;	uint16_t cur_count ;UART_MAG *uartv =&uart10_msg;	
#if	configUSE_PREEMPTION>0if((uartv->recv_flag&0xffff)>0){uartv->recv_flag--;}else{if(pdTRUE!=xSemaphoreTake(uartv->suart_xsem, recvtimeout_ms))return 0;if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;}
#elseif(recvtimeout_ms){while(((uartv->recv_flag&0xffff)==0)&&(recvtimeout_ms>0)){delay_ms(1);recvtimeout_ms--;}}else{while((uartv->recv_flag&0xffff)==0){delay_ms(1);}}if((uartv->recv_flag&0xffff)>0)uartv->recv_flag --;else return 0;
#endif/*calc  recevice */uint32_t	last_ptr = uartv->last_ptr; //lock varable ,!!if(last_ptr> uartv->data_read_ptr){cur_tick = last_ptr - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);}else{cur_tick = (uint32_t)uartv->data_buf ;cur_tick += uartv->data_buf_size;/*buffer end*/cur_tick = cur_tick - uartv->data_read_ptr;memcpy(data ,(void*)uartv->data_read_ptr,cur_tick);data += cur_tick;cur_count=  last_ptr - (uint32_t)uartv->data_buf;memcpy(data ,(void*)uartv->data_buf,cur_count);cur_tick +=cur_count;}uartv->data_read_ptr = last_ptr;return cur_tick;
}
#else
void uart10_init(uint32_t baudrate){}
#endifvoid (*ttyScom_init[_SYS_TTYS_NUM_SIZE_MAX])(uint32_t bound)=
{&uart1_init,&uart2_init,&uart3_init,&uart4_init,&uart5_init,&uart6_init,&uart7_init,&uart8_init,&uart9_init,&uart10_init,
};

H 文件

#ifndef _BSP_USART_H_
#define _BSP_USART_H_
#include <stdint.h>
#ifndef __PROJ_TARGET_UBOOT
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#endiftypedef struct
{uint32_t	last_ptr;uint16_t 	delay_tick_set;uint16_t    delay_tick_cnt;uint32_t	data_read_ptr;uint32_t    data_buf_size;uint8_t 	*data_buf;uint32_t 	recv_flag;uint32_t    *dma_mon_ptr;uint32_t  *uart_SR;
#if	configUSE_PREEMPTION>0SemaphoreHandle_t suart_xsem;
#endif
}UART_MAG;#define			UART1_BUFSIZEMAX				64
#define			UART2_BUFSIZEMAX				1024
#define			UART3_BUFSIZEMAX				64
#define			UART4_BUFSIZEMAX				64
#define			UART5_BUFSIZEMAX				64
#define			UART6_BUFSIZEMAX				64
#define			UART7_BUFSIZEMAX				64
#define			UART8_BUFSIZEMAX				2048
#define			UART9_BUFSIZEMAX				64
#define			UART10_BUFSIZEMAX				64#define			__DMA_UART_DEINIT(dmax,CH){\M4_DMA##dmax->CHEN &=~(1UL<<CH) ;\M4_DMA##dmax->CHENCLR |=(1UL<<CH); \
}#define		__DMA_UART_INIT(dmax,CH,utx,uartx_msg,UartxRecvBuf,UARTx_BUFSIZEMAX,uartx_list,DMAx_TRGSEL,EVT_USARTx_RI){\uartx_msg.last_ptr = (uint32_t)UartxRecvBuf;\uartx_msg.delay_tick_set = 2;\uartx_msg.delay_tick_cnt =0;\uartx_msg.data_read_ptr = \uartx_msg.last_ptr;\uartx_msg.data_buf_size = UARTx_BUFSIZEMAX;\uartx_msg.data_buf = UartxRecvBuf;\uartx_msg.recv_flag =0;\uartx_msg.dma_mon_ptr = (uint32_t*)&M4_DMA##dmax->MONDAR##CH;\uartx_msg.uart_SR  = (uint32_t*)&M4_USART##utx->SR;\\uartx_list.uart_sel = &uartx_msg;\if(golbal_regTimeout_enable==0){\golbal_regTimeout_enable = 1;\_uart_timeout_scan_init(125);\}\\PWC_Fcg0PeriphClockCmd((PWC_FCG0_DMA##dmax | PWC_FCG0_AOS), Enable);\PWC_Fcg3PeriphClockCmd(PWC_FCG3_USART##utx, Enable);\\M4_DMA##dmax->EN |=0x1 ;\M4_DMA##dmax->CHENCLR |=(1UL<<CH) ;\\M4_DMA##dmax->SAR##CH =(uint32_t)(&M4_USART##utx->DR)+2UL;\M4_DMA##dmax->DAR##CH = (uint32_t)UartxRecvBuf;\M4_DMA##dmax->DTCTL##CH = 0x1;\\M4_DMA##dmax->RPT##CH = (uint32_t)UARTx_BUFSIZEMAX<<16;\M4_DMA##dmax->RPTB##CH = (uint32_t)UARTx_BUFSIZEMAX<<16;\\M4_DMA##dmax->CHCTL##CH = 0UL<<8 | \1UL<<5 | \1UL<<2 ; \\M4_AOS->DMAx_TRGSEL##CH = EVT_USARTx_RI; \M4_DMA##dmax->CHEN |=(1UL<<CH) ; \\const stc_usart_uart_init_t stcUartInit = { \.u32Baudrate = baudrate, \.u32BitDirection = USART_LSB, \.u32StopBit = USART_STOPBIT_1BIT, \.u32Parity = USART_PARITY_NONE, \.u32DataWidth = USART_DATA_LENGTH_8BIT, \.u32ClkMode = USART_INTERNCLK_NONE_OUTPUT, \.u32PclkDiv = USART_PCLK_DIV64, \.u32OversamplingBits = USART_OVERSAMPLING_8BIT, \.u32NoiseFilterState = USART_NOISE_FILTER_DISABLE, \.u32SbDetectPolarity = USART_SB_DETECT_FALLING, \}; \USART_UartInit(M4_USART##utx, &stcUartInit);\\USART_FuncCmd(M4_USART##utx, (USART_RX | USART_TX), Enable); \\
}/*uart x recvice timeout list_table*/
struct uart_list_table{UART_MAG *uart_sel;struct uart_list_table *end_list;
};
extern void _uart_timeout_scan_deinit(void);
extern UART_MAG uart1_msg;
extern void uart1_init(uint32_t baudrate);
extern uint16_t uart1_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart1_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);
extern UART_MAG uart2_msg;
extern void uart2_init(uint32_t baudrate);
extern uint16_t uart2_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart2_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);
extern UART_MAG uart3_msg;
extern void uart3_init(uint32_t baudrate);
extern uint16_t uart3_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart3_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);
extern UART_MAG uart4_msg;
extern void uart4_init(uint32_t baudrate);
extern uint16_t uart4_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart4_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);
extern UART_MAG uart5_msg;
extern void uart5_init(uint32_t baudrate);
extern uint16_t uart5_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart5_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);
extern UART_MAG uart6_msg;
extern void 		uart6_init(uint32_t baudrate);
extern uint16_t uart6_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart6_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);
extern UART_MAG uart7_msg;
extern void 		uart7_init(uint32_t baudrate);
extern uint16_t uart7_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart7_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);
extern UART_MAG uart8_msg;
extern void uart8_init(uint32_t baudrate);
extern uint16_t uart8_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart8_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);
extern UART_MAG uart9_msg;
extern void 		uart9_init(uint32_t baudrate);
extern uint16_t uart9_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart9_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);
extern UART_MAG uart10_msg;
extern void 		uart10_init(uint32_t baudrate);
extern uint16_t uart10_Send(uint8_t *dat ,uint16_t len);
extern uint16_t uart10_RecvForm(uint8_t *data ,uint32_t recvtimeout_ms);#define		_SYS_TTYS_NUM_SIZE_MAX			10
extern void (*ttyScom_init[_SYS_TTYS_NUM_SIZE_MAX])(uint32_t bound);
#endif

外部定义全局头文件 ,如 :

//串口 --调试
#define     UART1_SERIAL_TXD_GPIOX        GPIO_PORT_I /*FG1*/
#define     UART1_SERIAL_RXD_GPIOX        GPIO_PORT_I
#define     UART1_SERIAL_TXD          GPIO_PIN_04
#define     UART1_SERIAL_RXD          GPIO_PIN_05
#define     UART1_SERIAL_TXD_FUNC            GPIO_FUNC_32_USART1_TX
#define     UART1_SERIAL_RXD_FUNC            GPIO_FUNC_33_USART1_RX
//RS 485 -3
#define     UART2_SERIAL_TXD_GPIOX        GPIO_PORT_B
#define     UART2_SERIAL_RXD_GPIOX        GPIO_PORT_B
#define     UART2_SERIAL_TXD          GPIO_PIN_03 /*FG1 */
#define     UART2_SERIAL_RXD          GPIO_PIN_04
#define     UART2_SERIAL_TXD_FUNC            GPIO_FUNC_34_USART2_TX
#define     UART2_SERIAL_RXD_FUNC            GPIO_FUNC_35_USART2_RX

自动激活相关函数配置 ,串口接收采用 独立定时器 判断接收超时,统一处理 ,并且串口错误后自动清除相关BIT 

相关文章:

HC32F4A0 10路串口UART 配置

HC32 小华MCU 使用一段时间了&#xff0c;反正芯片BUG 是比较多了&#xff0c;比如串口接收错误后导致再也无法接收&#xff0c;PWM模块无法输出 低电平 &#xff0c; CAN 接收错误导致 输出引脚 CAN_TXD 一直输出脉冲 。。。&#xff1b;好的一面也存在吧&#xff0c;IO 引脚…...

拯救PyCharm:击退IDE崩溃的终极策略

拯救PyCharm&#xff1a;击退IDE崩溃的终极策略 PyCharm&#xff0c;作为开发界的明星IDE之一&#xff0c;以其强大的功能和灵活的定制性深受广大开发者喜爱。然而&#xff0c;即便是这样一款卓越的开发工具&#xff0c;也可能会遇到崩溃的问题&#xff0c;影响开发效率和工作…...

深入解析Unix命令:掌握wc、whereis和which的使用技巧

目录 1. wc命令 2. whereis命令 3. which命令 结论 在Unix和类Unix系统中&#xff0c;wc、whereis和which是三个常用的命令行工具&#xff0c;每个都有着独特的功能和用途。让我们逐个来了解它们的作用和使用方法。 1. wc命令 wc命令是"word count"的缩写&…...

奥运会大规模使用中国AI大模型!

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI圈最近又发生了啥新鲜事&#xff1f; 巴黎奥运会大规模使用中国 AI 大模型 巴黎奥运会成为一场科技与体育的盛宴&#xff0c;其中包括了大量中国科技的应用。AI 技术将在多个方面发挥作用&#xf…...

Linux中的线程3

死锁 在Linux操作系统中&#xff0c;死锁&#xff08;Deadlock&#xff09;是指两个或多个进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;因互相持有对方所需的资源而又都在等待对方释放资源&#xff0c;导致它们都无法继续执行下去的一种状态。这种僵局会浪费系…...

内网权限维持——利用WMI进行权限维持

文章目录 一、WMI事件订阅机制简介二、利用事件订阅进行权限维持三、防御方式 一、WMI事件订阅机制简介 WMI&#xff08;Windows Management Instrumentation&#xff0c;Windows管理规范&#xff09;是windows提供的一种能够直接与系统进行交互的机制&#xff0c;旨在为系统中…...

【数据结构算法经典题目刨析(c语言)】括号匹配问题(图文详解)

&#x1f493; 博客主页&#xff1a;C-SDN花园GGbond ⏩ 文章专栏&#xff1a;数据结构经典题目刨析(c语言) 目录 一、题目描述 二、解题思路 三、代码实现 一、题目描述 二、解题思路 问题要求将三种类型括号匹配&#xff0c;其中包括顺序匹配和数量匹配 使用栈的后进先…...

浅谈 Spring AOP框架 (1)

文章目录 一、什么是 Spring AOP二、为什么要使用 Spring AOP三、AOP 的一些应用场景四、AOP 的组成五、如何使用 Spring AOP六、Spring AOP 的实现原理6.1、JDK 和 CGLIB 的区别 一、什么是 Spring AOP AOP (Aspect Oriented Programming) &#xff1a;面向切面编程&#xff…...

Linux 面试准备 - 2024

复习一下&#xff0c;资料来自慕课网课程 Linux 速成班和一些网上面试资料。 1. Linux 内核功能 1. 内存管理 2. 进程管理 3. 设备驱动程序 4. 系统调用和安全防护 2. 文件系统 - 一切皆文件 2.1 文件目录 /根目录etc配置文件bin必要命令usr 二级目录&#xff08;非用户…...

C++笔记---类和对象(中)

1. 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。 一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数&#xff0c;分别为&#xff1a;构造函数&#xff0c;析构函数&#xff0c;拷贝构…...

【C++】入门基础知识

河流之所以能够到达目的地&#xff0c;是因为它懂得怎样避开障碍。&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;C的发展历史 • &#x1f330;1.C发展历史 • &#x1f330;2.C的迭代与更新 • &#x1f330;3.编程语言排…...

AI的应用场景和未来展望

AI&#xff08;人工智能&#xff09;的应用场景广泛且多样&#xff0c;已经深入到我们生活的方方面面&#xff0c;成为现代社会不可或缺的一部分。 AI的应用场景 1、通用软件与工具型应用 办公软件&#xff1a;如钉钉、飞书等&#xff0c;通过AI技术提供内容生成与摘要、智能…...

vim、sublime、notepad文本编辑器的使用

VIM&#xff1a; Windows上配置gvim并作为C和C的IDE Windows上配置gvim并作为C和C的IDE | Reasuon sublime notepad...

PyCharm中的外部更改识别:终极解决方案指南

标题&#xff1a;PyCharm中的外部更改识别&#xff1a;终极解决方案指南 引言 PyCharm&#xff0c;作为JetBrains公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;以其强大的功能和高效的代码编辑体验而广受开发者喜爱。然而&#xff0c;在开发过程中&#xf…...

Qt——QTCreater ui界面如何统一设置字体

第一步&#xff1a;来到 ui 设计界面&#xff0c;鼠标右键点击 改变样式表 第二步&#xff1a;选择添加字体 第三步&#xff1a;选择字体样式和大小&#xff0c;点击 ok 第四步&#xff1a;点击ok或apply&#xff0c;完成设置...

Linux驱动入门实验班day03-GPIO子系统概述

3.通用框架1——最简单方式1&#xff1a;执行命令cat /sys/kernel/debug/gpio查看串口信息 gpio4对应的下列 方式2&#xff1a; 对于按键GPIO4_14:对应第四组第14个引脚 gpiochip3 ,从96开始&#xff0c; 9614110&#xff1b;...

240803-沉侵式翻译插件配置Ollama的API实现网页及PDF文档的翻译

1. 在插件中点击Options按钮 2. 在开发者模式中启动Enable Beta Testing Features 3 在General中进行设置 ## 4. 在Expand中设置API的URL 5. Qwen&#xff1a;0.5B网页翻译效果 6. Qwen&#xff1a;0.5BPDF翻译效果 7. 参考文献 gemma - 给沉浸式翻译插件配置本地大模型o…...

HTML-08.表单标签

一.表单标签 场景&#xff1a;在网页中主要负责数据采集功能&#xff0c;如注册、登录等数据采集 标签&#xff1a;<form> 表单项&#xff1a;不同类型的input元素、下拉列表、文本域等 <input>:定义表单项。通过type属性控制输入形式 <select>:定义下拉列表…...

SAP ABAP se16n 双击跳转实现

参考老白 SAP小技巧 改造SE16N(九 双击跳转及字段描述优化) (qq.com) se16n 双击跳转实现 我的实现 se38 lse16nlcl 287行 call method cl_gui_control>set_focusexporting control alv_grid. *.....at the moment do detail view on double clickCALL METHOD cl_gu…...

Linux shell编程学习笔记68: curl 命令行网络数据传输工具 选项数量雷人(上)

0 前言 在网络时代&#xff0c;有经常需要在网络上传输数据&#xff0c;时我们需要通过网络下载文件&#xff0c;为了满足这种时代需要&#xff0c;Linux提供了众多网络命令&#xff0c;我们今天先研究curl命令。例如&#xff0c;我们可以使用 curl 从 URL 下载文件&#xff0…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...