当前位置: 首页 > 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…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...