博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32_杂_01_串口代码
阅读量:6800 次
发布时间:2019-06-26

本文共 23625 字,大约阅读时间需要 78 分钟。

1 #include "stm32f10x.h"  2 #include "serial.h"  3 #include "rtthread.h"  4 #include 
5 /*********************************************************************************************************** 6 @ pin config USART1_REMAP = 0 7 @____________________________________________________________________________*/ 8 9 #define UART1_GPIO_TX GPIO_Pin_9 10 #define UART1_GPIO_RX GPIO_Pin_10 11 #define UART1_GPIO GPIOA 12 #define RCC_APBPeriph_UART1 RCC_APB2Periph_USART1 13 #define UART1_TX_DMA DMA1_Channel4 14 #define UART1_RX_DMA DMA1_Channel5 15 16 /*********************************************************************************************************** 17 @ Struct Definition 18 @____________________________________________________________________________*/ 19 struct serial_ringbuffer serial_int_rx_buffer; 20 struct serial_ringbuffer serial_int_tx_buffer; 21 struct rt_serial_device serialx_device; 22 struct serial_user_data 23 { 24 USART_TypeDef* uart_device; 25 const char name[RT_NAME_MAX]; 26 }; 27 28 29 30 /*********************************************************************************************************** 31 @ Hardware clock configuration 32 @____________________________________________________________________________*/ 33 static void RCC_Configuration(void) 34 { 35 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 36 37 /* Enable USART1 and GPIOA clocks */ 38 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE); 39 40 } 41 42 static void GPIO_Configuration(void) 43 { 44 GPIO_InitTypeDef GPIO_InitStructure; 45 46 /* Configure USART1 Rx (PA.10) as input floating */ 47 GPIO_InitStructure.GPIO_Pin = UART1_GPIO_RX; 48 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 49 GPIO_Init(UART1_GPIO, &GPIO_InitStructure); 50 51 /* Configure USART1 Tx (PA.09) as alternate function push-pull */ 52 GPIO_InitStructure.GPIO_Pin = UART1_GPIO_TX; 53 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 54 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 55 GPIO_Init(UART1_GPIO, &GPIO_InitStructure); 56 57 } 58 59 static void NVIC_Configuration(void) 60 { 61 NVIC_InitTypeDef NVIC_InitStructure; 62 63 /* Enable the USART1 Interrupt */ 64 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; 65 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; 66 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; 67 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 68 NVIC_Init(&NVIC_InitStructure); 69 70 71 } 72 73 74 75 76 77 /*********************************************************************************************************** 78 @ model driven architecture interface 79 @____________________________________________________________________________*/ 80 int serial_put_char(struct rt_serial_device *serial, char c) 81 { 82 USART_ClearFlag(USART1,USART_FLAG_TC); 83 USART_SendData(USART1, (u8) c); 84 while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); 85 return c; 86 } 87 88 int serial_get_char(struct rt_serial_device *serial) 89 { 90 int ch = -1; 91 struct serial_user_data* user = (struct serial_user_data *)(serial->parent.user_data); 92 93 94 if(USART_GetITStatus(user->uart_device, USART_IT_RXNE) != RESET) 95 { 96 /* interrupt mode receive */ 97 RT_ASSERT(serial->parent.flag & RT_DEVICE_FLAG_INT_RX); 98 99 ch = USART_ReceiveData(user->uart_device);100 101 /* clear interrupt */102 USART_ClearITPendingBit(user->uart_device, USART_IT_RXNE);103 }104 return ch;105 }106 107 rt_err_t serial_control(struct rt_serial_device *serial, int cmd, void *arg)108 {109 u16 int_flag; //interrupt flag110 FunctionalState NewState;111 struct serial_user_data *user = (struct serial_user_data *)serial->parent.user_data;112 113 switch(*(rt_uint32_t *)arg)114 {115 case RT_SERIAL_RX_INT:116 {117 int_flag = USART_IT_RXNE;118 break;119 }120 case RT_SERIAL_TX_INT:121 {122 int_flag = USART_IT_TC;123 break;124 }125 default :126 {127 break;128 }129 }130 131 switch(cmd)132 {133 case RT_DEVICE_CTRL_SET_INT:134 {135 NewState = ENABLE;136 break;137 }138 case RT_DEVICE_CTRL_CLR_INT:139 {140 NewState = DISABLE;141 break;142 }143 default:144 {145 break;146 }147 }148 USART_ITConfig(user->uart_device, int_flag, NewState);149 }150 151 rt_size_t serial_dma_transmit(struct rt_serial_device *serial, const char *buf, rt_size_t size)152 {153 154 }155 /***********************************************************************************************************156 @Struct declaration 157 @____________________________________________________________________________*/158 struct serial_configure serial_config = 159 {160 115200,161 8,162 1,163 0,164 0,165 0,166 0167 };168 struct serial_user_data serial_user_struct= 169 {170 USART1,171 "usart1"172 };173 rt_err_t stm32_serial_config(struct rt_serial_device *serial, struct serial_configure *cfg);174 struct rt_uart_ops serial_ops = 175 {176 stm32_serial_config,177 serial_control,178 serial_put_char,179 serial_get_char,180 serial_dma_transmit 181 };182 183 184 rt_err_t stm32_serial_config(struct rt_serial_device *serial, struct serial_configure *cfg)185 {186 USART_InitTypeDef USART_InitStructure;187 USART_ClockInitTypeDef USART_ClockInitStructure;188 struct serial_user_data* user = (struct serial_user_data *)serial->parent.user_data;189 190 191 RCC_Configuration();192 193 GPIO_Configuration();194 195 NVIC_Configuration();196 /*197 serial->config = serial_config;198 serial->int_rx = &serial_int_rx_buffer;199 serial->int_tx = &serial_int_tx_buffer;200 serial->ops = &serial_ops;201 */202 USART_InitStructure.USART_BaudRate = 9600;203 USART_InitStructure.USART_WordLength = USART_WordLength_8b;204 USART_InitStructure.USART_StopBits = USART_StopBits_1;205 USART_InitStructure.USART_Parity = USART_Parity_No;206 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;207 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;208 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;209 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;210 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;211 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;212 213 USART_Init(user->uart_device, &USART_InitStructure);214 USART_ClockInit(user->uart_device, &USART_ClockInitStructure); 215 216 217 // rt_hw_serial_register(serial, user->name,218 // RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,219 // user);220 221 /* enable interrupt */222 USART_ITConfig(user->uart_device, USART_IT_RXNE, ENABLE);223 224 return RT_EOK;225 }226 227 228 229 230 231 void rt_hw_usart2_init(void)232 {233 /* USART_InitTypeDef USART_InitStructure;234 USART_ClockInitTypeDef USART_ClockInitStructure;235 236 RCC_Configuration();237 238 GPIO_Configuration();239 240 NVIC_Configuration();241 */242 serialx_device.config = serial_config;243 serialx_device.int_rx = &serial_int_rx_buffer;244 serialx_device.int_tx = &serial_int_tx_buffer;245 serialx_device.ops = &serial_ops;246 /*247 USART_InitStructure.USART_BaudRate = 115200;248 USART_InitStructure.USART_WordLength = USART_WordLength_8b;249 USART_InitStructure.USART_StopBits = USART_StopBits_1;250 USART_InitStructure.USART_Parity = USART_Parity_No;251 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;252 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;253 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;254 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;255 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;256 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;257 258 USART_Init(serial_user_struct.uart_device, &USART_InitStructure);259 USART_ClockInit(serial_user_struct.uart_device, &USART_ClockInitStructure); 260 261 */262 rt_hw_serial_register(&serialx_device, serial_user_struct.name,263 RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,264 &serial_user_struct);265 266 /* enable interrupt */267 //USART_ITConfig(serial_user_struct.uart_device, USART_IT_RXNE, ENABLE);268 269 //stm32_serial_config(&serialx_device,&serial_config);270 }271

 

