版权声明:本文为博主原创文章,欢迎转载 https://blog.csdn.net/ZLK1214/article/details/77746783

注意:ADC外设最大允许的时钟频率为14MHz,打开ADC外设前必须先配置好分频系数!

72MHz / 6 = 12MHz,转换速率为每个1.17μs。

【程序】

  1. #include <stdio.h>

  2. #include <stm32f10x.h>

  3. uint8_t injected_count = 0; // 转换的注入通道组数

  4. uint8_t last_pos; // 定时器1停止时剩余规则通道个数(DMA位置)

  5. uint16_t injected_result[4][5]; // 注入通道转换结果, 包括DMA位置

  6. int fputc(int ch, FILE *fp)

  7. {

  8. if (fp == stdout)

  9. {

  10. if (ch == '\n')

  11. {

  12. while ((USART1->SR & USART_SR_TXE) == 0);

  13. USART1->DR = '\r';

  14. }

  15. while ((USART1->SR & USART_SR_TXE) == 0);

  16. USART1->DR = ch;

  17. }

  18. return ch;

  19. }

  20. int main(void)

  21. {

  22. uint8_t i, j;

  23. uint16_t result[10][16]; // 规则通道转换结果

  24. // 打开外设时钟

  25. RCC->CFGR |= RCC_CFGR_ADCPRE_1; // ADC时钟设为12MHz, 最大允许时钟为14MHz

  26. RCC->AHBENR = RCC_AHBENR_DMA1EN;

  27. RCC->APB2ENR = RCC_APB2ENR_ADC1EN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_TIM1EN | RCC_APB2ENR_USART1EN;

  28. GPIOA->CRH = 0x444444bf; // 串口发送端设为复用推挽50MHz输出, TIM1输出比较端口1设为复用开漏50MHz输出

  29. GPIOA->CRL = 0x00000004; // ADC1通道1~7设为模拟

  30. GPIOB->CRL = 0x44444400; // ADC1通道8~9设为模拟

  31. TIM1->ARR = 15; // PWM周期: 16us

  32. TIM1->PSC = 71; // 计时频率: 1MHz

  33. TIM1->RCR = 3; // 产生4个上升沿信号

  34. TIM1->CR1 = TIM_CR1_OPM | TIM_CR1_URS; // 定时器自动停止; UG不置位UIF

  35. TIM1->EGR = TIM_EGR_UG; // 装入ARR, PSC和RCR寄存器的值

  36. TIM1->DIER = TIM_DIER_UIE; // 当定时器自动停止时触发中断

  37. NVIC_EnableIRQ(TIM1_UP_IRQn);

  38. TIM1->CR2 = TIM_CR2_MMS_2; // TRGO=OC1REF, 用于触发注入通道转换

  39. TIM1->BDTR = TIM_BDTR_MOE; // 打开输出总开关

  40. TIM1->CCR1 = 11; // 上升沿的产生位置

  41. TIM1->CCMR1 = TIM_CCMR1_OC1M; // PWM mode 2

  42. TIM1->CCER = TIM_CCER_CC1E; // 打开输出比较通道1

  43. // 规则通道和注入通道序列

  44. // SQ10: TS, SQ16: VREF

  45. ADC1->SQR1 = ADC_SQR1_L | (ADC_SQR1_SQ16_4 | ADC_SQR1_SQ16_0) | (ADC_SQR1_SQ15_2 | ADC_SQR1_SQ15_0) | ADC_SQR1_SQ14_2 | (ADC_SQR1_SQ13_1 | ADC_SQR1_SQ13_0);

  46. ADC1->SQR2 = ADC_SQR2_SQ12_1 | ADC_SQR2_SQ11_0 | ADC_SQR2_SQ10_4 | (ADC_SQR2_SQ9_3 | ADC_SQR2_SQ9_0) | ADC_SQR2_SQ8_3 | (ADC_SQR2_SQ7_2 | ADC_SQR2_SQ7_1 | ADC_SQR2_SQ7_0);

  47. ADC1->SQR3 = (ADC_SQR3_SQ6_2 | ADC_SQR3_SQ6_1) | (ADC_SQR3_SQ5_2 | ADC_SQR3_SQ5_0) | ADC_SQR3_SQ4_2 | (ADC_SQR3_SQ3_1 | ADC_SQR3_SQ3_0) | ADC_SQR3_SQ2_1 | ADC_SQR3_SQ1_0;

  48. ADC1->JSQR = ADC_JSQR_JL | ADC_JSQR_JSQ4_2 | (ADC_JSQR_JSQ3_1 | ADC_JSQR_JSQ3_0) | ADC_JSQR_JSQ2_1 | ADC_JSQR_JSQ1_0;

  49. ADC1->CR1 = ADC_CR1_SCAN | ADC_CR1_JEOCIE; // 规则通道组配置为多通道模式(必须用DMA收集数据); 当注入通道组转换完毕时触发中断

  50. ADC1->CR2 = ADC_CR2_TSVREFE | ADC_CR2_JEXTTRIG | ADC_CR2_DMA | ADC_CR2_CONT | ADC_CR2_ADON; // 打开16~17通道; 允许外部事件注入; 规则通道组循环转换; 打开ADC1

  51. NVIC_EnableIRQ(ADC1_2_IRQn);

  52. USART1->BRR = 0x271; // 波特率: 115200

  53. USART1->CR1 = USART_CR1_UE | USART_CR1_TE; // 允许发送

  54. // 配置ADC1_DMA

  55. DMA1_Channel1->CMAR = (uint32_t)result[0];

  56. DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;

  57. DMA1_Channel1->CNDTR = 160;

  58. DMA1_Channel1->CCR = DMA_CCR1_MSIZE_0 | DMA_CCR1_PSIZE_0 | DMA_CCR1_MINC | DMA_CCR1_EN;

  59. ADC1->CR2 = ADC1->CR2; // 开始转换规则通道

  60. TIM1->CR1 |= TIM_CR1_CEN; // 开启定时器1

  61. while ((DMA1->ISR & DMA_ISR_TCIF1) == 0) // 若DMA正在搬运数据

  62. {

  63. if (DMA1_Channel1->CNDTR < 16 && (ADC1->CR2 & ADC_CR2_CONT)) // 转换最后一组时关闭CONT循环模式, 以免产生新数据使EOC不为0

  64. ADC1->CR2 &= ~ADC_CR2_CONT;

  65. }

  66. // 显示定时器1自动关闭时DMA的位置

  67. if ((TIM1->CR1 & TIM_CR1_CEN) == 0)

  68. printf("TIM1 stopped! CNDTR=%d\n", last_pos);

  69. // 显示规则通道的数据

  70. for (i = 0; i < 10; i++)

  71. {

  72. printf("[Regular %d]", i + 1);

  73. for (j = 0; j < 16; j++)

  74. printf(" %d", result[i][j]);

  75. printf("\n");

  76. }

  77. // 显示注入通道的数据

  78. for (i = 0; i < injected_count; i++)

  79. {

  80. printf("[Injected %d]", i + 1);

  81. for (j = 1; j <= 4; j++)

  82. printf(" %d", injected_result[i][j]);

  83. printf(" (CNDTR=%d)\n", injected_result[i][0]);

  84. }

  85. ADC1->SR &= ~ADC_SR_STRT;

  86. printf("ADC1->SR=0x%02x\n", ADC1->SR);

  87. // 等待USART1发送完毕并关闭外设

  88. while ((USART1->SR & USART_SR_TC) == 0);

  89. USART1->CR1 = 0;

  90. ADC1->CR2 = 0;

  91. // 进入Stop低功耗模式

  92. SCB->SCR = SCB_SCR_SLEEPDEEP;

  93. while (1)

  94. __WFI();

  95. }

  96. // 注入通道组转换完成时触发的中断

  97. void ADC1_2_IRQHandler(void)

  98. {

  99. ADC1->SR &= ~(ADC_SR_EOC | ADC_SR_JEOC | ADC_SR_JSTRT);

  100. injected_result[injected_count][0] = DMA1_Channel1->CNDTR;

  101. injected_result[injected_count][1] = ADC1->JDR1;

  102. injected_result[injected_count][2] = ADC1->JDR2;

  103. injected_result[injected_count][3] = ADC1->JDR3;

  104. injected_result[injected_count][4] = ADC1->JDR4;

  105. injected_count++;

  106. }

  107. void TIM1_UP_IRQHandler(void)

  108. {

  109. TIM1->SR &= ~TIM_SR_UIF; // 清除中断标志

  110. last_pos = DMA1_Channel1->CNDTR; // 记录DMA的位置

  111. ADC1->CR2 &= ~ADC_CR2_JEXTTRIG; // 禁止外部触发注入通道组的转换

  112. TIM1->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_0; // 熄灭PA8上的LED灯

  113. // 不能在这里执行printf, 否则CONT位将无法及时清除而产生新数据

  114. }

