news 2026/4/23 13:36:12

MSPM0 环境搭建

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MSPM0 环境搭建

下载资源清单

资源描述
mspm0_sdk_2_09_00_01MSPM0 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
CCSTUDIOCode Composer Studio™ integrated development environment (IDE)Download
SEGGER J-LinksSEGGER J-Links are the most widely used line of debug probes available todayDownload

第一个项目

导入项目

  1. 点击下图Import Projects
  2. 选定项目目录
  3. 根据开发板修改Blink LED

配置

  1. 打开项目properties
  2. 配置SEGGER JLINK
  3. 配置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()(程序入口逻辑)

  1. 调用 xQueueCreate 创建队列(项大小为 uint32_t)。
  2. 若队列创建成功:
  • 创建接收任务 prvQueueReceiveTask(优先级较高)。
  • 创建发送任务 prvQueueSendTask(优先级较低)。
  • 调用 vTaskStartScheduler 启动调度器(通常不会返回)。
  1. 若调度器无法启动则进入无限空循环(表明堆内存不足以创建空闲或定时器任务)。

发送任务:prvQueueSendTask

  • 使用 xTaskGetTickCount 和 vTaskDelayUntil 实现周期调度(节省漂移)。
  • 每次唤醒后通过 xQueueSend 将常量 100UL 发送到队列(阻塞时间 0,期望队列为空)。

接收任务:prvQueueReceiveTask

  • 使用 xQueueReceive(…, portMAX_DELAY) 永久阻塞等待队列数据。
  • 收到数据后,如果值为 100UL,调用 DL_GPIO_togglePins 翻转用户 LED,引入短延时(vTaskDelay)以“眨一下”LED,然后再翻转回去。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 9:51:25

【独家深度】:从架构到生态,Open-AutoGLM如何实现对UFT Mobile的弯道超车

第一章:Open-AutoGLM与UFT Mobile的演进路径对比在自动化测试与智能模型驱动开发快速融合的背景下,Open-AutoGLM 与 UFT Mobile 代表了两种截然不同的技术演进方向。前者基于开源大语言模型构建自动化决策能力,后者则延续传统企业级移动测试工…

作者头像 李华
网站建设 2026/4/23 14:30:06

为什么顶尖团队开始用Open-AutoGLM补足JMeter短板?真相曝光

第一章:性能测试工具演进的必然趋势随着软件系统架构从单体向微服务、云原生演进,传统的性能测试工具已难以满足现代应用对高并发、低延迟和动态伸缩的测试需求。测试工具必须适应持续集成/持续交付(CI/CD)流程,实现自…

作者头像 李华
网站建设 2026/4/23 12:56:51

STM32单片机分享:室内厨房火灾系统

目录 一、项目成品图片 二、项目功能简介 1.主要器件组成 2.功能详解介绍 三、项目原理图设计 四、项目PCB硬件设计 项目PCB图 五、项目程序设计 六、项目实验效果 ​编辑 七、项目包含内容 一、项目成品图片 哔哩哔哩视频链接: https://www.bilibili.c…

作者头像 李华
网站建设 2026/4/23 13:30:47

智能体群体在市场异常检测中的应用

智能体群体在市场异常检测中的应用 关键词:智能体群体、市场异常检测、多智能体系统、异常识别算法、金融市场 摘要:本文聚焦于智能体群体在市场异常检测中的应用。首先介绍了相关背景知识,包括研究目的、预期读者和文档结构等。接着阐述了智能体群体和市场异常检测的核心概…

作者头像 李华
网站建设 2026/4/23 13:37:05

毕业季必看!8款AI写论文神器,知网查重一把过且不留AIGC痕迹!

如果你是正在熬夜赶Deadline的毕业生… 凌晨两点的宿舍灯光下,你盯着空白文档发呆——导师催稿的消息还在闪烁,知网查重一次上百块的压力压得喘不过气,实验数据还没整理完,问卷回收率低到想哭。 特别是面临延毕的研究生、预算紧张…

作者头像 李华