模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

楼主: zxhgr

DIY航模遥控器和接收机

  [复制链接]
 楼主| 发表于 2017-2-15 09:02:37 | 显示全部楼层
遥控器软件选择FreeRTOS  ,现将部分代码分享出来
int main(void)
{       
         __set_PRIMASK(1);//关全局中断
       
   W25_dat.Sector=0xffff;//设置W25x40内存数据不可用
       
   BSP_Config();//硬件及软件配置
   
         AppResourcesInit();//任务资源初始化       
       
   #if TASK_DEBUG
         xTaskCreate(Simulation_Task,"Simulation_Task1",512,NULL,1,NULL);        //仿真调试监视任务
         xTaskCreate(UartDebug_Task,"UartDebug_Task",512,NULL,3,NULL);        //串口仿真调试监视任务
         UartRxQueue = xQueueCreate(10, sizeof(P_DAT) );//创建串口接收队列
   #endif
         xTaskCreate(Dog_Task,"Dog_200mS",256,NULL,5,NULL);        //看门狗监视任务         
         xTaskCreate(AppInit_Task,"AppInit",512,NULL,9,&AppInitHandleTaskStart);        //应用初始化任务
         
       
         
   
         vTaskStartScheduler();//开始调度任务
        while(1)
        {}
}
void AppInit_Task( void *pvParameters )          //应用初始化任务
{

        #if TASK_DEBUG       
  u8 buf[20];
        #endif
  portTickType xLastWakeTime;         
        const TickType_t xTicksToWait = 50 / portTICK_PERIOD_MS; /* 延迟50ms */
        xLastWakeTime=xTaskGetTickCount();//获取当前心跳值        
        #if TASK_DEBUG               
     DPrintfGetTheKey(); //获取打印资源                       
                 DPrintf("\r\n初始化任务已经启动\r\n");                       
     DPrintfGiveUpKey();//释放打印资源                       
        #endif
       
  for( ;; )
        {                 
                vTaskDelayUntil(&xLastWakeTime,xTicksToWait);
               
    Spi2GetTheKey();//获取Spi2的钥匙               
   
                /**********************FLASH芯片初始化************************/
                W25_dat.ChipID=W25_DeviceID();//读取芯片的8位型号ID  唤醒芯片               
                W25_dat.Jedec_Id=W25_JEDEC_ID();//读取芯片的制造商ID和16位型号ID
    if(W25_ReadSector(0)==0)W25_ReadSector(0);//读指定扇区的数据到内存 如果失败在读取一次
               
                if((W25_dat.page[0][0]!=0x18)||(W25_dat.page[0][1]!=0x18))//判断FLASH是否需要初始化
                 {//以下更新内存
                         W25_dat.page[0][0]=0x18;W25_dat.page[0][1]=0x18;
                         ee_wrfun();//初始化写EE数据
                         for(;W25_WeadeSector()==0;);//将内存的数据写入FLASH                                  
                 }
                else//读取已经初始化的数据
                {
                        ee_rdfun();//初始化读EE数据
                }               
                Spi2GiveUpKey();//归还Spi2的钥匙
               
                /***************打印输出初始化数据*****************/
                #if TASK_DEBUG               
     DPrintfGetTheKey(); //获取打印资源                       
                 DPrintf("\r\nFLASH初始化完成\r\n");                                
                 U8_Uchar(&W25_dat.ChipID,buf,3);buf[3]='\r';buf[4]='\n';buf[5]=0;
                 DPrintf("\r\nFLASH ID编号:");DPrintf((const signed char *)buf);               
                 
                 DPrintf("\r\n初始化任务删除自身任务\r\n");                       
     DPrintfGiveUpKey();//释放打印资源                       
                #endif       
    LcmInit();//液晶初始化?
    lcd_rst_flag=1;//液晶完成初始化
                AppTaskCreate();//创建任务
                vTaskDelete(AppInitHandleTaskStart);//应用初始化任务执行一次后删除任务
        }
}
void Dog_Task( void *pvParameters )          //看门狗监视任务
{
  EventBits_t uxBits;
  portTickType xLastWakeTime;         
        const TickType_t xTicksToWait = 200 / portTICK_PERIOD_MS; /* 延迟200ms */
        xLastWakeTime=xTaskGetTickCount();//获取当前心跳值
        /*
          开始执行启动任务主函数前使能独立看门狗。
          设置LSI是128分频,下面函数参数范围0-0xFFF,分别代表最小值3.2ms和最大值13107.2ms
          下面设置的是1s,如果1s内没有喂狗,系统复位。
        */
        bsp_InitIwdg(0x138);

#if TASK_DEBUG       
    DPrintfGetTheKey(); //获取打印资源                       
                DPrintf("\r\n监视任务已经启动 \r\n");               
    DPrintfGiveUpKey();//释放打印资源       
#endif
  for( ;; )
        {   
                vTaskDelayUntil(&xLastWakeTime,xTicksToWait);
    /* 等待所有任务发来事件标志 */
                uxBits = xEventGroupWaitBits(DogEventGroup, /* 事件标志组句柄 */
                                                                 TASK_BIT_0_1,       /* 等碩ASK_BIT_0_1被设置 */
                                                                 pdTRUE,             /* 退出前TASK_BIT_0_1被清除,这里是TASK_BIT_0_1都被设置才表示“退出”*/
                                                                 pdTRUE,             /* 设置为pdTRUE表示等待TASK_BIT_0_1都被设置*/
                                                                 xTicksToWait);          /* 等待延迟时间 */
               
                if((uxBits & TASK_BIT_0_1) == TASK_BIT_0_1)
                {
                        IWDG_Feed();//喂狗                       
                        #if TASK_DEBUG               
      //DPrintfGetTheKey(); //获取打印资源       
                        //DPrintf("喂狗成功\r\n");       
      //DPrintfGiveUpKey();//释放打印资源                       
                        #endif                       
                }
          else
                {
                        #if TASK_DEBUG       
      //DPrintfGetTheKey(); //获取打印资源                       
                        //DPrintf("等待喂狗指令\r\n");       
     // DPrintfGiveUpKey();//释放打印资源                                       
                        #endif               
                }
        }
}
void UartDebug_Task( void *pvParameters )//串口仿真调试任务
{
        u8 buf[512];
  P_DAT p_dat;       
        u16 len;
        for(;;)
        {
                xQueueReceive(UartRxQueue,&p_dat,portMAX_DELAY);
               
                if(p_dat.id==1)                       
                {
                        len=UsartTaskRead(&p_dat,buf,USART1_MAX_LEN);//解析读取数据
                        Uart1GetTheKey();//获取串口1的钥匙
                        Usart1Tx(buf,len);         //发送数据      
                        Uart1GiveUpKey();//归还串口1的钥匙                       
                }               
        }
       
}
void Simulation_Task( void *pvParameters )//仿真调试监视任务
{
        portTickType xLastWakeTime;         
  uint8_t pcWriteBuffer[512];
        const TickType_t xTicksToWait = 5000 / portTICK_PERIOD_MS; /* 延迟5000ms */
        xLastWakeTime=xTaskGetTickCount();//获取当前心跳值

        DPrintfGetTheKey(); //获取打印资源       
        DPrintf("\r\n仿真任务已经启动 \r\n");                
  DPrintfGiveUpKey();//释放打印资源

        for(;;)
        {
                vTaskDelayUntil(&xLastWakeTime,xTicksToWait);//延迟10s

                DPrintfGetTheKey(); //获取打印资源
                DPrintf("=================================================\r\n");
                DPrintf("   任务名称  任务状态 优先级  剩余栈  任务序号 \r\n\r\n");
                vTaskList( (char *)&pcWriteBuffer );                                               
                DPrintf((const signed char *)pcWriteBuffer);
               
                DPrintf("=================================================\r\n");
                DPrintf("  任务名称     运行计数      使用效率 \r\n\r\n");
                vTaskGetRunTimeStats( (char *)&pcWriteBuffer );                                               
                DPrintf((const signed char *)pcWriteBuffer);       
               
                DPrintfGiveUpKey();//释放打印资源
        }
       
}
void AppTaskCreate(void)//创建任务
{  
        RF2401xQueue = xQueueCreate(10, sizeof(RF_DAT) );//创建RF接收队列
        xTaskCreate(Task0,"Task0",512,NULL,3,NULL);
        xTaskCreate(ADC_Task,"ADC_Task",256,NULL,8,NULL);       
        xTaskCreate(URT_DEBUG_Task,"URT_DEBUG_Task",512,NULL,5,NULL);
        xTaskCreate(NRF2401_Task,"NRF2401_Task",512,NULL,9,NULL);
        xTaskCreate(NRF2401TX_Task,"NRF2401TX_Task",512,NULL,9,NULL);//最高优先级
        xTaskCreate(Task_lcd,"Task_lcd",512,NULL,3,NULL);
        xTaskCreate(Tim5mS_Task,"Tim10mS",512,NULL,8,NULL);        //5毫秒定时器任务
       
}