【运行结果】

  1. TIM1 stopped! CNDTR=122

  2. [Regular 1] 1638 1714 598 225 1566 3085 3572 1834 3469 1576 1636 1716 598 225 1565 1770

  3. [Regular 2] 1639 1714 597 224 1568 3084 3569 1832 3468 2157 1638 1715 597 225 1564 1772

  4. [Regular 3] 1638 1713 597 224 1567 3084 3570 1833 3469 2159 1638 1713 597 225 1567 1773

  5. [Regular 4] 1637 1714 597 225 1567 3085 3571 1834 3469 2158 1639 1715 598 224 1566 1771

  6. [Regular 5] 1638 1715 598 224 1566 3087 3568 1834 3470 2157 1638 1714 596 223 1569 1766

  7. [Regular 6] 1638 1714 598 224 1567 3085 3570 1832 3470 2158 1638 1715 598 225 1567 1773

  8. [Regular 7] 1638 1715 597 223 1565 3086 3569 1832 3469 2158 1637 1714 598 224 1566 1772

  9. [Regular 8] 1638 1714 598 225 1565 3085 3568 1833 3469 2158 1638 1715 598 225 1566 1770

  10. [Regular 9] 1638 1714 598 225 1568 3084 3571 1833 3470 2158 1638 1714 597 224 1565 1771

  11. [Regular 10] 1638 1714 597 224 1566 3084 3569 1833 3469 2158 1638 1713 598 224 1568 1765

  12. [Injected 1] 1636 1714 597 224 (CNDTR=151)

  13. [Injected 2] 1637 1715 597 224 (CNDTR=142)

  14. [Injected 3] 1636 1714 596 224 (CNDTR=133)

  15. [Injected 4] 1638 1714 597 225 (CNDTR=124)

  16. ADC1->SR=0x00

