硬汉嵌入式论坛

 找回密码
 立即注册
楼主: eric2013
收起左侧

[以太网] 新版RL-TCPnet V7.X网协议栈和物联网教程开始更新,配RTX5和FreeRTOS两版本,更新至第14章(2020-01-19)

  [复制链接]

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-24 12:12:48 | 显示全部楼层
请帮忙看看:
#include "dac.h"
#include "math.h"


//////////////////////////////////////////////////////////////////////////////////                                                                   
//////////////////////////////////////////////////////////////////////////////////        


#define  DACSAMPLEUMBER  300

u16 g_usWaveBuffp[DACSAMPLEUMBER];
u16 g_usWaveBuffn[DACSAMPLEUMBER];
DAC_HandleTypeDef DacHandle;//DAC





//初始化DAC
void DAC1_Init(void)
{
        u16 i;
        DAC_ChannelConfTypeDef sConfig;//DAC通道       
        /* 生成正弦波数据 */       
        MakeSinTable(g_usWaveBuffp, DACSAMPLEUMBER, 0, 4000);
        for(i =0; i < DACSAMPLEUMBER; i++)g_usWaveBuffn[i] = g_usWaveBuffp[DACSAMPLEUMBER - 1 - i];       
        /*##-4- 配置DAC通道######################################*/
        DacHandle.Instance=DAC1;
        HAL_DAC_Init(&DacHandle);//初始化DAC               
        sConfig.DAC_Trigger = DAC_TRIGGER_T6_TRGO;                    /* 采用定时器6触发 */
        sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;           /* 使能输出缓冲 */
        HAL_DAC_ConfigChannel(&DacHandle,&sConfig,DAC_CHANNEL_1);     /*DAC通道1配置*/
        DAC_WaveConfig();
  
}

//初始化DMA
void DAC_WaveConfig(void)
{       
        DMA_HandleTypeDef  hdma_dac1;/*DMA0*/
        DMA_HandleTypeDef  hdma_dac2;/*DMA1*/
        __HAL_RCC_DMA2_CLK_ENABLE();
        /*##-5- 配置通道1的DMA ##########################################*/       
        hdma_dac1.Instance = DMA2_Stream2;              /*使用的DAM1 Stream2*/
        hdma_dac1.Init.Request  = DMA_REQUEST_DAC1;     /*DAC触发DMA传输*/
        hdma_dac1.Init.Direction = DMA_MEMORY_TO_PERIPH;/*存储器到外设*/
        hdma_dac1.Init.PeriphInc = DMA_PINC_DISABLE;    /*外设地址禁止自增*/
        hdma_dac1.Init.MemInc = DMA_MINC_ENABLE;        /*存储器地址自增*/
        hdma_dac1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /*外输操作数据宽度,半字*/
        hdma_dac1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;    /*存储器操作数据宽度,半字*/
        hdma_dac1.Init.Mode = DMA_CIRCULAR;                           /*循环模式*/
        hdma_dac1.Init.Priority = DMA_PRIORITY_HIGH;                  /*优先级高*/          
        HAL_DMA_Init(&hdma_dac1);
        /* 关联DMA句柄到DAC句柄下 */
        __HAL_LINKDMA(&DacHandle, DMA_Handle1, hdma_dac1);  
        /* 启动DAC DMA */
        HAL_DAC_Start_DMA(&DacHandle, DAC_CHANNEL_1, (u32 *)g_usWaveBuffn, DACSAMPLEUMBER, DAC_ALIGN_12B_R);  
}

//DAC底层驱动,时钟配置,引脚 配置
//此函数会被HAL_DAC_Init()调用
//hdacAC句柄
void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
{      
        GPIO_InitTypeDef GPIO_Initure;       
        __HAL_RCC_DAC12_CLK_ENABLE();           //使能DAC时钟
        __HAL_RCC_GPIOA_CLK_ENABLE();                                                //开启GPIOA时钟
        //配置引脚
        GPIO_Initure.Pin=GPIO_PIN_4;            //PA4
        GPIO_Initure.Mode=GPIO_MODE_ANALOG;     //模拟
        GPIO_Initure.Pull=GPIO_NOPULL;          //不带上下拉
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);
}

//定时器6触发DAC输出
void TIM6_Config(void)
{
        TIM_HandleTypeDef htim;//定时器
        TIM_MasterConfigTypeDef sMasterConfig;       
        /* TIM6 时钟使能 */
        __HAL_RCC_TIM6_CLK_ENABLE();
        /* 配置定时器外设 */
        htim.Instance = TIM6;
        htim.Init.Period            = 49;
        htim.Init.Prescaler         = 0;
        htim.Init.ClockDivision     = 0;
        htim.Init.CounterMode       = TIM_COUNTERMODE_UP;
        htim.Init.RepetitionCounter = 0;
        HAL_TIM_Base_Init(&htim);
        /* TIM6 TRGO 选择 */
        sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
        sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
        HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig);
        /* 使能定时器 */
        HAL_TIM_Base_Start(&htim);
}