void Tim5mS_Task( void *pvParameters )          //5毫秒定时器任务
{ u8 i,rf_da;
        RF_DAT  rf_dat;
  portTickType xLastWakeTime;         
        const TickType_t xTicksToWait = 5/ portTICK_PERIOD_MS; /* 延迟5ms */
        xLastWakeTime=xTaskGetTickCount();//获取当前心跳值
  for( ;; )
        {                 
                vTaskDelayUntil(&xLastWakeTime,xTicksToWait);//延迟5ms
                rf_da++;
    if(rf_da>=2){rf_da=0;rf_dat.id=1; rf_dat.p=NULL;xQueueSend(RF2401xQueue,&rf_dat,pdPASS);}
               
    if(bz_con){bz_con--;GPIO_SetBits(GPIOA,GPIO_Pin_12);}//蜂鸣器控制
    else{GPIO_ResetBits(GPIOA,GPIO_Pin_12);}
                               
    key_bmbuf[key_bmcnt]=GPIO_ReadInputData(GPIOB);
                key_bmcnt++;if(key_bmcnt>=20){key_bmcnt=0;if(key_bmflag==0){key_bmflag=1;for(i=0;i<50;i++){key_bmbuff[i]=key_bmbuf[i];}}}
                UsartRxQuery();//串口接收查询函数       
                /* 发送事件标志,表示任务正常运行 */
                xEventGroupSetBits(DogEventGroup, TASK_BIT_1);
        }
}
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-2-15 09:10:18 | 显示全部楼层
管理员同志在吗 ?我上传的图片一直等待审核 ,希望尽快 审核  以便分享更多的资料 及说明文档 和开发制作实例    谢谢了!!
回复 支持 1 反对 0