在上面的程序中,TIM1的计数方向为向上计数,每次比较匹配时都触发一次注入。事件源为TIM1_TRGO事件,JEXTSEL=000。

如果计数方向既向上又向下,则只有向上的那一次比较匹配才能触发注入,向下的那一次无效,因为只有TRGO=OCxREF信号的上升沿能够触发ADC注入。

对于TIMn_TRGO类事件,若TRGO=OCxREF,则只有OCxREF的上升沿才能触发注入,与CCxP的值无关。

对于TIMn_CCx类事件,若CCxP=0,则是OCxREF的上升沿触发注入;若CCxP=1,则是OCxREF的下降沿触发注入。对应的GPIO口输出的电平为OCxREF ^ CCxP。

当SCAN=0时,L和JL的值无效,ADC始终只转换序列中的第一个通道。

当SCAN=1时,ADC转换组中所有的通道,通道的个数由L或JL指定。整个通道组转换完成时EOC才置1,此时DR中的内容为最后一个通道的数据,读DR寄存器后EOC自动清零。所以只要SCAN=1,规则通道的数据就只能由DMA来采集。如果打开了EOCIE中断,则在中断中无需手动清除EOC标志。因为DMA读取最后一个通道的数据后,EOC会自动清零。

CONT(循环模式)只对规则通道有效,对注入通道无效。

