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

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

以光量子为例,详解量子获取方式

光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学&#xff08;silicon photonics&#xff09;的光波导&#xff08;optical waveguide&#xff09;芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中&#xff0c;光既是波又是粒子。光子本…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…...