下面是第二份代码:

1 #include "stm32f10x.h"  2 #include "serial.h"  3 #include "rtthread.h"  4 #include 
5 /*********************************************************************************************************** 6 @ pin config USART1_REMAP = 0 7 @____________________________________________________________________________*/ 8 9 /* USART1_REMAP = 0 */ 10 #define UART1_GPIO_TX GPIO_Pin_9 11 #define UART1_GPIO_RX GPIO_Pin_10 12 #define UART1_GPIO GPIOA 13 #define RCC_APBPeriph_UART1 RCC_APB2Periph_USART1 14 #define USART1_TX_DMA DMA1_Channel4 15 #define USART1_RX_DMA DMA1_Channel5 16 17 #if defined(STM32F10X_LD) || defined(STM32F10X_MD) || defined(STM32F10X_CL) 18 #define UART2_GPIO_TX GPIO_Pin_5 19 #define UART2_GPIO_RX GPIO_Pin_6 20 #define UART2_GPIO GPIOD 21 #define RCC_APBPeriph_UART2 RCC_APB1Periph_USART2 22 #else /* for STM32F10X_HD */ 23 /* USART2_REMAP = 0 */ 24 #define UART2_GPIO_TX GPIO_Pin_2 25 #define UART2_GPIO_RX GPIO_Pin_3 26 #define UART2_GPIO GPIOA 27 #define RCC_APBPeriph_UART2 RCC_APB1Periph_USART2 28 #define UART2_TX_DMA DMA1_Channel7 29 #define UART2_RX_DMA DMA1_Channel6 30 #endif 31 32 /* USART3_REMAP[1:0] = 00 */ 33 #define UART3_GPIO_RX GPIO_Pin_11 34 #define UART3_GPIO_TX GPIO_Pin_10 35 #define UART3_GPIO GPIOB 36 #define RCC_APBPeriph_UART3 RCC_APB1Periph_USART3 37 #define UART3_TX_DMA DMA1_Channel2 38 #define UART3_RX_DMA DMA1_Channel3 39 40 /*********************************************************************************************************** 41 @ Struct Definition 42 @____________________________________________________________________________*/ 43 struct serial_user_data 44 { 45 USART_TypeDef* uart_device; 46 const char name[RT_NAME_MAX]; 47 }; 48 49 50 51 /*********************************************************************************************************** 52 @ Hardware clock configuration 53 @____________________________________________________________________________*/ 54 static void RCC_Configuration(void) 55 { 56 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); 57 58 /* Enable USART1 and GPIOA clocks */ 59 RCC_APB2PeriphClockCmd(RCC_APBPeriph_UART1 | RCC_APB2Periph_GPIOA, ENABLE); 60 61 /* Enable AFIO and GPIOD clock */ 62 RCC_APB1PeriphClockCmd(RCC_APBPeriph_UART2, ENABLE); 63 64 } 65 66 static void GPIO_Configuration(void) 67 { 68 GPIO_InitTypeDef GPIO_InitStructure; 69 70 /* Configure USART1 Rx (PA.10) as input floating */ 71 GPIO_InitStructure.GPIO_Pin = UART1_GPIO_RX; 72 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 73 GPIO_Init(UART1_GPIO, &GPIO_InitStructure); 74 75 /* Configure USART1 Tx (PA.09) as alternate function push-pull */ 76 GPIO_InitStructure.GPIO_Pin = UART1_GPIO_TX; 77 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 78 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 79 GPIO_Init(UART1_GPIO, &GPIO_InitStructure); 80 81 /* Configure USART2 Rx as input floating */ 82 GPIO_InitStructure.GPIO_Pin = UART2_GPIO_RX; 83 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 84 GPIO_Init(UART2_GPIO, &GPIO_InitStructure); 85 86 /* Configure USART2 Tx as alternate function push-pull */ 87 GPIO_InitStructure.GPIO_Pin = UART2_GPIO_TX; 88 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 89 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 90 GPIO_Init(UART2_GPIO, &GPIO_InitStructure); 91 92 } 93 94 static void NVIC_Configuration(void) 95 { 96 NVIC_InitTypeDef NVIC_InitStructure; 97 98 /* Enable the USART1 Interrupt */ 99 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;100 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;101 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;102 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;103 NVIC_Init(&NVIC_InitStructure);104 105 /* Enable the USART2 Interrupt */106 NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;107 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;108 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;109 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;110 NVIC_Init(&NVIC_InitStructure);111 112 113 }114 115 static void DMA_Configuration(void)116 {117 #if defined (RT_USING_UART3)118 DMA_InitTypeDef DMA_InitStructure;119 120 /* fill init structure */121 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;122 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;123 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;124 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;125 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;126 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;127 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;128 129 /* DMA1 Channel5 (triggered by USART3 Tx event) Config */130 DMA_DeInit(UART3_TX_DMA);131 DMA_InitStructure.DMA_PeripheralBaseAddr = USART3_DR_Base;132 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;133 /* As we will set them before DMA actually enabled, the DMA_MemoryBaseAddr134 * and DMA_BufferSize are meaningless. So just set them to proper values135 * which could make DMA_Init happy.136 */137 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)0;138 DMA_InitStructure.DMA_BufferSize = 1;139 DMA_Init(UART3_TX_DMA, &DMA_InitStructure);140 DMA_ITConfig(UART3_TX_DMA, DMA_IT_TC | DMA_IT_TE, ENABLE);141 DMA_ClearFlag(DMA1_FLAG_TC2);142 #endif143 }144 145 146 147 148 /***********************************************************************************************************149 @ model driven architecture interface150 @____________________________________________________________________________*/151 rt_err_t stm32_serial_config(struct rt_serial_device *serial, struct serial_configure *cfg);152 153 int serial_put_char(struct rt_serial_device *serial, char c)154 {155 struct serial_user_data* user = (struct serial_user_data *)(serial->parent.user_data);156 157 USART_ClearFlag(user->uart_device,USART_FLAG_TC);158 USART_SendData(user->uart_device, c);159 while (USART_GetFlagStatus(user->uart_device, USART_FLAG_TC) == RESET);160 161 return c;162 }163 164 int serial_get_char(struct rt_serial_device *serial)165 { 166 int ch = -1;167 struct serial_user_data* user = (struct serial_user_data *)(serial->parent.user_data);168 169 170 if(USART_GetITStatus(user->uart_device, USART_IT_RXNE) != RESET)171 {172 /* interrupt mode receive */173 RT_ASSERT(serial->parent.flag & RT_DEVICE_FLAG_INT_RX);174 175 ch = USART_ReceiveData(user->uart_device);176 177 /* clear interrupt */178 USART_ClearITPendingBit(user->uart_device, USART_IT_RXNE);179 }180 return ch;181 }182 183 rt_err_t serial_control(struct rt_serial_device *serial, int cmd, void *arg)184 {185 FunctionalState NewState;186 187 struct serial_user_data *user = (struct serial_user_data *)serial->parent.user_data;188 189 switch(cmd)190 {191 case RT_DEVICE_CTRL_SET_INT:192 {193 NewState = ENABLE;194 break;195 }196 case RT_DEVICE_CTRL_CLR_INT:197 {198 NewState = DISABLE;199 break;200 }201 default:202 {203 break;204 }205 }206 207 switch(*(rt_uint32_t *)arg)208 {209 case RT_SERIAL_RX_INT:210 {211 USART_ITConfig(user->uart_device, USART_IT_RXNE, NewState);212 break;213 }214 case RT_SERIAL_TX_INT:215 {216 USART_ITConfig(user->uart_device, USART_IT_TC, NewState);217 break;218 }219 default :220 {221 break;222 }223 }224 225 return RT_EOK;226 }227 228 rt_size_t serial_dma_transmit(struct rt_serial_device *serial, const char *buf, rt_size_t size)229 {230 return size;231 }232 233 rt_err_t stm32_serial_config(struct rt_serial_device *serial, struct serial_configure *cfg)234 {235 USART_InitTypeDef USART_InitStructure;236 USART_ClockInitTypeDef USART_ClockInitStructure;237 struct serial_user_data* user = (struct serial_user_data *)serial->parent.user_data;238 239 240 RCC_Configuration();241 GPIO_Configuration();242 NVIC_Configuration();243 DMA_Configuration();244 245 USART_InitStructure.USART_BaudRate = cfg->baud_rate;246 247 switch(cfg->data_bits)248 {249 case 8:250 {251 USART_InitStructure.USART_WordLength = USART_WordLength_8b;252 break;253 }254 case 9:255 {256 USART_InitStructure.USART_WordLength = USART_WordLength_9b;257 break;258 }259 default :260 {261 #ifndef RT_USING_FINSH262 rt_kprintf("data bit set error\n");263 #endif264 break;265 }266 }267 268 switch(cfg->stop_bits)269 {270 case 1:271 {272 USART_InitStructure.USART_StopBits = USART_StopBits_1;273 break;274 }275 case 2:276 {277 USART_InitStructure.USART_StopBits = USART_StopBits_2;278 break;279 }280 case 3:281 {282 USART_InitStructure.USART_StopBits = USART_StopBits_0_5;283 break;284 }285 case 4:286 {287 USART_InitStructure.USART_StopBits = USART_StopBits_1_5;288 break;289 }290 default :291 {292 #ifndef RT_USING_FINSH293 rt_kprintf("stopbits bit set error\n");294 #endif295 break;296 }297 }298 299 switch(cfg->parity)300 {301 case 0:302 {303 USART_InitStructure.USART_Parity = USART_Parity_No;304 break;305 }306 case 1:307 {308 USART_InitStructure.USART_Parity = USART_Parity_Odd;309 break;310 }311 case 2:312 {313 USART_InitStructure.USART_Parity = USART_Parity_Even;314 break;315 }316 default :317 {318 #ifndef RT_USING_FINSH319 rt_kprintf("data bit set error\n");320 #endif321 break;322 }323 }324 325 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;326 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;327 USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;328 USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;329 USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;330 USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;331 332 USART_Init(user->uart_device, &USART_InitStructure);333 USART_ClockInit(user->uart_device, &USART_ClockInitStructure); 334 335 /* enable interrupt */336 USART_ITConfig(user->uart_device, USART_IT_RXNE, ENABLE);337 338 return RT_EOK;339 }340 341 342 /***********************************************************************************************************343 @serial private function344 @____________________________________________________________________________*/345 struct rt_uart_ops serial_ops = 346 {347 stm32_serial_config,348 serial_control,349 serial_put_char,350 serial_get_char,351 serial_dma_transmit 352 };353 /***********************************************************************************************************354 @Struct declaration 355 @____________________________________________________________________________*/356 struct serial_configure serial_config = 357 {358 115200, //USART_BaudRate359 8, //USART_WordLength360 1, //USART_StopBits361 0, //USART_Parity362 0, //363 0, //364 0 //365 };366 struct serial_user_data serial_user_struct = 367 {368 USART2, //hardware device369 "uart2" //device name370 };371 struct serial_ringbuffer serial_int_rx_buffer;372 struct serial_ringbuffer serial_int_tx_buffer;373 struct rt_serial_device serialx_device;374 375 void rt_hw_serialx_register(void)376 {377 serialx_device.config = serial_config;378 serialx_device.int_rx = &serial_int_rx_buffer;379 serialx_device.int_tx = &serial_int_tx_buffer;380 serialx_device.ops = &serial_ops;381 382 rt_hw_serial_register(&serialx_device, serial_user_struct.name,383 RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,384 &serial_user_struct);385 }386 387 388 389 390 391 392 393 394 struct serial_user_data serial_user_struct1 = 395 {396 USART1, //hardware device397 "uart1" //device name398 };399 struct rt_serial_device serialx_device1;400 struct serial_ringbuffer serial_int_rx_buffer1;401 struct serial_ringbuffer serial_int_tx_buffer1;402 void rt_hw_serialx_register1(void)403 {404 serialx_device1.config = serial_config;405 serialx_device1.int_rx = &serial_int_rx_buffer1;406 serialx_device1.int_tx = &serial_int_tx_buffer1;407 serialx_device1.ops = &serial_ops;408 409 rt_hw_serial_register(&serialx_device1, serial_user_struct1.name,410 RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_STREAM,411 &serial_user_struct1);412 }413 414 415 416 #ifdef RT_USING_FINSH417 #include
418 static rt_uint8_t led_inited = 0;419 void usarts2(char *str)420 {421 rt_device_t usart;422 423 usart = rt_device_find("uart2");424 rt_device_write(usart,0,str,20);425 }426 FINSH_FUNCTION_EXPORT(usarts2,str)427 #endif428 429 430

 

转载地址:http://xtuwl.baihongyu.com/

你可能感兴趣的文章
iOS11开发教程(二十三)iOS11应用视图实现按钮的响应(3)
查看>>
微软自然语言理解平台LUIS:从零开始,帮你开发智能音箱
查看>>
Centos创建用户
查看>>
视频列表
查看>>
python2 和 python3 区别
查看>>
cd4与cd8比值的意义
查看>>
【配置】log4j.properties 详解与配置步骤
查看>>
js页面载入特效如何实现
查看>>
C#委托和事件
查看>>
TPrinter控制票據打印機
查看>>
Pidgin 插件法解决Ubuntu11.10 QQ
查看>>
你好,WPF
查看>>
iOS开发视频教程下载/iphone开发视频教程下载
查看>>
[转]Android SurfaceView 绘图及帧频处理方法修正
查看>>
读《C++ Primer Plus》的总结
查看>>
每天一点Linux --- 中断键和退出键
查看>>
Python+Django静态文件配置
查看>>
DataSet,DataTable,DateView的关系和用法
查看>>
让IE浏览器支持HTML5标准的方法(转)
查看>>
JBPM流程部署之流程版本升级
查看>>