发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[其他ST产品]

【NUCLEO试用】NUCLEO-L552ZE-Q之移植uCOS-II工程(KEIL V2.93.00版本)

[复制链接]
1918|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 yklstudent 于 2020-3-21 17:47 编辑

NUCLEO试用】NUCLEO-L552ZE-Q之移植uCOS-II工程(KEIL V2.93.00版本)

首先感谢21IC论坛和ST公司,有幸参与论坛活动获得NUCLEO-L552ZE-Q开发板。首先上传几张收到的板子图片,感觉板子很棒!
1
file:///C:/Users/reancyao/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg
2
file:///C:/Users/reancyao/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg

由于平时工作忙,只能周末在家开始进行;根据当初的学习计划,分步开始学起。

01步:安装软件开发平台
ST芯片的主流软件开发平台,一般都是KEILIAR,个人对这两个软件都熟系一点,使用没有什么大问题。由于STM32L552ZET6芯片是ST公司新推出的M33核芯片,所以KEILIAR的老版本软件都不支持,所以选择下载安装了最新版本的KEIL(V5.29版本),并专门去KEIL官网下载了STM32L5系列开发包,见下图:
3
file:///C:/Users/reancyao/AppData/Local/Temp/msohtmlclip1/01/clip_image005.png
4
file:///C:/Users/reancyao/AppData/Local/Temp/msohtmlclip1/01/clip_image007.png
KEIL软件和STM32L5开发包怎么下载和安装就不多说了(相信大家都会).

02步:下载STM32Cube_FW_L5_V1.2.0.rar库文件包
ST公司官网可以直接搜索下载“STM32Cube_FW_L5_V1.2.0.rar”库文件包,也可以先下载安装STM32CubeMX软件,然后再通过STM32CubeMX软件下载,个人建议大家可以选择后者。
5
file:///C:/Users/reancyao/AppData/Local/Temp/msohtmlclip1/01/clip_image008.png
6
file:///C:/Users/reancyao/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png

03步:
去官网下载有关NUCLEO-L552ZE-Q开发板本身的资料,不如原理图。

04步:
个人不习惯通过STM32CubeMX软件创建工程,更喜欢自己手工创建。
创建工程步骤大致如下所示:
l  创建工程文件夹,打开KEIL软件,创建工程保存到指定工程文件夹下;
l  拷贝STM32Cube_FW_L5_V1.2.0内官网提供的底层驱动文件(主要是Drivers下的CMSIS和STM32L5_HAL_Driver文件夹下全部内容);
l  由于最近micrium公司已经对其名下的ucos-ii和ucos-iii进行开源,所以选择学习此RTOS系统,拷贝micrium代码包到工程文件夹下;
l  在KEIL软件下添加相应代码,设置各代码所需的文件路径;
l  一切完成后如下图所示:
7
file:///C:/Users/reancyao/AppData/Local/Temp/msohtmlclip1/01/clip_image011.png
8
file:///C:/Users/reancyao/AppData/Local/Temp/msohtmlclip1/01/clip_image013.png

工程附件如下所示:
STM32L552ZET6_uCOSII_Blinky(KEIL V2.93.00).zip (5.09 MB)

工程实现的功能很简单,首先创建启动任务,由启动任务再创建三个用户任务,然后启动任务删除自身
三个用户任务实现的功能也很简单,500ms、500ms和1000ms取反LED引脚,实现LED闪烁目的
main.c文件代码如下所示:
#include "main.h"
#include "mb.h"

static  CPU_STK  AppTaskStartStk[ APP_CFG_STARTUP_TASK_STK_SIZE ];

static  CPU_STK  AppTaskLed1Stk [ APP_CFG_TASK_LED1_STK_SIZE ];
static  CPU_STK  AppTaskLed2Stk [ APP_CFG_TASK_LED2_STK_SIZE ];
static        CPU_STK         AppTaskCoreStk        [ APP_CFG_TASK_CORE_STK_SIZE ];

static  void  AppTaskStart  (void *p_arg);

static  void  AppTaskLed1  ( void * p_arg );
static  void  AppTaskLed2  ( void * p_arg );
static        void  AppTaskCore  ( void * p_arg );

