本帖最后由 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);//如果需要的话进行一次任务切换
}
}
}
|