//功能说明: 计算产生正弦波数组
static void MakeSinTable(u16 *_pBuf, u16 _usSamples, u16 _usBottom, u16 _usTop)
{
        u16 i;
        u16 mid;        /* 中值 */
        u16 att;        /* 幅度 */

        mid = (_usBottom + _usTop) / 2;                /* 0位的值 */
        att = (_usTop - _usBottom) / 2;          /* 正弦波幅度,峰峰值除以2 */

        for (i = 0; i < _usSamples; i++)
        {
                _pBuf[i] = mid + (s32)(att * sin((i * 2 * 3.1415926f) / _usSamples));
        }
}
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-24 12:22:48 | 显示全部楼层
请指教:
链接:https://pan.baidu.com/s/1wRzcJNnJNAvvr0cOYWpBuw
提取码:g5kq
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-24 16:42:41 | 显示全部楼层
其实就是将下面两个例程合并:
1、V7-020_ADC+DMA的多通道采集
2、网络实验6 RAW_TCP客户端实验
发现以RL-TCP为基础添加DAC+DMA无法输出,项目中正好要用到,及时DAC不用DMA传输,后面的ADC功能也必须要用DMA传输
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-25 16:56:25 | 显示全部楼层
怎么样了,找到问题原因了么?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-5-26 09:36:31 | 显示全部楼层
wanglq1145 发表于 2022-5-25 16:56
怎么样了,找到问题原因了么?

image.png
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-26 19:39:50 | 显示全部楼层
太感谢了,哈哈,成了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-5-27 00:59:53 | 显示全部楼层
wanglq1145 发表于 2022-5-26 19:39
太感谢了,哈哈,成了

好的,这个地方是个坑,不注意时,很容易入坑。
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2022-5-27 23:57:08 | 显示全部楼层
eric2013 发表于 2022-5-17 00:07
这个要使用指定的版本,使用MDK5.30,然后务必是它自带的CMSIS 5.7.0和他带的中间件版本7.13。

非常感谢;用自己的工具测试TCP 传输可达7M 以上(可能工具问题没达到10M);然后再请教个问题;我在里面又加了个线程,间隔5us读取AD7606的数据(参考例程AD7606,200Khz频率,利用AD7606中断 + 信号量同步此线程),此线程优先级比TCP传输的线程要高一级;发现这时候TCP的数据传输速度会降到20K左右;请问这是什么原因
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-5-28 09:58:49 | 显示全部楼层
ky625 发表于 2022-5-27 23:57
非常感谢;用自己的工具测试TCP 传输可达7M 以上(可能工具问题没达到10M);然后再请教个问题;我在里面 ...

这个应该是7606任务执行太频繁了,不是有个DMA双缓冲的7606例子,你把缓冲设置的打点,比如两个20KB的缓冲。一个缓冲满了通知下7606任务执行。
回复

使用道具 举报

6

主题

42

回帖

60

积分

初级会员

积分
60
发表于 2022-5-31 01:20:44 | 显示全部楼层
请问 RTX5  UDP的例程 有没有啊?
回复

使用道具 举报

6

主题

42

回帖

60

积分

初级会员

