STM32串口寄存器操作(转)

源:STM32串口寄存器操作

//USART.C/*********************************************************************************************************/
/* USART 收发  */
/* 陈鹏 20110611*/#include "SYSTEM.H"
#include "GPIO_INIT.H"
#include "USART.H"//定义串口通道号最大值
#define UART_ChMax 1//UART外设结构指针
static const  USART_TypeDef * USARTxN[5] = {USART1,USART2,USART3,UART4,UART5};//相关UART状态结构
typedef struct
{FlagStatus  NewDataFlag;//接收到新数据FlagStatus  BuffFull; //接收Buff满FlagStatus  IntRx; //是否开启中断接收u8 *RxBuff;//接收Buff指针u16 RxBuffSize;//接收缓冲区大小,一帧数据大小u16 UartRxCnt;//接收数据计数器
} UartRx_TypeDef;//UART1 接收状态结构 static UartRx_TypeDef UartRx[UART_ChMax + 1];// //加入以下代码,支持printf函数,而不需要选择use MicroLIB #if 1 #pragma import(__use_no_semihosting) //标准库需要的支持函数 struct __FILE {   int handle;   /* Whatever you require here. If the only file you are using is */   /* standard output using printf() for debugging, no file handling */   /* is required. */ }; /* FILE is typedef’ d in stdio.h. */ FILE __stdout; //定义_sys_exit()以避免使用半主机模式 _sys_exit(int x) { x = x; } //重定义fputc函数 int fputc(int ch, FILE *f) { UARTx_SendByte(0,(u8)ch);   return ch; } #endif
//end // /************************************************************************************************************************** 函数 : u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int)* 功能 : 串口初始化* 参数 : ch:通道选择,0->usart1;SYS_CLK当前系统时钟,Speed:串口速度,RX_Int:是否时能中断接受* 返回 : 0:成功,1:失败* 依赖 : 底层宏定义* 作者 : 陈鹏* 时间 : 20120403* 最后修改时间 : 20120403* 说明 : USART1~UART5,对应通道0~4 *************************************************************************************************************************/ u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int) {USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; //获取对应通道硬件基址指针   u32 clock;u8 irq_n;   float fclk;  if(ch > UART_ChMax)   return 1; //端口号超出范围   //初始化UART IODeviceClockEnable(DEV_AFIO,ENABLE);//复用功能AFIO时钟使能   switch (ch){     case 0: //通道0,USART1 ,TX:PA9;RX:PA10     {DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 时钟使能DeviceClockEnable(DEV_USART1,ENABLE);//USART 1 时钟使能       GPIOx_Init(GPIOA,BIT9,AF_PP, SPEED_10M);       //PA09,TXD只能设置成复用推挽输出GPIOx_Init(GPIOA,BIT10,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_USART1);//复位串口1irq_n = IRQ_USART1;//串口1中断号}break;
    case
1: //通道1,USART2 ,TX:PA2;RX:PA3     { DeviceClockEnable(DEV_GPIOA,ENABLE);//GPIO A 时钟使能DeviceClockEnable(DEV_USART2,ENABLE);//USART 2 时钟使能       GPIOx_Init(GPIOA,BIT2,AF_PP, SPEED_10M);       //PA2,TXD只能设置成复用推挽输出GPIOx_Init(GPIOA,BIT3,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_USART2);//复位串口2irq_n = IRQ_USART2;//串口2中断号}break;
    case
2: //通道2,USART3 ,TX:PD8;RX:PD9     {DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 时钟使能DeviceClockEnable(DEV_USART3,ENABLE);//USART 3 时钟使能       GPIOx_Init(GPIOD,BIT8,AF_PP, SPEED_10M);       //PD8,TXD只能设置成复用推挽输出GPIOx_Init(GPIOD,BIT9,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_USART3);//复位串口3irq_n = IRQ_USART3;//串口3中断号}break;
    case