如果JAUTO=1,则注入通道组的转换不需要由外部信号触发。规则通道组转换完成后将会自动转换注入通道组。

  1. #include <stdio.h>

  2. #include <stm32f10x.h>

  3. uint8_t injected_count = 0; // 转换的注入通道组数

  4. uint16_t injected_result[10][5]; // 注入通道转换结果, 包括DMA位置

  5. void delay(void)

  6. {

  7. uint32_t i;

  8. for (i = 0; i < 2000000; i++);

  9. }

  10. int fputc(int ch, FILE *fp)

  11. {

  12. if (fp == stdout)

  13. {

  14. if (ch == '\n')

  15. {

  16. while ((USART1->SR & USART_SR_TXE) == 0);

  17. USART1->DR = '\r';

  18. }

  19. while ((USART1->SR & USART_SR_TXE) == 0);

  20. USART1->DR = ch;

  21. }

  22. return ch;

  23. }

  24. int main(void)

  25. {

  26. uint8_t i, j;

  27. uint16_t result[10][16]; // 规则通道转换结果

  28. // 打开外设时钟

  29. RCC->CFGR |= RCC_CFGR_ADCPRE_1; // ADC时钟设为12MHz, 最大允许时钟为14MHz

  30. RCC->AHBENR = RCC_AHBENR_DMA1EN;

  31. RCC->APB1ENR = RCC_APB1ENR_PWREN;

  32. RCC->APB2ENR = RCC_APB2ENR_ADC1EN | RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_USART1EN;

  33. GPIOA->CRH = 0x444444b4; // 串口发送端设为复用推挽50MHz输出

  34. GPIOA->CRL = 0x00000008; // ADC1通道1~7设为模拟, PA0待机唤醒按键设为带下拉电阻输入

  35. GPIOB->CRL = 0x44444400; // ADC1通道8~9设为模拟

  36. // 规则通道和注入通道序列

  37. // SQ10: TS, SQ16: VREF

  38. ADC1->SQR1 = ADC_SQR1_L | (ADC_SQR1_SQ16_4 | ADC_SQR1_SQ16_0) | (ADC_SQR1_SQ15_2 | ADC_SQR1_SQ15_0) | ADC_SQR1_SQ14_2 | (ADC_SQR1_SQ13_1 | ADC_SQR1_SQ13_0);

  39. ADC1->SQR2 = ADC_SQR2_SQ12_1 | ADC_SQR2_SQ11_0 | ADC_SQR2_SQ10_4 | (ADC_SQR2_SQ9_3 | ADC_SQR2_SQ9_0) | ADC_SQR2_SQ8_3 | (ADC_SQR2_SQ7_2 | ADC_SQR2_SQ7_1 | ADC_SQR2_SQ7_0);

  40. ADC1->SQR3 = (ADC_SQR3_SQ6_2 | ADC_SQR3_SQ6_1) | (ADC_SQR3_SQ5_2 | ADC_SQR3_SQ5_0) | ADC_SQR3_SQ4_2 | (ADC_SQR3_SQ3_1 | ADC_SQR3_SQ3_0) | ADC_SQR3_SQ2_1 | ADC_SQR3_SQ1_0;

  41. ADC1->JSQR = ADC_JSQR_JL | ADC_JSQR_JSQ4_2 | (ADC_JSQR_JSQ3_1 | ADC_JSQR_JSQ3_0) | ADC_JSQR_JSQ2_1 | ADC_JSQR_JSQ1_0;

  42. ADC1->CR1 = ADC_CR1_JAUTO | ADC_CR1_SCAN | ADC_CR1_JEOCIE; // 规则通道组转换完毕后自动开始转换注入通道组; 规则通道组配置为多通道模式(必须用DMA收集数据); 当注入通道组转换完毕时触发中断

  43. ADC1->CR2 = ADC_CR2_TSVREFE | ADC_CR2_DMA | ADC_CR2_CONT | ADC_CR2_ADON; // 打开16~17通道; 规则通道组循环转换; 打开ADC1

  44. NVIC_EnableIRQ(ADC1_2_IRQn);

  45. USART1->BRR = 0x271; // 波特率: 115200

  46. USART1->CR1 = USART_CR1_UE | USART_CR1_TE; // 允许发送

  47. // 配置ADC1_DMA

  48. DMA1_Channel1->CMAR = (uint32_t)result[0];

  49. DMA1_Channel1->CPAR = (uint32_t)&ADC1->DR;

  50. DMA1_Channel1->CNDTR = 160;

  51. DMA1_Channel1->CCR = DMA_CCR1_MSIZE_0 | DMA_CCR1_PSIZE_0 | DMA_CCR1_MINC | DMA_CCR1_EN;

  52. ADC1->CR2 = ADC1->CR2; // 开始转换规则通道

  53. while ((DMA1->ISR & DMA_ISR_TCIF1) == 0) // 若DMA正在搬运数据

  54. {

  55. if (DMA1_Channel1->CNDTR < 16 && (ADC1->CR2 & ADC_CR2_CONT)) // 转换最后一组时关闭CONT循环模式, 以免产生新数据使EOC不为0

  56. ADC1->CR2 &= ~ADC_CR2_CONT;

  57. }

  58. // 显示规则通道的数据

  59. for (i = 0; i < 10; i++)

  60. {

  61. printf("[Regular %d]", i + 1);

  62. for (j = 0; j < 16; j++)

  63. printf(" %d", result[i][j]);

  64. printf("\n");

  65. }

  66. // 显示注入通道的数据

  67. for (i = 0; i < injected_count; i++)

  68. {

  69. printf("[Injected %d]", i + 1);

  70. for (j = 1; j <= 4; j++)

  71. printf(" %d", injected_result[i][j]);

  72. printf(" (CNDTR=%d)\n", injected_result[i][0]);

  73. }

  74. ADC1->SR &= ~ADC_SR_STRT;

  75. printf("ADC1->SR=0x%02x\n", ADC1->SR);

  76. // 进入待机模式

  77. while ((USART1->SR & USART_SR_TC) == 0); // 等待USART1发送完毕

  78. while (GPIOA->IDR & GPIO_IDR_IDR0)

  79. delay(); // WKUP按键消抖

  80. SCB->SCR = SCB_SCR_SLEEPDEEP;

  81. PWR->CR = PWR_CR_PDDS | PWR_CR_CWUF;

  82. PWR->CSR = PWR_CSR_EWUP;

  83. __WFI();

  84. return 0;

  85. }

  86. // 注入通道组转换完成时触发的中断

  87. void ADC1_2_IRQHandler(void)

  88. {

  89. ADC1->SR &= ~(ADC_SR_EOC | ADC_SR_JEOC | ADC_SR_JSTRT);

  90. injected_result[injected_count][0] = DMA1_Channel1->CNDTR;

  91. injected_result[injected_count][1] = ADC1->JDR1;

  92. injected_result[injected_count][2] = ADC1->JDR2;

  93. injected_result[injected_count][3] = ADC1->JDR3;

  94. injected_result[injected_count][4] = ADC1->JDR4;

  95. injected_count++;

  96. }

