本帖最后由 xiaolu88856 于 2017-4-25 13:36 编辑
本参考代码实现如下功能:(由于只能上传2M附件,完整功能无法提供,望见谅。)
1. 基于GD32F450IEVM的freeRTOS lwIP移植(代理商给的 );
2. DMA 空闲中断实现;
3. 任务统计vTaskGetRunTimeStats的实现。
GD32F4系列的固件库有较大改动,TCP服务器与串口透传的重点在于第二点,详细代码见附件。
主要流程如下:
a. gd_eval_com_init(EVAL_COM1);
b. uart_init();
- void uart_init(void)
- {
- nvic_irq_enable(USART0_IRQn, 3, 0);
- usart_interrupt_enable(USART0,USART_INTEN_IDLEIE);
- usart_dma_config();//详见代码
- dma_channel_enable(DMA1, DMA_CH2);
- usart_dma_receive_config(USART0, USART_DENR_ENABLE);
- }
c. 中断服务
- void USART0_IRQHandler(void)
- {
- if(usart_interrupt_flag_get(USART0,USART_INT_IDLEIE) == SET)
- {
- //DMA挂起操作见10.4.9 P199
- dma_channel_disable(DMA1, DMA_CH2);
- DMA_INTC0(DMA1) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE,DMA_CH2);
-
- //清除串口空闲中断
- len = USART_STAT0(USART0);
- len = USART_DATA(USART0);
-
- len = ARRAYNUM(rx_buffer) - DMA_CHCNT(DMA1, DMA_CH2);
-
- DMA_CHCNT(DMA1, DMA_CH2) = ARRAYNUM(rx_buffer);
- DMA_CHM0ADDR(DMA1, DMA_CH2) = (uint32_t)rx_buffer;
- DMA_CHPADDR(DMA1, DMA_CH2) = USART0_DATA_ADDRESS;
-
- dma_channel_enable(DMA1, DMA_CH2);
-
- //释放二值信号量
- if(BinarySemaphore!=NULL)//并且二值信号量有效
- {
- BaseType_t xHigherPriorityTaskWoken;
- xSemaphoreGiveFromISR(BinarySemaphore,&xHigherPriorityTaskWoken); //释放二值信号量
- portYIELD_FROM_ISR(xHigherPriorityTaskWoken);//如果需要的话进行一次任务切换
- }
- }
- }
|