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 使用一段时间了,反正芯片BUG 是比较多了,比如串口接收错误后导致再也无法接收,PWM模块无法输出 低电平 , CAN 接收错误导致 输出引脚 CAN_TXD 一直输出脉冲 。。。;好的一面也存在吧,IO 引脚…...

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

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

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

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

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

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

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

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

C++笔记---类和对象(中)
1. 类的默认成员函数 默认成员函数就是用户没有显式实现,编译器会自动生成的成员函数称为默认成员函数。 一个类,我们不写的情况下编译器会默认生成以下6个默认成员函数,分别为:构造函数,析构函数,拷贝构…...

【C++】入门基础知识
河流之所以能够到达目的地,是因为它懂得怎样避开障碍。💓💓💓 目录 ✨说在前面 🍋知识点一:C的发展历史 • 🌰1.C发展历史 • 🌰2.C的迭代与更新 • 🌰3.编程语言排…...

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

vim、sublime、notepad文本编辑器的使用
VIM: Windows上配置gvim并作为C和C的IDE Windows上配置gvim并作为C和C的IDE | Reasuon sublime notepad...

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

Qt——QTCreater ui界面如何统一设置字体
第一步:来到 ui 设计界面,鼠标右键点击 改变样式表 第二步:选择添加字体 第三步:选择字体样式和大小,点击 ok 第四步:点击ok或apply,完成设置...

Linux驱动入门实验班day03-GPIO子系统概述
3.通用框架1——最简单方式1:执行命令cat /sys/kernel/debug/gpio查看串口信息 gpio4对应的下列 方式2: 对于按键GPIO4_14:对应第四组第14个引脚 gpiochip3 ,从96开始, 9614110;...

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

HTML-08.表单标签
一.表单标签 场景:在网页中主要负责数据采集功能,如注册、登录等数据采集 标签:<form> 表单项:不同类型的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 前言 在网络时代,有经常需要在网络上传输数据,时我们需要通过网络下载文件,为了满足这种时代需要,Linux提供了众多网络命令,我们今天先研究curl命令。例如,我们可以使用 curl 从 URL 下载文件࿰…...

马尔科夫决策过程
马尔科夫决策过程 贝尔曼方程 贝尔曼方程(Bellman Equation)是动态规划中的一个核心概念,用于解决最优决策问题。贝尔曼方程通过递归的方式,将问题分解为子问题,从而使得最优策略的求解变得可行。贝尔曼方程广泛应用…...

未知攻焉知防:从攻击者视角看网络安全的“攻守之道”
自首届网络安全攻防实战演练开展以来,这一活动已成为网络安全领域备受关注的大事件。今年,攻防实战演练更上升到了一个全新高度,包括行动任务数量、演练周期时长、攻击强度以及演练类别等,较以往都有极大提升,堪称“史…...

数字孪生赋能智慧城市大脑智建设方案(可编辑65页PPT)
引言:随着科技的飞速发展,智慧城市的建设已成为全球城市发展的新趋势。数字孪生技术作为其中的关键技术之一,正逐步赋能智慧城市大脑的建设,推动城市治理从数字化向智能化、智慧化转型升级。本方案旨在简要介绍数字孪生赋能智慧城…...

c++----内存管理
okk,大家好。我们大家学习了鄙人的前面前面几篇博客,并且还稍微使用了一些c的基础知识。并且我们前面都说过,我们前面学习的知识都说过。我们前面的几篇博客都是我们以后使用c基础。但是我们大家都知道现在代码都关注什么时间啊,内…...

C++——哈希结构
1.unordered系列关联式容器 本节主要介绍unordered_map和unordered_set两个容器,底层使用哈希实现的 unordered_map 1.unordered_map是储存<key,value>键值对的关联式容器,其允许通过key快速查找到对应的value,和map非常相似&#x…...

智能小程序 Ray 开发面板 SDK —— 无线开关一键执行模板教程(一)
1. 准备工作 前提条件 已阅读 Ray 新手村任务,了解 Ray 框架的基础知识已阅读 使用 Ray 开发万能面板,了解 Ray 面板开发的基础知识 构建内容 在此 Codelab 中,您将利用面板小程序开发构建出一个支持一键执行及自动化的无线开关面板&…...

rockDB(1)
文章目录 概述编译rocksdb压缩库 基本接口 小结 概述 RocksDB 是 Facebook 的一个实验项目,目的是希望能开发一套能在服务器压力下,真正发挥高 速存储硬件性能的高效数据库系统。这是一个C库,允许存储任意长度二进制 KV 数据。支持原 子读写…...

[element-ui] 自动获取el-input的焦点
<el-input v-model"filterPlanName" ref"autoFocus" ></el-input>this.$nextTick((_) > {this.$refs.autoFocus.focus(); })参考: [element-ui]自动获取el-input的焦点...

智能闹钟的睡眠评估算法是如何工作的呢
智能闹钟的睡眠评估算法是智能闹钟功能的核心部分,它主要通过以下几个步骤来工作: 一、数据收集 传感器数据:智能闹钟内置多种传感器,如心率传感器、呼吸传感器、体动传感器以及环境传感器(如温度、湿度、光线传感器…...

Vue + View-ui-plus Upload实现手动上传
本文实现Vue Upload组件多文件手动上传,支持上传图片(image)、压缩文件(zip/rar)、表格(excel)、pdf 一、dom结构 <Row><Col :span"19"></Col><Col :span"2"><div class"ivu-btn-uplo…...