【运行结果】

  1. [Regular 1] 1636 1713 597 224 1565 3084 3570 1833 3471 2083 1638 1713 597 224 1565 1772

  2. [Regular 2] 1637 1713 597 224 1566 3084 3569 1832 3470 2158 1637 1714 597 223 1566 1773

  3. [Regular 3] 1639 1713 597 222 1568 3084 3572 1833 3467 2157 1636 1713 596 223 1564 1771

  4. [Regular 4] 1637 1713 596 223 1565 3085 3569 1833 3470 2158 1638 1713 597 224 1566 1771

  5. [Regular 5] 1637 1713 596 225 1566 3084 3570 1833 3470 2158 1637 1713 596 223 1567 1772

  6. [Regular 6] 1637 1713 596 223 1567 3086 3569 1833 3469 2157 1637 1714 595 223 1565 1771

  7. [Regular 7] 1637 1713 597 224 1565 3086 3568 1834 3470 2158 1637 1714 597 225 1566 1771

  8. [Regular 8] 1637 1713 596 225 1565 3085 3569 1832 3470 2158 1637 1713 597 223 1567 1774

  9. [Regular 9] 1637 1713 596 223 1567 3084 3569 1832 3470 2158 1638 1713 596 224 1565 1771

  10. [Regular 10] 1637 1713 597 224 1564 3085 3569 1833 3470 2158 1637 1713 597 224 1565 1771

  11. [Injected 1] 1638 1714 597 224 (CNDTR=144)

  12. [Injected 2] 1637 1713 596 224 (CNDTR=128)

  13. [Injected 3] 1637 1715 596 223 (CNDTR=112)

  14. [Injected 4] 1638 1714 595 223 (CNDTR=96)

  15. [Injected 5] 1637 1713 597 223 (CNDTR=80)

  16. [Injected 6] 1637 1713 597 223 (CNDTR=64)

  17. [Injected 7] 1638 1715 597 224 (CNDTR=48)

  18. [Injected 8] 1638 1712 596 222 (CNDTR=32)

  19. [Injected 9] 1637 1713 597 222 (CNDTR=16)

  20. [Injected 10] 1637 1714 597 226 (CNDTR=0)

  21. ADC1->SR=0x00