使用道具 举报

发表于 2017-2-16 12:42:27 | 显示全部楼层
一个遥控还得买两个编程器才能做
表示不理解  既然选择32
那接收用STM8  或者STM32
不好吗  非得加个老掉牙的atmega8
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-2-16 13:49:10 | 显示全部楼层
谢谢您的建议   当初考虑接收机用atmega8  主要考虑的是这款芯片 性价比高  单指令执行周期  里边有EE  再有就是 AVR的产品相对来比较稳定,可靠性比较好,如果STM8作为接收机 担心在飞机上电机干扰比较大会出现不稳定的情况   谢谢你的意见和建议
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2017-2-16 13:52:47 | 显示全部楼层
DIY航模遥控器和接收机  作者:zxhgr 7901
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-2-16 13:54:02 | 显示全部楼层
DIY航模遥控器和接收机  作者:zxhgr 8388
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2017-2-16 13:54:23 | 显示全部楼层
DIY航模遥控器和接收机  作者:zxhgr 289
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-2-16 13:56:27 | 显示全部楼层
DIY航模遥控器和接收机  作者:zxhgr 1936 DIY航模遥控器和接收机  作者:zxhgr 7652 DIY航模遥控器和接收机  作者:zxhgr 1724 DIY航模遥控器和接收机  作者:zxhgr 1255 DIY航模遥控器和接收机  作者:zxhgr 8231
回复 支持 1 反对 0

使用道具 举报

发表于 2017-2-17 09:26:42 | 显示全部楼层
freertos怎么样,好用吗,和ucosii比有什么优缺点
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-2-17 14:12:52 | 显示全部楼层
freertos 个人觉得可 ucosii主要考虑 不能够商业应用 ,涉及到版权,一般的公司很少采用 ,采用的也是不敢公开采用。所以个人感觉不是特别的舒服。freertos 是开源的的 不涉及版权问题  所以 没有这层枷锁  而且可以不断地完善 个人认为 freertos 是不错的选择。开始也学习了ucosii一段时间,后来果断放弃了  。无论是个人做产品 还是给公司做产品 都不愿意看到 商务和经济上的纠纷,作为开发技术人员 还是专心做技术比较好,当然如果您就职在大公司,可以花费各种版权费用 ucosii是不错的选择。
回复 支持 2 反对 0

使用道具 举报

发表于 2017-2-19 07:34:28 | 显示全部楼层
有两下子。。。。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-9-7 17:01:38 | 显示全部楼层
现在正在设计一款 兼容所有遥控器的 接收机 和数传套件,设计 完成并实验后 将分享到论坛
回复 支持 1 反对 0

使用道具 举报

发表于 2017-9-9 16:09:41 | 显示全部楼层

厉害了厉害了
回复 支持 1 反对 0

使用道具 举报

发表于 2017-11-4 11:53:27 | 显示全部楼层
路过,看热闹的
回复 支持 0 反对 1

使用道具 举报

发表于 2017-11-27 22:53:22 | 显示全部楼层
楼主,怎样了,有资料吗
回复 支持 0 反对 1

使用道具 举报

发表于 2017-12-21 23:06:25 | 显示全部楼层
这个要学习,留个脚印
回复 支持 0 反对 1

使用道具 举报

发表于 2017-12-23 22:18:33 | 显示全部楼层
支持楼主,学习一下
回复 支持 0 反对 1

使用道具 举报

发表于 2018-10-26 17:51:56 | 显示全部楼层
楼主我也在做遥控器,目前在对码方面困扰了1个月,能不能交流一下,谢谢啦,我QQ:1985334892,或者你留个联系方式

点评

qq958515384  详情 回复 发表于 2018-10-28 11:11
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-10-28 11:11:22 | 显示全部楼层
zoney 发表于 2018-10-26 17:51
楼主我也在做遥控器,目前在对码方面困扰了1个月,能不能交流一下,谢谢啦,我QQ:1985334892,或者你留个联 ...

qq958515384
回复 支持 0 反对 1

使用道具 举报

发表于 2019-9-25 21:28:51 来自手机 | 显示全部楼层
做好没有呢?希望没有烂尾
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|关于模吧|APP下载|广告报价|手机版|企业会员|商城入驻|联系我们|模吧 ( 黔ICP备2022002348号-1 )

© 2013-2020 Moz8.com 模吧,玩出精彩!