news 2026/7/31 22:00:01

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/7/31 4:09:45

对话数据,获取洞见:你的专属AI科研分析师已上线

还在为SPSS里混乱的菜单和R语言里总是报错的代码而抓狂吗?还在对着Excel里密密麻麻的数字,却不知从何处开始分析,更不知如何将结果转化为符合期刊规范的图表吗?对于每一位研究者而言,从原始数据到科学结论之间的道路&a…

作者头像 李华
网站建设 2026/7/31 12:16:17

基于springboot+vue的web的车票管理系统(源码+lw+部署文档+讲解等)

课题介绍随着交通运输行业的快速发展,车票售卖与管理的精细化需求日益提升,传统车票管理模式存在信息同步滞后、售票效率低、数据统计繁琐、退票改签流程不规范等问题,难以适配现代化出行服务的管理需求。本课题旨在设计并实现一款基于Spring…

作者头像 李华
网站建设 2026/7/31 4:10:01

基于VUE的健康体检中心[VUE]-计算机毕业设计源码+LW文档

摘要:随着健康意识的提升和医疗资源的紧张,高效便捷的健康预约管理系统成为优化医疗服务流程的关键。本文基于Vue框架设计并实现了一个功能全面的健康预约管理系统,涵盖系统用户管理、新闻数据管理、幻灯片设置、留言管理、用户与医生管理、体…

作者头像 李华