STM32F103RC单片机ADC1使用TIM1自动触发注入通道组的AD转换相关推荐

  1. 数字编码电位器c语言,单片机小白学习之路(三十八)---AD转换电位器编码

    目标:点位器的检测 xpt2046.c #include "xpt2046.h" void SPI_Write(uchar dat) //使用SPI写入数据 { uchar i; ...

  2. STM32 进阶教程 17 - ADC注入通道

    前言 STM32 的ADC的一个强大功能是支持触发注入功能,在103中每个ADC模块支持4个注入通道,每个注入通道具有独立的结果突存器,注入通道具有较规划通道更高的优先级,在实际工程应用中,注入通道更 ...

  3. 【stm32】ADC的规则通道和注入通道混合使用

    之前完成了规则通道DMA的数据传输了,不过平时在使用ADC的时候可能就会遇到很多情况,不可能就这样简单的按规则通道来采样,DMA存储,使用数据的:可能有时候会需要立刻采样,那样我们就需要利用到注入通道 ...

  4. STM32 ADC的规则通道和注入通道有什么区别(转)

    STM32的每个ADC模块通过内部的模拟多路开关,可以切换到不同的输入通道并进行转换.  STM32特别地加入了多种成组转换的模式,可以由程序设置好之后,对多个模拟通道自动地进行逐个地采样转换. 有2 ...

  5. ARM STM32F中ADC中 规则通道 注入通道 序列寄存器(SQR JSQR)的使用方法

    STM32F中的ADC是十分强大的,使用方法多,寄存器多,操作也复杂.下面就来看看ADC中规则通道,注入通道及序列寄存器(SQR JSQR)到底该如何使用. 第一,看看规则通道与注入通道的区别 可以看 ...

  6. 20. GD32F103C8T6入门教程-adc使用外部中断IT11触发启动adc规则通道,使用外中断IT15触发注入组

    adc 使用教程6-使用外部中断IT11触发启动adc规则通道,使用外中断IT15触发注入组 ADC支持18个多路通道,可以把转换组织成两组:一个规则组通道和一个注入组通道 规则组,可以按照特定的序列 ...

  7. 通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 – Part 2

    通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 – Part B 6, 入站IDOC的设置 IDoc type – DELVRY01 Message Type – DES ...

  8. 通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 - Part I

    通过IDoc来实现公司间STO场景中外向交货单过账后自动触发内向交货单的功能 - Part I 公司间采购(公司间库存转储)流程里,常见的解决方案是发货方完成发货过账后,自动触发收货方的内向交货单.除 ...

  9. SAP公司间STO流程里外向交货单PGI后自动触发内向交货单的实现

    SAP公司间STO流程里外向交货单PGI后自动触发内向交货单的实现 公司间采购(公司间库存转储)在很多SAP项目里很常见,笔者在很多项目里都有这种场景.项目实践中,都是采用SAP的Inter-comp ...

  10. SAP QM 内向交货单在完成包装之后就自动触发了检验批?

    SAP QM 内向交货单在完成包装之后就自动触发了检验批? 我们知道,启用了SAP QM模块之后,在很多业务活动的时候会自动触发检验批.比如收货,转库,改库存状态,Release工单等业务操作完成后, ...

最新文章

  1. 电脑常用的几个快捷键
  2. 2017可以兼容那些jdk_2019从头跃——核心基础:何为JDK?Java开发工具包须知总览...
  3. 关于DRAM、SRAM、cache、cpu、寄存器、主存之间的联系与区别
  4. Python: 编程遇到的一些问题以及网上解决办法?
  5. 信安教程第二版-第13章网络安全漏洞防护技术原理与应用
  6. Air与java通信
  7. 编写高质量JavaScript代码绳之以法(The Essentials of Writing High Quality JavaScript)翻译...
  8. if...else 应用(猜幸运数字)
  9. 分布式文件系统 MogileFS 安装手册
  10. 【工具】动软代码生成器连接数据库
  11. 地产行业主数据建设项目思考
  12. OpenCV图像处理之直方图
  13. 汉字字符集编码查询_刨根究底字符编码之十——Unicode字符集的字符编码方式...
  14. 程序员写代码都用什么样的笔记本?
  15. python编写贪吃蛇大战_python实现贪吃蛇双人大战
  16. Java开发技巧!整理了3家面试问题:美团+字节+腾讯,工作感悟
  17. java 坦克大战画坦克_【JAVA语言程序设计基础篇】--JAVA实现坦克大战游戏--画出坦克(二)...
  18. java 服务器文件下载
  19. linux ls和cd命令详解,Linux基础cd、pwd和ls命令
  20. 西门子采用三井化学的UNISTOLE™作为3D打印医用级面罩的涂层剂

热门文章

  1. 使用php生成6位密码大全,php生成随机产生六位数密码的代码
  2. C++:关于类以及h/cpp文件的一些实用知识
  3. 80386 CPU资源
  4. Java汉字转GB2312编码【工具类】
  5. 一起学libcef--搭建自己的libcef运行环境(Win32程序,错误C2220解决方案)
  6. 微信小程序tab切换效果
  7. html网页中加入音乐播放器,[HTML5]简单网页本地音乐播放器
  8. cf黑机器多久解除_CF永久解除机器码|CF机器码硬解封详细步骤教程+工具|CF辅助-QQ知啦娱乐网...
  9. 轻松搞明白:软切换和硬切换的区别
  10. chrome 插件tempermonkey