本帖最后由 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芯片的主流软件开发平台,一般都是KEIL和IAR,个人对这两个软件都熟系一点,使用没有什么大问题。由于STM32L552ZET6芯片是ST公司新推出的M33核芯片,所以KEIL和IAR的老版本软件都不支持,所以选择下载安装了最新版本的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
|