积分
60
发表于 2022-5-31 15:50:36 | 显示全部楼层
大哥,udp的例程 为啥子不发啊?
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-31 16:05:10 | 显示全部楼层
在请教一个问题:
在RL-TCP基础上运行ADC+DMA可是发现速度太慢基本上是1秒才采集一个数怎么回事,需要将所用变量放到DTCM里么?
/*
*********************************************************************************************************
*        函 数 名: AppTaskADC
*        功能说明: TCPnet应用任务
*        形    参: 无
*        返 回 值: 无
* 优 先 级: osPriorityNormal4
*********************************************************************************************************
*/
void AppTaskADC(void *argument)
{       
        uint32_t i;
        float ADC_speed=1.0f*1000.0f*1000.0f;
        float Signal_speed=13.0f*1000.0f;               
  float Va,Vb;
        /* 初始化动态内存空间 */
//        osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));       
//  Build_matrixD( ADC_speed, Signal_speed, ADCDISNUMBER);       
//        ADCFValues1 = osRtxMemoryAlloc(AppMallocAXISRAM, ADCDISNUMBER * sizeof( float ), 0);
//        if(ADCFValues1==NULL) printf("LMD_Ans build mem error/r/n");
//        ADCFValues2 = osRtxMemoryAlloc(AppMallocAXISRAM, ADCDISNUMBER * sizeof( float ), 0);
//        if(ADCFValues2==NULL) printf("LMD_Ans build mem error/r/n");
//  LVDT_DSP_init();
       
        bsp_ADC_Start(); /* 开启ADC */
        while(1)
        {
                if(g_adc_conver_end)
                {
//                        Va=LVDT_A(ADCFValues1,ADCDISNUMBER);
//                        Vb=LVDT_A(ADCFValues2,ADCDISNUMBER);
//                        fDemoduResult=LVDT_Dis(Va,Vb);
                        for (i = 0; i < ADCDISNUMBER; i++)
                        {
                                printf("ADC3 = %f\r\n", ADCFValues1[i]);
                        }                       
                        g_adc_conver_end=0;
                        bsp_SetADC(OVERSAMP_1);/* 设置ADC */
                        bsp_ADC_Start();/* 开启ADC */
                }
                else ADC_Disp();
//                osDelay(2);
        }       
}
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-31 16:15:59 | 显示全部楼层
这是程序源码,请一定看看呀,谢谢
链接:https://pan.baidu.com/s/1FWVEoeJlo_D8mrLmeCxS8Q
提取码:h516
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-5-31 17:08:57 | 显示全部楼层
中尴人 发表于 2022-5-31 15:50
大哥,udp的例程 为啥子不发啊?

看官方手册,TCPnet的UDP很简单,楼主位任意下载个例子,执行下面这个代码即可
image.png
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-31 17:18:53 | 显示全部楼层
链接:https://pan.baidu.com/s/1m5WK84zuqyAWo95iLjp47g
提取码:czsh
这是ADC+DMA的裸机程序,跑起来很快的,但移到RT_TCP上就很慢,请帮忙看看,谢谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-5-31 17:19:06 | 显示全部楼层
wanglq1145 发表于 2022-5-31 16:15
这是程序源码,请一定看看呀,谢谢
链接:https://pan.baidu.com/s/1FWVEoeJlo_D8mrLmeCxS8Q
提取码:h5 ...

你的上传代码是那部分。
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-31 17:22:37 | 显示全部楼层
一个是基于RL_TCP上运行的DAC-DMA+ADC-DMA,
一个是裸机DAC-DMA+ADC-DMA,
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-5-31 18:13:54 | 显示全部楼层
有没有 基于RL-TCP的ADC例程呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-6-1 09:48:11 | 显示全部楼层
wanglq1145 发表于 2022-5-31 17:22
一个是基于RL_TCP上运行的DAC-DMA+ADC-DMA,
一个是裸机DAC-DMA+ADC-DMA,

