下载资源清单
| 资源 | 描述 | |
|---|---|---|
| mspm0_sdk_2_09_00_01 | MSPM0 Software Development Kit. The MSPM0 SDK provides the ultimate collection of software, tools and documentation to accelerate the development of applications for the MSPM0 MCU platform under a single software package. | Download |
| CCSTUDIO | Code Composer Studio™ integrated development environment (IDE) | Download |
| SEGGER J-Links | SEGGER J-Links are the most widely used line of debug probes available today | Download |
第一个项目
导入项目
- 点击下图Import Projects
- 选定项目目录
- 根据开发板修改Blink LED
配置
- 打开项目properties
- 配置SEGGER JLINK
- 配置ARM HEX Utility
3.1 General Options
3.2 Output format Options
Build & Flash Project
代码解析
main.c
intmain(void){/* Prepare the hardware to run this demo. */prvSetupHardware();main_blinky();return0;}- prvSetupHardware():执行硬件相关初始化(在本文件中最终调用了 SYSCFG_DL_init()),准备外设/时钟等以供后续任务使用。
- main_blinky():启动 blinky 示例程序,通常会在该函数中创建 FreeRTOS 任务并启动调度器(例如调用 vTaskStartScheduler),因此正常情况下该函数不会返回。
main_blinky.c
/* Kernel includes. */#include"FreeRTOS.h"#include"semphr.h"#include"task.h"/* TI includes. */#include"ti_msp_dl_config.h"/* Priorities at which the tasks are created. */#definemainQUEUE_RECEIVE_TASK_PRIORITY(tskIDLE_PRIORITY+2)#definemainQUEUE_SEND_TASK_PRIORITY(tskIDLE_PRIORITY+1)/* * The rate at which data is sent to the queue. The 1s (1000ms) value is * converted to ticks using the pdMS_TO_TICKS constant. */#definemainQUEUE_SEND_FREQUENCY_MS(pdMS_TO_TICKS(1000UL))/* * The number of items the queue can hold. This is 1 as the receive task * will remove items as they are added, meaning the send task should always * find the queue empty. */#definemainQUEUE_LENGTH(1)/* * Values passed to the two tasks just to check the task parameter * functionality. */#definemainQUEUE_SEND_PARAMETER(0x1111UL)#definemainQUEUE_RECEIVE_PARAMETER(0x22UL)/*-----------------------------------------------------------*//* The tasks as described in the comments at the top of this file. */staticvoidprvQueueReceiveTask(void*pvParameters);staticvoidprvQueueSendTask(void*pvParameters);/* Called by main() to create the simply blinky style application */voidmain_blinky(void);/*-----------------------------------------------------------*//* The queue used by both tasks. */staticQueueHandle_t xQueue=NULL;/*-----------------------------------------------------------*/voidmain_blinky(void){/* Create the queue. */xQueue=xQueueCreate(mainQUEUE_LENGTH,sizeof(uint32_t));if(xQueue!=NULL){/* * Start the two tasks as described in the comments at the top of this * file. */xTaskCreate(prvQueueReceiveTask,/* The function that implements the task. */"Rx",/* The text name assigned to the task - for debug only as it is not used by the kernel. */configMINIMAL_STACK_SIZE,/* The size of the stack to allocate to the task. */(void*)mainQUEUE_RECEIVE_PARAMETER,/* The parameter passed to the task - just to check the functionality. */mainQUEUE_RECEIVE_TASK_PRIORITY,/* The priority assigned to the task. */NULL);/* The task handle is not required, so NULL is passed. */xTaskCreate(prvQueueSendTask,"TX",configMINIMAL_STACK_SIZE,(void*)mainQUEUE_SEND_PARAMETER,mainQUEUE_SEND_TASK_PRIORITY,NULL);/* Start the tasks. */vTaskStartScheduler();}/* * If all is well, the scheduler will now be running, and the following * line will never be reached. If the following line does execute, then * there was insufficient FreeRTOS heap memory available for the idle * and/or timer tasks to be created. See the memory management section on * the FreeRTOS web site for more details. */for(;;);}/*-----------------------------------------------------------*/staticvoidprvQueueSendTask(void*pvParameters){TickType_t xNextWakeTime;constunsignedlongulValueToSend=100UL;/* Check the task parameter is as expected. */configASSERT(((unsignedlong)pvParameters)==mainQUEUE_SEND_PARAMETER);/* Initialize xNextWakeTime - this only needs to be done once. */xNextWakeTime=xTaskGetTickCount();for(;;){/* * Place this task in the blocked state until it is time to run again. * The block time is specified in ticks, the constant used converts * ticks to ms. While in the Blocked state this task will not consume * any CPU time. */vTaskDelayUntil(&xNextWakeTime,mainQUEUE_SEND_FREQUENCY_MS);/* * Send to the queue - causing the queue receive task to unblock and * toggle the LED. 0 is used as the block time so the sending operation * will not block - it shouldn't need to block as the queue should always * be empty at this point in the code. */xQueueSend(xQueue,&ulValueToSend,0U);}}/*-----------------------------------------------------------*/staticvoidprvQueueReceiveTask(void*pvParameters){unsignedlongulReceivedValue;staticconstTickType_t xShortBlock=pdMS_TO_TICKS(50);/* Check the task parameter is as expected. */configASSERT(((unsignedlong)pvParameters)==mainQUEUE_RECEIVE_PARAMETER);for(;;){/* * Wait until something arrives in the queue - this task will block * indefinitely provided INCLUDE_vTaskSuspend is set to 1 in * FreeRTOSConfig.h. */xQueueReceive(xQueue,&ulReceivedValue,portMAX_DELAY);/* * To get here something must have been received from the queue, but * is it the expected value? If it is, toggle the LED. */if(ulReceivedValue==100UL){/* * Blip the LED for a short while so as not to use too much * power. */DL_GPIO_togglePins(GPIO_LEDS_PORT,GPIO_LEDS_USER_LED_1_PIN);vTaskDelay(xShortBlock);DL_GPIO_togglePins(GPIO_LEDS_PORT,GPIO_LEDS_USER_LED_1_PIN);ulReceivedValue=0U;}}}用任务与队列实现一个“1 秒闪烁一次 LED”的简单应用。程序创建一个长度为 1 的队列和两个任务:发送任务每秒向队列发送一个固定值,接收任务从队列读取值并在值匹配时短暂点亮(翻转)LED。
关键宏与全局
- mainQUEUE_SEND_FREQUENCY_MS:发送周期,pdMS_TO_TICKS(1000) → 1 秒。
- mainQUEUE_LENGTH:队列长度为 1。
- mainQUEUE_SEND_PARAMETER / mainQUEUE_RECEIVE_PARAMETER:传递给任务的参数,用于 configASSERT 校验。
- xQueue:静态声明的队列句柄(QueueHandle_t)。
main_blinky()(程序入口逻辑)
- 调用 xQueueCreate 创建队列(项大小为 uint32_t)。
- 若队列创建成功:
- 创建接收任务 prvQueueReceiveTask(优先级较高)。
- 创建发送任务 prvQueueSendTask(优先级较低)。
- 调用 vTaskStartScheduler 启动调度器(通常不会返回)。
- 若调度器无法启动则进入无限空循环(表明堆内存不足以创建空闲或定时器任务)。
发送任务:prvQueueSendTask
- 使用 xTaskGetTickCount 和 vTaskDelayUntil 实现周期调度(节省漂移)。
- 每次唤醒后通过 xQueueSend 将常量 100UL 发送到队列(阻塞时间 0,期望队列为空)。
接收任务:prvQueueReceiveTask
- 使用 xQueueReceive(…, portMAX_DELAY) 永久阻塞等待队列数据。
- 收到数据后,如果值为 100UL,调用 DL_GPIO_togglePins 翻转用户 LED,引入短延时(vTaskDelay)以“眨一下”LED,然后再翻转回去。