3: //通道3,UART4 ,TX:PC10;RX:PC11     {DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 时钟使能DeviceClockEnable(DEV_UART4,ENABLE);//UART 4 时钟使能GPIOx_Init(GPIOC,BIT10,AF_PP, SPEED_10M); //PC10,TXD只能设置成复用推挽输出GPIOx_Init(GPIOD,BIT11,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_UART4);//复位串口3irq_n = IRQ_UART4;//串口3中断号}break;
    case
4: //通道4,UART5 ,TX:PC12;RX:PD2     {DeviceClockEnable(DEV_GPIOC,ENABLE);//GPIO C 时钟使能DeviceClockEnable(DEV_GPIOD,ENABLE);//GPIO D 时钟使能DeviceClockEnable(DEV_UART5,ENABLE);//UART 5 时钟使能GPIOx_Init(GPIOC,BIT12,AF_PP, SPEED_10M); //PC12,TXD只能设置成复用推挽输出GPIOx_Init(GPIOD,BIT2,IN_FLOATING,IN_IN); //浮空输入DeviceReset(DEV_UART5);//复位串口3irq_n = IRQ_UART5;//串口3中断号}break;
    default
:
      return 1;//端口号超出范围,返回错误   }
  //
设置波特率分频系数clock = SYS_CLK * 1000000;//USART1时钟   if(ch > 0)clock /= 2; //USART2,3,4,5时钟fclk = (float)clock / 16.0 / Speed;//计算波特率分频系数clock = (u16)fclk;//得到波特率分频系数整数部分 UARTx->BRR = clock << 4;//设置波特率整数部分fclk -= clock;//得到波特率分频系数小数部分fclk *= 16;UARTx->BRR |= 0xf & (u16)fclk;//设置波特率小数部分   //配置UARTUARTx->CR1 = 0x2000;//使能USART,1个开始位,8位数据UARTx->CR1 |= 0x8;//置TE = 1;发送使能;发送第一个空闲位UARTx->CR1 |= 0x04;//RE = 1;接收使能SetUartRxBuff(ch,0,NULL);//设置串口接收缓冲区UARTx_ClearRxInt(ch); //清除串口接收中断标志   if(RX_Int){UARTx->CR1 |= 0x20;//RXNEIE = 1,开RXNE中断,即开启接收中断NVIC_IntEnable(irq_n,1);//开启USART1全局中断UartRx[ch].IntRx = SET;//中断接收标志有效   }   else{NVIC_IntEnable(irq_n,0);     //关闭USART全局中断UartRx[ch].IntRx = RESET;//中断接收标志无效   }UARTx_SendByte(0,'S');//发送一字节数据 }/************************************************************************************************************************** 函数 : u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg)* 功能 : 串口配置 * 参数 : ch:通道选择,0->usart1;cfg:串口配置结构指针 * 返回 : 0:成功,非0:失败 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20120408* 最后修改时间 : 20120408* 说明 : USART1~UART5,对应通道0~4 ,返回1:校验设置错误,2:停止位设置错误,3:通道超出范围 *************************************************************************************************************************/ u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg){ USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; //获取对应通道硬件基址指针if(ch > UART_ChMax)//判断端口是否超出范围 return 3; UARTx_PowerDown(ch);//进入掉电模式,进行配置 switch (cfg->OddEvenVerify)//设置校验位 { case UART_VERIFY_NULL://无校验 { UARTx->CR1 &= ~BIT12;//一个起始位,8个数据位 UARTx->CR1 &= ~BIT10;//禁止校验控制 }break; case UART_ODD://奇校验 { UARTx->CR1 |= BIT12;//一个起始位,9个数据位 UARTx->CR1 |= BIT10;//使能校验控制 UARTx->CR1 |= BIT9;//奇校验 }break; case UART_EVEN://偶校验 { UARTx->CR1 |= BIT12;//一个起始位,9个数据位 UARTx->CR1 |= BIT10;//使能校验控制 UARTx->CR1 &= ~BIT9;//偶校验 }break; default : { UARTx_PowerOn(ch);//串口重新上电 return 1; //设置错误,返回校验设置错误1 } } if(cfg->StopBitWidth == UART_STOP_1BIT) //设置停止位 { UARTx->CR2 &= ~(0x3 << 12);//清除设置,默认一个停止位 } else if(cfg->StopBitWidth == UART_STOP_2BIT) { UARTx->CR2 &= ~(0x3 << 12); UARTx->CR2 |= (0x2 << 12);//2个停止位 } else { UARTx_PowerOn(ch);//串口重新上电 return 2; //停止位设置错误,返回错误2 } UARTx_PowerOn(ch);//串口重新上电return 0; //设置完成,返回0 }/************************************************************************************************************************** 函数 : void UARTx_SendByte(u8 ch,u8 data)* 功能 : UART单字节发送 * 参数 : ch:通道号,dataL:要发送的数据 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 通道号为0 - 4;*************************************************************************************************************************/void UARTx_SendByte(u8 ch,u8 data){ USART_TypeDef *UARTx = (USART_TypeDef *)USARTxN[ch]; //获取对应通道硬件基址指针if(ch > UART_ChMax)//判断端口是否超出范围 return;while(!(UARTx->SR & 0x80));//等待发送寄存器为空,(否则连续发送时数据易丢失 )UARTx->DR = data;//发送数据 while(!(UARTx->SR & 0x40));//等待TC = 1;也就是发送完成 UARTx->SR &= ~(1 << 6);//清除发送完成标志 }/************************************************************************************************************************** 函数 : void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number)* 功能 : UART数据发送函数 * 参数 : ch:通道号,tx_buff:发送缓冲区,byte_number:需要发送的字节 * 返回 : 无 * 依赖 : void UART_SendByte(u8 ch,u8 data)* 作者 : 陈鹏 * 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 非DMA方式,非FIFO方式发送 *************************************************************************************************************************/ void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number){ u8 i;if(ch > UART_ChMax)//判断端口是否超出范围 return; for(i = 0;i < byte_number;i++)//循环发送,直至发送完毕 { UARTx_SendByte(ch,tx_buff[i]); }}/************************************************************************************************************************** 函数 : void UARTx_PowerDown(u8 ch)* 功能 : UART掉电 * 参数 : ch:通道选择 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 进入低功耗模式;通道号为0 - 4;*************************************************************************************************************************/void UARTx_PowerDown(u8 ch){ if(ch > UART_ChMax)//判断端口是否超出范围 return; ((USART_TypeDef *)USARTxN[ch])->BRR |= (1 << 13);//UE位写一,开启低功耗 }/************************************************************************************************************************** 函数 : void UARTx_PowerOn(u8 ch)* 功能 : UART上电 * 参数 : ch:通道选择 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 退出低功耗模式;通道号为0 - 4;*************************************************************************************************************************/void UARTx_PowerOn(u8 ch){ if(ch > UART_ChMax)//判断端口是否超出范围 return;((USART_TypeDef *)USARTxN[ch])->BRR &= ~(1 << 13);//UE位清零,退出低功耗模式 }/************************************************************************************************************************** 函数 : u8 GetUartNewFlag(u8 ch)* 功能 : 获取串口新数据标志 * 参数 : ch:通道选择 * 返回 : 1:有新数据,0:无新数据 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 用于判断是否有新的数据,会清除掉新数据标志的 *************************************************************************************************************************/ u8 GetUartNewFlag(u8 ch){ if(ch > UART_ChMax)//判断端口是否超出范围 return 0;if(UartRx[ch].IntRx == SET)//开启了中断接收 { if(UartRx[ch].NewDataFlag == SET) //有新数据 { UartRx[ch].NewDataFlag = RESET;//清除标志 return 1; //返回有新数据 } else return 0; //无新数据 } else //没开启中断接收 { if(((USART_TypeDef *)USARTxN[ch])->SR & BIT5)//RXNE=1,接收到新数据 { ((USART_TypeDef *)USARTxN[ch])->SR &= ~BIT5;//清除标志 return 1; } else return 0; }}/************************************************************************************************************************** 函数 : u8 GetUartRxBuffFullFlag(u8 ch)* 功能 : 获取串口接收缓冲区满标志 * 参数 : ch:通道选择 * 返回 : 1:有新数据,0:无新数据 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 用于判断接收缓冲区是否满,会清除标志 *************************************************************************************************************************/ u8 GetUartRxBuffFullFlag(u8 ch){ if(ch > UART_ChMax)//判断端口是否超出范围 return 0; if(UartRx[0].BuffFull == SET)//缓冲区已满 { UartRx[0].BuffFull = RESET;//清除满标志 return 1; } return 0;}/************************************************************************************************************************** 函数 : void UART_ClearRxInt(u8 ch)* 功能 : 清除串口接收中断标志 * 参数 : ch:通道选择 * 返回 : 物 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 用于清除接收标志 *************************************************************************************************************************/ void UARTx_ClearRxInt(u8 ch){ if(ch > UART_ChMax)//判断端口是否超出范围 return; ((USART_TypeDef *)USARTxN[ch])->SR &= ~BIT5;//清除标志
}
/************************************************************************************************************************** 函数 : u8 GetUartNewData(u8 ch)* 功能 : 获取串口新数据 * 参数 : ch:通道选择 * 返回 : 收到的数据 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 用于接收一个字节数据 *************************************************************************************************************************/ u8 GetUartNewData(u8 ch){ if(ch > UART_ChMax)//判断端口是否超出范围 return 0;return (((USART_TypeDef *)USARTxN[ch])->DR);//返回数据 }/************************************************************************************************************************** 函数 : void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff)* 功能 : 设置串口接收缓冲区 * 参数 : ch:通道选择,RxBuffSize:缓冲区大小,RxBuff:缓冲区指针 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20120403* 最后修改时间 : 20120403* 说明 : 一定要设置,否则开启中断接收时可能会异常 *************************************************************************************************************************/ void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff){ if(ch > UART_ChMax)//判断端口是否超出范围 return; UartRx[ch].RxBuffSize = RxBuffSize; //设置缓冲区大小 UartRx[ch].RxBuff = RxBuff;//设置缓冲区指针 UartRx[0].UartRxCnt = 0;//计数器清零 }/************************************************************************************************************************** 函数 : void USART1_IRQHandler (void)* 功能 : UART1中断接收函数 * 参数 : 无 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20110611* 最后修改时间 : 20120403* 说明 : 无 *************************************************************************************************************************/ void USART1_IRQHandler (void){ if((USART1->SR & BIT2) || (USART1->SR & BIT1))//如果NE = 1发送噪声错误 //如果FE = 1,发送帧错误 { if(USART1->SR); if(USART1->DR);//复位NE操作序列 } else if(UartRx[0].RxBuffSize > 0)//接收缓冲区大于0 { (UartRx[0].RxBuff)[(UartRx[0].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区 if(UartRx[0].UartRxCnt == UartRx[0].RxBuffSize)//缓冲区已满 {UartRx[0].UartRxCnt = 0;//接收计数器清零UartRx[0].BuffFull = SET;//缓冲区已满标志 } } UartRx[0].NewDataFlag = SET;//收到新数据标志 UARTx_ClearRxInt(0); //清除串口接收中断标志 }#if UART_ChMax > 0/************************************************************************************************************************** 函数 : void USART2_IRQHandler (void)* 功能 : UART2中断接收函数 * 参数 : 无 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20110611* 最后修改时间 : 20120403* 说明 : 无 *************************************************************************************************************************/ void USART2_IRQHandler (void){ if((USART2->SR & BIT2) || (USART2->SR & BIT1))//如果NE = 1发送噪声错误 //如果FE = 1,发送帧错误 { if(USART2->SR); if(USART2->DR);//复位NE操作序列 } else if(UartRx[1].RxBuffSize > 0)//接收缓冲区大于0 { (UartRx[1].RxBuff)[(UartRx[1].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区 if(UartRx[1].UartRxCnt == UartRx[1].RxBuffSize)//缓冲区已满 {UartRx[1].UartRxCnt = 0;//接收计数器清零UartRx[1].BuffFull = SET;//缓冲区已满标志 } } UartRx[1].NewDataFlag = SET;//收到新数据标志 UARTx_ClearRxInt(1); //清除串口接收中断标志 }#endif#if UART_ChMax > 1/************************************************************************************************************************** 函数 : void USART3_IRQHandler (void)* 功能 : UART3中断接收函数 * 参数 : 无 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20110611* 最后修改时间 : 20120403* 说明 : 无 *************************************************************************************************************************/ void USART3_IRQHandler (void){ if((USART3->SR & BIT2) || (USART3->SR & BIT1))//如果NE = 1发送噪声错误 //如果FE = 1,发送帧错误 { if(USART3->SR); if(USART3->DR);//复位NE操作序列 } else if(UartRx[2].RxBuffSize > 0)//接收缓冲区大于0 { (UartRx[2].RxBuff)[(UartRx[2].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区 if(UartRx[2].UartRxCnt == UartRx[2].RxBuffSize)//缓冲区已满 {UartRx[2].UartRxCnt = 0;//接收计数器清零UartRx[2].BuffFull = SET;//缓冲区已满标志 } } UartRx[2].NewDataFlag = SET;//收到新数据标志 UART_ClearRxInt(2); //清除串口接收中断标志 }#endif#if UART_ChMax > 2/************************************************************************************************************************** 函数 : void UART4_IRQHandler (void)* 功能 : UART4中断接收函数 * 参数 : 无 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20110611* 最后修改时间 : 20120403* 说明 : 无 *************************************************************************************************************************/ void UART4_IRQHandler (void){ if((UART4->SR & BIT2) || (UART4->SR & BIT1))//如果NE = 1发送噪声错误 //如果FE = 1,发送帧错误 { if(UART4->SR); if(UART4->DR);//复位NE操作序列 } else if(UartRx[3].RxBuffSize > 0)//接收缓冲区大于0 { (UartRx[3].RxBuff)[(UartRx[3].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区 if(UartRx[3].UartRxCnt == UartRx[3].RxBuffSize)//缓冲区已满 {UartRx[3].UartRxCnt = 0;//接收计数器清零UartRx[3].BuffFull = SET;//缓冲区已满标志 } } UartRx[3].NewDataFlag = SET;//收到新数据标志 UART_ClearRxInt(3); //清除串口接收中断标志 }#endif#if UART_ChMax > 3/************************************************************************************************************************** 函数 : void UART5_IRQHandler (void)* 功能 : UART5中断接收函数 * 参数 : 无 * 返回 : 无 * 依赖 : 底层宏定义 * 作者 : 陈鹏 * 时间 : 20110611* 最后修改时间 : 20120403* 说明 : 无 *************************************************************************************************************************/ void UART5_IRQHandler (void){ if((UART5->SR & BIT2) || (UART5->SR & BIT1))//如果NE = 1发送噪声错误 //如果FE = 1,发送帧错误 { if(UART5->SR); if(UART5->DR);//复位NE操作序列 } else if(UartRx[4].RxBuffSize > 0)//接收缓冲区大于0 { (UartRx[4].RxBuff)[(UartRx[4].UartRxCnt) ++] = USART1->DR;//将数据存放到缓冲区 if(UartRx[4].UartRxCnt == UartRx[4].RxBuffSize)//缓冲区已满 {UartRx[4].UartRxCnt = 0;//接收计数器清零UartRx[4].BuffFull = SET;//缓冲区已满标志 } } UartRx[4].NewDataFlag = SET;//收到新数据标志 UART_ClearRxInt(4); //清除串口接收中断标志 }#endif#undef UART_ChMax
 //USART.H/**************************************************************************************************//* USART 通用同步异步串行发送接收*//* 陈鹏 20110609*/#ifndef _USART_H#define _USART_H#include "system.h"#include "stdio.h"//UART配置相关结构定义
typedef struct
{u8 OddEvenVerify;//奇偶校验,奇,偶,无u8 StopBitWidth;//停止位位宽1,2
} UART_Config_TypeDef;//奇偶校验
#define UART_VERIFY_NULL 0//无校验
#define UART_ODD 1//奇校验
#define UART_EVEN 2//偶校验
//停止位
#define UART_STOP_1BIT 0//一个停止位
#define UART_STOP_2BIT 1//2个停止位//相关API
u8 UARTx_Init(u8 ch,u8 SYS_CLK,u32 Speed,u8 RX_Int);//串口初始化
u8 UARTx_Config(u8 ch,UART_Config_TypeDef * cfg);  //串口配置
void UARTx_SendByte(u8 ch,u8 data); //UART单字节发送
void UARTx_TX(u8 ch,u8 *tx_buff,u16 byte_number);  //UART数据发送函数
void UARTx_PowerDown(u8 ch); //UART掉电
void UARTx_PowerOn(u8 ch); //UART上电
u8 GetUartNewFlag(u8 ch); //获取串口新数据标志
u8 GetUartRxBuffFullFlag(u8 ch); //获取串口接收缓冲区满标志
u8 GetUartNewData(u8 ch); //获取串口新数据
void SetUartRxBuff(u8 ch,u16 RxBuffSize,u8 *RxBuff);//设置串口接收缓冲区
void UARTx_ClearRxInt(u8 ch); //清除串口接收中断标志#endif

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544402.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Ubuntu】Ubuntu 20.04无法识别网口/以太网/有线网卡

这里写自定义目录标题0.症状1.查看网卡类型2.下载网卡驱动3.安装网卡驱动0.症状 \qquad表现为插入以太网网口后右上角没有显示网络&#xff0c;即没有下图的音量左侧的标志 打开设置的【网络】选项没有以太网接入&#xff0c;然而以太网口信号灯仍然正常闪烁。这种情况基本可以…

小心Lombok用法中的坑

刚才写完了代码&#xff0c;自测的时候&#xff0c;出现了NPE问题。排查的时候发现是Lombok的坑&#xff0c;以前也遇到过&#xff0c;所以觉得有必要过来记录一下。我先描述一下现象&#xff0c;我的代码里面订单服务A 需要调用缓存服务B&#xff0c;服务B就是一个Bean&#x…

Java BigDecimal negate()方法与示例

BigDecimal类的negate()方法 (BigDecimal Class negate() method) Syntax: 句法&#xff1a; public BigDecimal negate();public BigDecimal negate(MathContext ma_co);negate() method is available in java.math package. negate()方法在java.math包中可用。 negate() met…

【VSCode】VSCode使用conda环境时找不到python包/找不到Module

这里写自定义目录标题0.问题描述1.原因2.解决方法0.问题描述 \qquad首先需要排除是否是VSCode未配置conda环境的问题&#xff0c;当然&#xff0c;相信VSCode的老粉都不会犯这个低级错误&#xff0c;请CtrlP&#xff0c;在搜索框>select interpreter检查一下python环境。 …

PS如何对JPG文件直接抠图

如何JPG文件直接抠图 先转为智能对象&#xff1a; 再栅格化图层 此进即可直接进行抠图&#xff01;

更快的Maven来了,我的天,速度提升了8倍!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;周末被 maven-mvnd 刷屏了&#xff0c;于是我也下载了一个 mvnd 体验了一把。虽然测试的数据都是基于我本地项目&#xff0c…

java bitset_Java BitSet intersects()方法与示例

java bitsetBitSet类intersects()方法 (BitSet Class intersects() method) intersects() method is available in java.util package. intersects()方法在java.util包中可用。 intersects() method is used to check the common number of bits set to true in both the BitSe…

【C++】For循环同时初始化两个及以上个变量

文章目录0.引言1.初始化同类型变量2.初始化两个不同类型的变量0.引言 \qquadC的for循环在初始化时可以通过类型定义符直接初始化两个相同类型的变量&#xff0c;但是对于不同类型的变量是不可以直接初始化的&#xff0c;若想达到类似python的zip()函数的多类型多变量迭代的效果…

Java 中接口和抽象类竟然有 7 点不同?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录《Java常见面试题》系列&#xff1a;https://gitee.com/mydb/interviewJava 是一门面向对象的编程语言&am…

粉丝不在于多,在于够残

李善友&#xff1a;所有可能被互联网取代的组织一定会被取代 2015-07-30 格局视野 格局视野 格局视野 微信号 geju365 功能介绍 格局生涯学院官方自媒体。面向互联网人的在线商学院。推送互联网行业知识&#xff0c;培养互联网实操人才。聚焦新行业、新模式、新公司、新人物。…

优化的交换排序(冒泡排序)_C程序实现优化的冒泡排序

优化的交换排序(冒泡排序)Bubble Sort is a simple, stable, and in-place sorting algorithm. Due to its simplicity, it is widely used as a sorting algorithm by computer programmers. 气泡排序是一种简单&#xff0c;稳定且就地的排序算法。 由于其简单性&#xff0c;它…

保姆级教学:缓存穿透、缓存击穿和缓存雪崩!

前言对于从事后端开发的同学来说&#xff0c;缓存已经变成的项目中必不可少的技术之一。没错&#xff0c;缓存能给我们系统显著的提升性能。但如果你使用不好&#xff0c;或者缺乏相关经验&#xff0c;它也会带来很多意想不到的问题。今天我们一起聊聊如果在项目中引入了缓存&a…

Fast Global Registration (ECCV 2016) 论文解析

目录0.友情链接1. 论文核心思想1.1. 点云特征匹配1.2. 两个校验1.3. 鲁棒函数与BR对偶1.4.1. Black-Rangarjan Duality (BR对偶性&#xff09;1.4.2.Derivation of Φρ\Phi_\rhoΦρ​1.4.3.E(T,L)E(\bm{T},L)E(T,L)的优化求解方法4.写在后面0.友情链接 FGR基本介绍 CSDN博客…

系统盘压缩卷小于可用空间_操作系统中的可用空间管理

系统盘压缩卷小于可用空间可用空间管理 (Free space management) As we know that the memory space in the disk is limited. So we need to use the space of the deleted files for the allocation of the new file. one optical disk allows only one write at a time in t…

关于头文件是否参与编译的讨论

一、文章来由 写项目的时候发现了这个问题&#xff0c;又是一个比较底层的问题&#xff0c;首先说明&#xff0c;这篇文章只是我根据查阅的资料和做的实验提出的一个讨论&#xff0c;并不一定就是正确答案。因为这个问题网上众说纷纭&#xff0c;我很欢迎大家参与这个讨论&…

Log4j漏洞?一行代码都不改就能永久修复?

△Hollis, 一个对Coding有着独特追求的人△作者 l Hollis来源 l Hollis&#xff08;ID&#xff1a;hollischuang&#xff09;这篇文章我周一发过&#xff0c;但是因为一些"人在江湖、身不由己"的原因&#xff0c;原文删除了&#xff0c;但是很多人找我还是想看看内容…

服务器自动抢占GPU运行程序

其原理是通过nvidia-smi扫描每块显卡上的内存&#xff0c;然后查询已经使用的内存&#xff0c;若已经使用的显卡内存不大于一个阈值&#xff0c;则运行python脚本&#xff08;你也可以替换成别的命令&#xff09; #!/bin/bash var0 ocp_memory${2:-500} while [ $var -eq 0 ] …

java range类_Java即时类| range()方法与示例

java range类即时类range()方法 (Instant Class range() method) range() method is available in java.time package. range()方法在java.time包中可用。 range() method is used to get the valid range of values for the given TemporalField. range()方法用于获取给定Temp…

ubuntu安装eclipse

2019独角兽企业重金招聘Python工程师标准>>> 在Ubuntu 13.04下的安装eclipse 一、eclipse安装过程 首先确保在安装eclipse之前已经安装好Java虚拟机 1. eclipse官网下载压缩包 下载地址&#xff1a;http://www.eclipse.org/downloads/download.php?file/technology…

java的parse方法_Java即时类| parse()方法与示例

java的parse方法即时类parse()方法 (Instant Class parse() method) parse() method is available in java.time package. parse()方法在java.time包中可用。 parse() method is used to get an Instant that parses the given char sequence and char sequence follow some st…