我的意思是那一部分是你的TCP数据上传部分,上传是发给网络助手使用了吗
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-6-1 10:11:30 | 显示全部楼层
220531-RL-TCP+ADC+DAC里面的下面这段代码是TCP数据上传部分,发给网络助手。发送很快的,这个任务是ADC采集void AppTaskADC(void *argument)裸机中跑的很快的,但是移到系统中ADC就失效了,数据飘的厉害,而且还很慢
void TCPnetTest(void)
{

        uint8_t tcplen;
        uint8_t indx,tpi;       
        uint32_t tpk,tpl;
        netStatus res;               
        const uint16_t usMaxBlockTime = 2; /* 延迟周期 */
        uint32_t i;
        float ADC_speed=1.0f*1000.0f*1000.0f;
        float Signal_speed=13.0f*1000.0f;               
  float Va,Vb;
        /* 初始化动态内存空间 */
        osRtxMemoryInit(AppMallocAXISRAM, sizeof(AppMallocAXISRAM));       
  Build_matrixD( ADC_speed, Signal_speed, ADCDISNUMBER);       
        ADCFValues1 = osRtxMemoryAlloc(AppMallocAXISRAM, ADCDISNUMBER * sizeof( float ), 0);
        if(ADCFValues1==NULL) printf("LMD_Ans build mem error/r/n");
        ADCFValues2 = osRtxMemoryAlloc(AppMallocAXISRAM, ADCDISNUMBER * sizeof( float ), 0);
        if(ADCFValues2==NULL) printf("LMD_Ans build mem error/r/n");
  LVDT_DSP_init();       
       
       
        tcp_sock = netTCP_GetSocket (tcp_cb_client);       
        if (tcp_sock > 0)
        {
                /* 使能TCP_TYPE_KEEP_ALIVE,会一直保持连接 */
                netTCP_SetOption (tcp_sock, netTCP_OptionKeepAlive, 1);       
                if(netTCP_GetState(tcp_sock) != netTCP_StateESTABLISHED)
                {
                        res = netTCP_Connect (tcp_sock, (NET_ADDR *)&addr, LocalPort_NUM);
                        printf_debug("%s\r\n", ReVal_Table[res]);
                }               
        }
        bsp_ADC_Start(); /* 开启ADC */
        while (1)
        {
                if(g_adc_conver_end)
                {
                        Va=LVDT_A(ADCFValues1,ADCDISNUMBER);
                        Vb=LVDT_A(ADCFValues2,ADCDISNUMBER);
                        fDemoduResult=LVDT_Dis(Va,Vb);
//                        for (i = 0; i < ADCDISNUMBER; i++)
//                        {                        
//                                printf(" %f\r\n", ADCFValues1[i]);                               
//                        }               
                        g_adc_conver_end=0;
                        bsp_SetADC(OVERSAMP_1);/* 设置ADC */
                        bsp_ADC_Start();/* 开启ADC */
                       
                        //触发上传
                        if(EVmode)
                        {
                                EvtFlag = osThreadFlagsWait(0x0000000FU, osFlagsWaitAny, usMaxBlockTime);               
                                /* 按键消息的处理 */
                                switch (EvtFlag)
                                {
                                        /* 给远程TCP客户端发送8字节数据 */
                                        case FLAG_BIT0:
                                                tcplen=SingleSend(fDemoduResult,AckSendBuf);                                                       
                                                if(netTCP_GetState(tcp_sock) == netTCP_StateESTABLISHED){
                                                        SendData(AckSendBuf,tcplen);
                                                }
                                                break;

                                        /*给远程TCP客户端发送多字节打包数据 */
                                        case FLAG_BIT1:       
                                                if(netTCP_GetState(tcp_sock) == netTCP_StateESTABLISHED)
                                                {                               
                                                        for(tpi=0;tpi<indx;tpi++)
                                                        {
                                                                SendData(client_W_buf[tpi],SENDSIZE);       
                                                        }
                                                        SendData(client_W_buf[indx],tpl);                               
                                                }
                                                for(tpk=0;tpk<TCPNUMSEND;tpk++)fWemoduResult[tpk]=0;
                                                indx=0;
                                                tpl=0;                       
                                                break;                                                                                       
                                }
                        }
                        else//主动上传
                        {
        //                if(Send_Flag)
        //                {                               
                                        tcplen=SingleSend(fDemoduResult,AckSendBuf);               
                                        if(netTCP_GetState(tcp_sock) == netTCP_StateESTABLISHED){
                                                SendData(AckSendBuf,tcplen);
                                        }
        //                        Send_Flag=0;                       
        //                }                       
                        }                       
                       
                }
                else ADC_Disp();       
//                osDelay(2);//延时ms级       
        }
}
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-6-6 10:01:14 | 显示全部楼层
找到问题原因了么?还是说RTX5系统对ADC这块不兼容
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-6-8 09:50:57 | 显示全部楼层
wanglq1145 发表于 2022-6-6 10:01
找到问题原因了么?还是说RTX5系统对ADC这块不兼容

这两个毫无关系,完全兼容。
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-6-22 19:35:20 | 显示全部楼层
发现一个奇怪的问题:
运行这个V7-1008_RL-TCPnet V7.X实验_TCP客户端(RTX5)程序时,配置成ETH0_DHCP_BOOTFILE =0 ,不插网线时指示灯还闪烁着,插上网线后底板上的等就不闪了,也没连上网,之前试过还好好的,仿真时连接终止case netTCP_EventAborted:难道是我的板子坏了
                       
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-8-26 09:00:45 | 显示全部楼层
请教个问题,我用的是这个例程:V7-1008_RL-TCPnet V7.X实验_TCP客户端(RTX5),V7开发板是1000MBit
网口呀,为什么开机串口提示是100MBit?是显示错了,还是需要修改某处配置
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-8-26 09:51:38 | 显示全部楼层
wanglq1145 发表于 2022-8-26 09:00
请教个问题,我用的是这个例程:V7-1008_RL-TCPnet V7.X实验_TCP客户端(RTX5),V7开发板是1000MBit
网口 ...

记错了,就是100Mbps
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-8-26 18:30:43 | 显示全部楼层
什么意思?硬件芯片不是1000MBit的么?
回复

使用道具 举报

1

主题

23

回帖

26

积分

新手上路

积分
26
发表于 2022-8-26 18:31:24 | 显示全部楼层
什么意思?硬件网口是1000MBit的呀
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106437
QQ
 楼主| 发表于 2022-8-27 10:55:46 | 显示全部楼层
wanglq1145 发表于 2022-8-26 18:31
什么意思?硬件网口是1000MBit的呀

硬件网口是100Mbps
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-20 17:25 , Processed in 0.305538 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表