int main(void)
{
        OSInit();

    OSTaskCreateExt(AppTaskStart,
                                        (void*)0,
                                        (OS_STK*)&AppTaskStartStk[APP_CFG_STARTUP_TASK_STK_SIZE - 1],
                                        APP_CFG_STARTUP_TASK_PRIO,
                    APP_CFG_STARTUP_TASK_PRIO,
                                        (OS_STK*) &AppTaskStartStk[0],
                                        APP_CFG_STARTUP_TASK_STK_SIZE,
                    (void*)0,
                                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
                                       
        OSTimeSet(0);
                                       
    OSStart();
}

static CPU_INT32U  BSP_CPU_ClkFreq (void)
{
    LL_RCC_ClocksTypeDef  rcc_clocks;

    LL_RCC_GetSystemClocksFreq(&rcc_clocks);

    return ((CPU_INT32U)rcc_clocks.HCLK_Frequency);
}

static  void  AppTaskStart (void *p_arg)
{
    CPU_INT32U  cpu_clk_freq;
    CPU_INT32U  cnts;

    sInitMCU();                                                 /* Initialize BSP functions                             */
        
    CPU_Init();

    cpu_clk_freq = BSP_CPU_ClkFreq();                           /* Determine SysTick reference freq.                    */
    cnts = cpu_clk_freq / (CPU_INT32U)OS_TICKS_PER_SEC;                /* Determine nbr SysTick increments                     */
    OS_CPU_SysTickInit(cnts);                                   /* Init uC/OS periodic time src (SysTick).              */

    Mem_Init();                                                 /* Initialize Memory Management Module                  */

#if OS_CFG_STAT_TASK_EN > 0u
    OSStatTaskCPUUsageInit(&err);                               /* Compute CPU capacity with no task running            */
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN
    CPU_IntDisMeasMaxCurReset();
#endif

    OSTaskCreateExt(AppTaskLed1,
                                        (void*)p_arg,
                                        (OS_STK*)&AppTaskLed1Stk[APP_CFG_TASK_LED1_STK_SIZE - 1],
                                        APP_CFG_TASK_LED1_PRIO,
                    APP_CFG_TASK_LED1_PRIO,
                                        (OS_STK*) &AppTaskLed1Stk[0],
                                        APP_CFG_TASK_LED1_STK_SIZE,
                    (void*)0,
                                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
                                                                 
    OSTaskCreateExt(AppTaskLed2,
                                        (void*)p_arg,
                                        (OS_STK*)&AppTaskLed2Stk[APP_CFG_TASK_LED2_STK_SIZE - 1],
                                        APP_CFG_TASK_LED2_PRIO,
                    APP_CFG_TASK_LED2_PRIO,
                                        (OS_STK*) &AppTaskLed2Stk[0],
                                        APP_CFG_TASK_LED2_STK_SIZE,
                    (void*)0,
                                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
                                 
        OSTaskCreateExt(AppTaskCore,
                                        (void*)p_arg,
                                        (OS_STK*)&AppTaskCoreStk[APP_CFG_TASK_CORE_STK_SIZE - 1],
                                        APP_CFG_TASK_CORE_PRIO,
                    APP_CFG_TASK_CORE_PRIO,
                                        (OS_STK*) &AppTaskCoreStk[0],
                                        APP_CFG_TASK_CORE_STK_SIZE,
                    (void*)0,
                                        OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
               
        OSTaskDel(OS_PRIO_SELF);  //优先级代表任务
}

/*
*********************************************************************************************************
*                                          LED1 TASK
*********************************************************************************************************
*/

static  void  AppTaskLed1 ( void * p_arg )
{
        (void)p_arg;

    while (DEF_TRUE) {                                          /* Task body, always written as an infinite loop.       */
                GPIOA->ODR ^= GPIO_ODR_OD9;
                OSTimeDlyHMSM(0, 0, 0, 500);
    }
}

/*
*********************************************************************************************************
*                                          LED2 TASK
*********************************************************************************************************
*/

static  void  AppTaskLed2 ( void * p_arg )
{
        (void)p_arg;

    while (DEF_TRUE) {                                          /* Task body, always written as an infinite loop.       */
                GPIOB->ODR ^= GPIO_ODR_OD7;
                OSTimeDlyHMSM(0, 0, 0, 500);
    }        
}

/*
*********************************************************************************************************
*                                          CORE TASK
*********************************************************************************************************
*/

static  void  AppTaskCore ( void * p_arg )
{
        (void)p_arg;
#if defined MBRTU_SLAVE || defined MBRTU_MASTER
        //MB_Init(1000);                // Initialize uC/Modbus, RTU timer at 1000Hz
#endif
#ifdef MBRTU_SLAVE        
#if 0
        MB_CfgCh(   1,                // ... Modbus Node # for this slave channel
                 MODBUS_SLAVE,        // ... This is a SLAVE
                    0,                // ... 0 when a slave
                 MODBUS_MODE_RTU,     // ... Modbus Mode (_ASCII or _RTU)
                    1,                // ... Specify UART #1
                 9600,                // ... Baud Rate
                    8,                // ... Number of data bits 7 or 8
                 MODBUS_PARITY_NONE,  // ... Parity: _NONE, _ODD or _EVEN
                    1,                // ... Number of stop bits 1 or 2
                 MODBUS_WR_EN);       // ... Enable (_EN) or Disable (_DIS) writes
#endif
#if 0
        MB_CfgCh(   1,                // ... Modbus Node # for this slave channel
                 MODBUS_SLAVE,        // ... This is a SLAVE
                    0,                // ... 0 when a slave
                 MODBUS_MODE_RTU,     // ... Modbus Mode (_ASCII or _RTU)
                    2,                // ... Specify UART #1
                 9600,                // ... Baud Rate
                    8,                // ... Number of data bits 7 or 8
                 MODBUS_PARITY_NONE,  // ... Parity: _NONE, _ODD or _EVEN
                    1,                // ... Number of stop bits 1 or 2
                 MODBUS_WR_EN);       // ... Enable (_EN) or Disable (_DIS) writes
#endif
#if 0
        MB_CfgCh(   1,                // ... Modbus Node # for this slave channel
                 MODBUS_SLAVE,        // ... This is a SLAVE
                    0,                // ... 0 when a slave
                 MODBUS_MODE_RTU,     // ... Modbus Mode (_ASCII or _RTU)
                    3,                // ... Specify UART #1
                 9600,                // ... Baud Rate
                    8,                // ... Number of data bits 7 or 8
                 MODBUS_PARITY_NONE,  // ... Parity: _NONE, _ODD or _EVEN
                    1,                // ... Number of stop bits 1 or 2
                 MODBUS_WR_EN);       // ... Enable (_EN) or Disable (_DIS) writes
#endif
#if 0
        MB_CfgCh(   1,                // ... Modbus Node # for this slave channel
                 MODBUS_SLAVE,        // ... This is a SLAVE
                    0,                // ... 0 when a slave
                 MODBUS_MODE_RTU,     // ... Modbus Mode (_ASCII or _RTU)
                    4,                // ... Specify UART #1
                 9600,                // ... Baud Rate
                    8,                // ... Number of data bits 7 or 8
                 MODBUS_PARITY_NONE,  // ... Parity: _NONE, _ODD or _EVEN
                    1,                // ... Number of stop bits 1 or 2
                 MODBUS_WR_EN);       // ... Enable (_EN) or Disable (_DIS) writes
#endif
#if 0
        MB_CfgCh(   1,                // ... Modbus Node # for this slave channel
                 MODBUS_SLAVE,        // ... This is a SLAVE
                    0,                // ... 0 when a slave
                 MODBUS_MODE_RTU,     // ... Modbus Mode (_ASCII or _RTU)
                    5,                // ... Specify UART #1
                 9600,                // ... Baud Rate
                    8,                // ... Number of data bits 7 or 8
                 MODBUS_PARITY_NONE,  // ... Parity: _NONE, _ODD or _EVEN
                    1,                // ... Number of stop bits 1 or 2
                 MODBUS_WR_EN);       // ... Enable (_EN) or Disable (_DIS) writes
#endif
#endif
#ifdef MBRTU_MASTER
        CPU_INT16U p_reg_tbl[20];
        
#if 0
        MB_CfgCh(   1,                // ... Modbus Node # for this slave channel
                 MODBUS_MASTER,       // ... This is a MASTER
                 OS_TICKS_PER_SEC,    // ... 0 when a MASTER
                 MODBUS_MODE_RTU,     // ... Modbus Mode (_ASCII or _RTU)
                    1,                // ... Specify UART #1
                 9600,                // ... Baud Rate
                    8,                // ... Number of data bits 7 or 8
                 MODBUS_PARITY_NONE,  // ... Parity: _NONE, _ODD or _EVEN
                    1,                // ... Number of stop bits 1 or 2
                 MODBUS_WR_EN);       // ... Enable (_EN) or Disable (_DIS) writes
#endif
#endif

    while (DEF_TRUE) {                                          /* Task body, always written as an infinite loop.       */
#ifdef MBRTU_MASTER
                CPU_INT16U err = MODBUS_ERR_NONE;
                err = MBM_FC03_HoldingRegRd(MB_ChTbl,
                                        1,
                                        1,
                                      p_reg_tbl,
                                        8);
                if(err != MODBUS_ERR_NONE)
                {
                        GPIOC->ODR ^= GPIO_ODR_OD7;
                }
#endif
#ifdef MBRTU_SLAVE
                GPIOC->ODR ^= GPIO_ODR_OD7;
#endif
                OSTimeDlyHMSM(0, 0, 1, 0);
    }        
}

#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
    while (1)
    {
    }
}
#endif



使用特权

评论回复

打赏榜单

21ic小喇叭 打赏了 10.00 元 2020-03-23
理由:感谢分享

沙发
yklstudent|  楼主 | 2020-3-21 17:45 | 只看该作者
如果各位下载工程遇到问题,可以自行根据提示删除#include "mb.h"等代码就可以解决

使用特权

评论回复
板凳
hanzhen654| | 2020-3-22 19:28 | 只看该作者
放一个串口打印成功的截图看看,哈哈,HAL库本身带的应该有吧

使用特权

评论回复
地板
yklstudent|  楼主 | 2020-3-22 21:47 | 只看该作者
hanzhen654 发表于 2020-3-22 19:28
放一个串口打印成功的截图看看,哈哈,HAL库本身带的应该有吧

你想要打印什么信息内容?
LED闪烁不香吗?

使用特权

评论回复
5
yklstudent|  楼主 | 2020-3-22 21:51 | 只看该作者
等明天上传一个串口输出打印信息的效果图
如果想要uCModbus_RTU主机和从机的效果图,都可以

使用特权

评论回复
6
21ic小喇叭| | 2020-3-23 08:39 | 只看该作者
感谢分享!

奖励您2000家园币,这是论坛新出的功能,可以兑换礼品或抽奖

再打赏您10元

再次感谢您的宝贵分享!

使用特权

评论回复
7
yklstudent|  楼主 | 2020-3-23 09:29 | 只看该作者
21ic小喇叭 发表于 2020-3-23 08:39
感谢分享!

奖励您2000家园币,这是论坛新出的功能,可以兑换礼品或抽奖

感谢小喇叭

使用特权

评论回复
8
yklstudent|  楼主 | 2020-3-23 12:01 | 只看该作者
hanzhen654 发表于 2020-3-22 19:28
放一个串口打印成功的截图看看,哈哈,HAL库本身带的应该有吧

本人不习惯,也不喜欢HAL库,更喜欢标准库或者LL库
串口打印的截图是没有(主要是没有用到),可以上传个STM32L552ZET6跑uCOS-II+uC-Shell的效果图
后面会新开一个帖子专门介绍,也会上传工程文件
截图效果如下所示:图1:硬件连接图,PC电脑通过USB转TTL小板,与开发板的USART2(GPIOD_PIN05和GPIOD.PIN06引脚)相连接;

图2:测试Sh_add指令,实现输入数据的相加功能

图3:测试Sh_sub指令,实现数据的相减功能;


最后,工程代码就不上传了,会另开新帖子介绍

使用特权

评论回复
9
keaibukelian| | 2020-4-7 13:25 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
10
labasi| | 2020-4-7 13:25 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
11
paotangsan| | 2020-4-7 13:26 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
12
renzheshengui| | 2020-4-7 13:26 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
13
wakayi| | 2020-4-7 13:26 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
14
yklstudent|  楼主 | 2020-4-7 16:53 | 只看该作者
怎么突然回复的人多起来了

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:本人熟悉STM32、PIC、AVR等嵌入式软件开发;联系方式:524716771.

39

主题

3256

帖子

22

粉丝