【杰发科技AC7840x测评】+ 微操作系统+CAN收/发协议栈

感谢21家厚爱,由于最近比较忙,就晚些日子发此帖了。本次发帖的主要内容是介绍一下我编写的一个微小的操作系统及与之匹配的CAN收发管理的协议栈
本着开源和互相学习的精神,就分享给大家了,希望能给21IC及杰发MCU添砖加瓦。也希望各位大佬,给点赞回帖,鼓励鼓励!废话不多说了,直接上。
1.由于采用的是GCC+J-LINK方案,先要把杰发芯片型号及FLASH烧录算法加入至J-LINK
 

 

 


如上图操作,算法文件我也放在最下方附件里了
2。调试参数如下图配置:
 

 


3。再给大家介绍一个segger家出的调试软件-Ozone v3.26c,比较nice
 

 


4.接下来介绍一下这个操作系统的用法,如下:
包含头文件:
#include "SwTmr.h"
#include "task.h"
在taskcfg.h里配置系统参数:
#define TASK_CNT                                    (7u)-->最多任务个数,任务中能被使用的值为0~5,第6个任务分配给了TASKIDLE.0为最高优先级

#define configCPU_CLOCK_HZ                          (120000000u)-->cpu运行的时钟
#define configTICK_RATE_HZ                          (1000u)--->系统节拍,1000表示1毫秒


定义任务参数:栈及优先级等
//----------------------------------------------------------------------------
#define TASK_LED3_PRO                (4u)
#define TASK_LED3_STACK_DEPTH        (128u)
static  uint32_t TaskLed3Stack[TASK_LED3_STACK_DEPTH];
//----------------------------------------------------------------------------
#define TASK_LED4_PRO                (1u)
#define TASK_LED4_STACK_DEPTH        (128u)
static  uint32_t TaskLed4Stack[TASK_LED4_STACK_DEPTH];
//----------------------------------------------------------------------------
#define TASK_LEDRGB_PRO                (3u)
#define TASK_LEDRGB_STACK_DEPTH        (128u)
static  uint32_t TaskLedRgbStack[TASK_LEDRGB_STACK_DEPTH];
//----------------------------------------------------------------------------
#define TASK_CAN_PRO                 (0u)
#define TASK_CAN_STACK_DEPTH         (256u)
static  uint32_t TaskCanStack[TASK_CAN_STACK_DEPTH];
/* Private functions ---------------------------------------------------------*/
在main函数里创建任务:
int main(void)
{
    SystemClock_Config();
    InitDebug();
    printf("GPIO Basic Test\r\n");

    GPIO_LedInit();
    GPIO_KeyInit();
    CanIf_Bus0Init();
//---------------------------------------------------------------------------------
        Task_CreateStatic(Task_Led3,
                                          TaskLed3Stack,
                                          TASK_LED3_STACK_DEPTH,
                                          TASK_LED3_PRO);

        Task_CreateStatic(Task_Led4,
                                          TaskLed4Stack,
                                          TASK_LED4_STACK_DEPTH,
                                          TASK_LED4_PRO);

    Task_CreateStatic(Task_LedRgb,
                      TaskLedRgbStack,
                      TASK_LEDRGB_STACK_DEPTH,
                      TASK_LEDRGB_PRO);

    Task_CreateStatic(Task_Can,
                      TaskCanStack,
                      TASK_CAN_STACK_DEPTH,
                      TASK_CAN_PRO);

//---------------------------------------------------------------------------------
        Task_StartScheduler();
        while(1u)
        {

        }
}
各任务简介:
void Task_Led3(void)//LED3每200ms闪烁一次
{
//------------------------------------
    while (1)
    {
        Task_Delay(200);
        LED3_TOGGLE;
    }
}
void Task_Led4(void)[size=13.3333px]//[size=13.3333px]LED4每400ms闪烁一次
{
//------------------------------------
    while (1)
    {
        Task_Delay(400);
        LED4_TOGGLE;
    }
}
void Task_LedRgb(void)[size=13.3333px]//[size=13.3333px]当有效按键被按下时,会向此任务发一邮件,当本任务收到邮件后,控制RGB灯变一次色
{
    uint8_t key;
//------------------------------------
    while (1)
    {
        //Task_Delay(100);
        key = (uint8_t)Task_WaitMail();
        if(0u != key)
        {   RGB_Toggle();}
    }
}

void Task_Can(void)
{
    uint32_t taskTick;
    uint8_t  key;
//------------------------------------
    taskTick = Task_GetTick();
    //CanSm_Init();   
    //UdsDsp_Init();
    //CanNm_Init();   
    CanCom_MsgInit();---->初始化CAN收发协议栈
    CanTx_Init();-------->初始化发送CAN数据及参数
    CanRx_Init();
//------------------------------------
    while (1)
    {
        key = Get_Key4Value();
        if(0u != key)
        {   Task_GiveMail(TASK_LEDRGB_PRO,(void *)key);}--------》给RGB任务发邮件
        Task_DelayUntil(&taskTick,5u);
        //CanNm_NetworkManageProcess();   
        //UdsDsp_DiagServiceProcess();
        CanCom_MsgDispatch();------------------------------------》运行CAN协议栈
        SwTmr_Dispatch();
    }
}









5。CAN协议栈简介:
CANIF.C里给将MCU的CAN数据进行抽象
static void LoadMessageExp(comMsg_s *pPar)//每帧CAN数据在发送前,进行数据加载,将所需发送的数据在此加载
{
   static uint8_t cnt=0;
//--------------------------------------------------
   pPar->msg.data[0u] = cnt++;
   pPar->msg.data[1u] = 0x34;
   pPar->msg.data[2u] = 0x56;
   pPar->msg.data[3u] = 0x78;
   pPar->msg.data[4u] = 0x9a;
   pPar->msg.data[5u] = 0xbc;
   pPar->msg.data[6u] = 0xde;
   pPar->msg.data[7u] = 0xf5;
}

void CanTx_Init(void)
{
//--------------------------------------------------
   MsgExp1.sendType = CYCLED_FRAME;----》设置为周期发送帧
   MsgExp1.sendDis = 0u;
   MsgExp1.stamp = -1000u+0u;
   MsgExp1.period = 1000u;-------------》发送周期为1秒
   MsgExp1.msg.id = 0x330u;------------》帧ID
   MsgExp1.msg.length = 8u;
   MsgExp1.preDealFunc = LoadMessageExp;-->发送数据加载函数
   (void)CanCom_MsgAdd(&MsgExp1);---------》将本帧加入发送队列
//--------------------------------------------------
   MsgExp2.sendType = CYCLED_FRAME;
   MsgExp2.sendDis = 0u;
   MsgExp2.stamp = -1000u+500u;
   MsgExp2.period = 1000u;
   MsgExp2.msg.id = 0x181EFF78u|CAN_EXTENDED_FRAME_MASK;///扩散帧实例
   MsgExp2.msg.length = 8u;
   MsgExp2.preDealFunc = LoadMessageExp;
   (void)CanCom_MsgAdd(&MsgExp2);
}
6。好了,将程序烧录进开发板:

 

 

91922657a5c3ae154e.png (952.62 KB )

下载附件

2023-12-14 09:36 上传


祝大家玩的愉快!!!请回帖下载源码



 

gccDemo4.7z.zip

2.98 MB。
---------------------
作者:suncl110
链接:https://bbs.21ic.com/icview-3347664-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值