打印

GD32F450IEVM实现TCP服务器与串口透传实验

[复制链接]
1834|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaolu88856|  楼主 | 2017-4-25 13:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);//如果需要的话进行一次任务切换
        }
    }
}


FreeRTOS_src.rar

30.65 KB

沙发
xiaolu88856|  楼主 | 2017-4-25 13:36 | 只看该作者
自己顶下

使用特权

评论回复
板凳
dami| | 2017-4-26 14:42 | 只看该作者
好,顶一下

使用特权

评论回复
地板
firstblood| | 2017-4-30 12:05 | 只看该作者
TCP数据透传的这方面的我没怎研究过的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

6

帖子

1

粉丝