• STM32 定时器1应用+PWM输入捕获输出设置


    一、前言

    分享2024第一篇文章,总用到各种定时器,普通定时器都还简单一些,将普通定时器使用其他功能后使用高级定时器1去做定时功能反而遇到一些小问题,这里分享出来,在扩展记录一下pwm使用。

    二、环境

    stm32f103vxxx

    kiel5 

    三、正文

    话不多说,上代码

    1. #include "timer.h"
    2. #include "usart.h"
    3. long ticket1,ticket2,ticket3,ticket4;
    4. long number1,number2,number3,number4;
    5. unsigned int onesecond=0;
    6. unsigned int modeflag=0;
    7. //外部中断0服务程序
    8. void EXTIX_Init(void)
    9. {
    10. GPIO_InitTypeDef GPIO_InitStructure;
    11. EXTI_InitTypeDef EXTI_InitStructure;
    12. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTE时钟
    13. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
    14. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
    15. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //设置输入,外部有上拉,无需在上拉
    16. GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOE2,3,4
    17. //GPIOC.0 中断线以及中断初始化配置 下降沿触发
    18. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource0);
    19. EXTI_InitStructure.EXTI_Line=EXTI_Line0;
    20. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    21. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    22. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    23. EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    24. //GPIOC.1 中断线以及中断初始化配置 下降沿触发
    25. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource1);
    26. EXTI_InitStructure.EXTI_Line=EXTI_Line1;
    27. EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    28. //GPIOC.2 中断线以及中断初始化配置 下降沿触发
    29. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource2);
    30. EXTI_InitStructure.EXTI_Line=EXTI_Line2;
    31. EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    32. //GPIOC.3 中断线以及中断初始化配置 下降沿触发
    33. GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3);
    34. EXTI_InitStructure.EXTI_Line=EXTI_Line3;
    35. EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    36. EXTIX_NVIC_Init(DISABLE);
    37. }
    38. //是否开启外部引脚中断
    39. //0:DISABLE 1:ENABLE;
    40. void EXTIX_NVIC_Init(FunctionalState status)
    41. {
    42. NVIC_InitTypeDef NVIC_InitStructure;
    43. //NVIC
    44. NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键WK_UP所在的外部中断通道
    45. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级2,
    46. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级3
    47. NVIC_InitStructure.NVIC_IRQChannelCmd = status;//0:DISABLE 1:ENABLE; //使能外部中断通道
    48. NVIC_Init(&NVIC_InitStructure);
    49. NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn; //使能按键KEY2所在的外部中断通道
    50. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级2,
    51. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级2
    52. NVIC_InitStructure.NVIC_IRQChannelCmd = status;//0:DISABLE 1:ENABLE; //使能外部中断通道
    53. NVIC_Init(&NVIC_InitStructure);
    54. NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键KEY2所在的外部中断通道
    55. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级2,
    56. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级2
    57. NVIC_InitStructure.NVIC_IRQChannelCmd = status;//0:DISABLE 1:ENABLE; //使能外部中断通道
    58. NVIC_Init(&NVIC_InitStructure);
    59. NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn; //使能按键KEY2所在的外部中断通道
    60. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; //抢占优先级2,
    61. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级2
    62. NVIC_InitStructure.NVIC_IRQChannelCmd = status;//0:DISABLE 1:ENABLE; //使能外部中断通道
    63. NVIC_Init(&NVIC_InitStructure);
    64. ticket1=0;
    65. ticket2=0;
    66. ticket3=0;
    67. ticket4=0;
    68. }
    69. //外部中断0服务程序
    70. void EXTI0_IRQHandler(void)
    71. {
    72. EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位
    73. number1++;
    74. }
    75. //外部中断2服务程序
    76. void EXTI1_IRQHandler(void)
    77. {
    78. EXTI_ClearITPendingBit(EXTI_Line1); //清除LINE1上的中断标志位
    79. number2++;
    80. }
    81. //外部中断3服务程序
    82. void EXTI2_IRQHandler(void)
    83. {
    84. EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中断标志位
    85. number3++;
    86. }
    87. //外部中断4服务程序
    88. void EXTI3_IRQHandler(void)
    89. {
    90. EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位
    91. number4++;
    92. }
    93. //通用定时器1中断初始化
    94. //arr:自动重装值。
    95. //psc:时钟预分频数
    96. //这里使用的是定时器1
    97. void TIM1_Int_Init(u16 arr,u16 psc)
    98. {
    99. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    100. NVIC_InitTypeDef NVIC_InitStructure;
    101. RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
    102. //定时器TIM3初始化
    103. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    104. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    105. TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    106. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
    107. TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//加上这句,否则定时器1不好使,很慢
    108. TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
    109. TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM1中断,允许更新中断
    110. //中断优先级NVIC设置
    111. NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn; //TIM1中断
    112. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级
    113. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //从优先级3级
    114. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    115. NVIC_Init(&NVIC_InitStructure); //初始化NVIC寄存器
    116. TIM_Cmd(TIM1, ENABLE); //使能TIMx
    117. }
    118. //定时器1中断服务程序
    119. unsigned int ledflag=0;
    120. void TIM1_UP_IRQHandler(void) //TIM3中断
    121. {
    122. if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET) //检查TIM1更新中断发生与否
    123. {
    124. //定时标志
    125. ledflag++;
    126. //串口接收等待
    127. if(g_Uart1_Timer>0)//如果开始接收,进行计数判断超时
    128. g_Uart1_Timer++;
    129. if(g_Uart2_Timer>0)//如果开始接收,进行计数判断超时
    130. g_Uart2_Timer++;
    131. //pwm采集
    132. onesecond++;
    133. if(onesecond>200){
    134. onesecond=0;
    135. modeflag++;
    136. if(modeflag>4)
    137. modeflag=0;
    138. if(modeflag==0)EXTIX_NVIC_Init(ENABLE);
    139. else if(modeflag==2)EXTIX_NVIC_Init(DISABLE);
    140. ticket1=number1;
    141. number1=0;
    142. ticket2=number2;
    143. number2=0;
    144. ticket3=number3;
    145. number3=0;
    146. ticket4=number4;
    147. number4=0;
    148. }
    149. TIM_ClearITPendingBit(TIM1, TIM_IT_Update ); //清除TIMx更新中断标志
    150. }
    151. }
    152. void TIM2_PWM_Init(u16 arr,u16 psc)
    153. {
    154. GPIO_InitTypeDef GPIO_InitStructure;
    155. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    156. TIM_OCInitTypeDef TIM_OCInitStructure;
    157. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //使能定时器2时钟
    158. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
    159. //GPIO_PinRemapConfig(GPIO_Remap_TIM2, ENABLE); //Timer2部分重映射
    160. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //TIM2_CH2
    161. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    162. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    163. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
    164. //初始化TIM2
    165. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    166. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    167. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    168. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
    169. TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    170. //初始化TIM2 Channel 2 PWM模式
    171. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
    172. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    173. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    174. TIM_OCInitStructure.TIM_Pulse = 0;//初始状态占空比为0
    175. TIM_OC2Init(TIM2, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM2 OC2
    176. TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器
    177. TIM_Cmd(TIM2, ENABLE); //使能TIM2
    178. }
    179. void TIM3_PWM_Init(u16 arr,u16 psc)
    180. {
    181. GPIO_InitTypeDef GPIO_InitStructure;
    182. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    183. TIM_OCInitTypeDef TIM_OCInitStructure;
    184. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟
    185. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
    186. //GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射
    187. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM3_CH2
    188. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    189. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    190. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
    191. //初始化TIM3
    192. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    193. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    194. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    195. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
    196. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    197. //初始化TIM3 Channel 2 PWM模式
    198. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
    199. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    200. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    201. TIM_OCInitStructure.TIM_Pulse = 0;//初始状态占空比为0
    202. TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2
    203. TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器
    204. TIM_Cmd(TIM3, ENABLE); //使能TIM3
    205. }
    206. void TIM4_PWM_Init(u16 arr,u16 psc)
    207. {
    208. GPIO_InitTypeDef GPIO_InitStructure;
    209. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    210. TIM_OCInitTypeDef TIM_OCInitStructure;
    211. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟
    212. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
    213. //GPIO_PinRemapConfig(GPIO_Remap_TIM4, ENABLE); //Timer4部分重映射
    214. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //TIM4_CH1
    215. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    216. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    217. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
    218. //初始化TIM4
    219. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    220. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    221. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    222. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
    223. TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    224. //初始化TIM4 Channel 1 PWM模式
    225. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
    226. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    227. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    228. TIM_OCInitStructure.TIM_Pulse = 0;//初始状态占空比为0
    229. TIM_OC1Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
    230. TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
    231. TIM_Cmd(TIM4, ENABLE); //使能TIM4
    232. }
    233. void TIM5_PWM_Init(u16 arr,u16 psc)
    234. {
    235. GPIO_InitTypeDef GPIO_InitStructure;
    236. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    237. TIM_OCInitTypeDef TIM_OCInitStructure;
    238. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //使能定时器5时钟
    239. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
    240. //GPIO_PinRemapConfig(GPIO_Remap_TIM5, ENABLE); //Timer5部分重映射
    241. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM5_CH1 TIM5_CH1
    242. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    243. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    244. GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO
    245. //初始化TIM5
    246. TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    247. TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    248. TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    249. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
    250. TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    251. //初始化TIM5 Channel 1 PWM模式
    252. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
    253. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
    254. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
    255. TIM_OCInitStructure.TIM_Pulse = 0;//初始状态占空比为0
    256. TIM_OC1Init(TIM5, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM5 OC2
    257. TIM_OC1PreloadConfig(TIM5, TIM_OCPreload_Enable); //使能TIM5在CCR2上的预装载寄存器
    258. TIM_Cmd(TIM5, ENABLE); //使能TIM5
    259. }
    260. //TIM5 CH1--1
    261. //TIM2 CH2--2
    262. //TIM3 CH2--3
    263. //TIM4 CH1--4
    264. //只能设置0~100K频率,一个定时器设置一种频率
    265. void Signal_0_100K(char num,int freq)
    266. {
    267. long arr,psc;
    268. if(freq==0){
    269. arr=0;psc=71;
    270. }
    271. else if(freq>=1&&freq<=1000){
    272. arr=10000/freq;psc=7199;
    273. }
    274. else if(freq>1000&&freq<=100000){
    275. arr=1000000/freq;psc=71;
    276. }
    277. else{
    278. arr=0;psc=71;
    279. }
    280. if(num==1){//设置PMW1
    281. TIM_DeInit(TIM5);
    282. TIM_SetCounter(TIM5,0);
    283. TIM5_PWM_Init(arr-1,psc);
    284. TIM_SetCompare1(TIM5,arr/2);
    285. }
    286. else if(num==2){//设置PMW2
    287. TIM_DeInit(TIM2);
    288. TIM_SetCounter(TIM2,0);
    289. TIM2_PWM_Init(arr-1,psc);
    290. TIM_SetCompare2(TIM2,arr/2);
    291. }
    292. else if(num==3){//设置PMW3
    293. TIM_DeInit(TIM3);
    294. TIM_SetCounter(TIM3,0);
    295. TIM3_PWM_Init(arr-1,psc);
    296. TIM_SetCompare1(TIM3,arr/2);
    297. }
    298. else if(num==4){//设置PMW4
    299. TIM_DeInit(TIM4);
    300. TIM_SetCounter(TIM4,0);
    301. TIM4_PWM_Init(arr-1,psc);
    302. TIM_SetCompare3(TIM4,arr/2);
    303. }
    304. }

    1. #ifndef __TIMER_H
    2. #define __TIMER_H
    3. #include "sys.h"
    4. extern long ticket1,ticket2,ticket3,ticket4;
    5. extern unsigned int ledflag;
    6. extern unsigned int modeflag;
    7. void EXTIX_Init(void);//外部中断初始化
    8. void EXTIX_NVIC_Init(FunctionalState status);
    9. void TIM1_Int_Init(u16 arr,u16 psc);
    10. void TIM2_PWM_Init(u16 arr,u16 psc);
    11. void TIM3_PWM_Init(u16 arr,u16 psc);
    12. void TIM4_PWM_Init(u16 arr,u16 psc);
    13. void TIM5_PWM_Init(u16 arr,u16 psc);
    14. void Signal_0_100K(char num,int freq);
    15. #endif

    main.c

    1. TIM1_Int_Init(49,7199);//10Khz的计数频率,计数到50为5ms
    2. EXTIX_Init();//初始化外部终端计数采集频率
    3. Signal_0_100K(1,0);//PWM输出0
    4. Signal_0_100K(2,0);//PWM输出0
    5. Signal_0_100K(3,0);//PWM输出0
    6. Signal_0_100K(4,0);//PWM输出0

     

    四、结语

    定时器1使用定时功能要有TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

  • 相关阅读:
    Jenkins-Pipline实现原理
    【MySQL】基础实战篇(3)—九大储存引擎详解
    计算机毕业设计ssm高校会议室管理系统w169g系统+程序+源码+lw+远程部署
    【SpringBoot】搭建第一个SpringBoot项目 - group、artifact等项目元数据详解
    使用Kali进行实验---主机发现
    Swift 学习笔记二(Set篇)
    【动态规划】—— 背包问题
    C#面:.NET Remoting 的⼯作原理是什么
    用辗转相除法求两个整数的最大公约数
    C数据结构-堆的实现思路和堆排序的实现
  • 原文地址:https://blog.csdn.net/qq_37603131/article/details/138165479