ti板例程1学习

发布时间:2026/7/19 3:27:58
ti板例程1学习 2026-07-18 电赛ti板例程1学习empty_project_led一、今日目标跑通例程1LED闪烁验证Keil J-Link MSPM0G3507 链路完成基础拓展改延时、单独控制RGB三色尝试SysConfig换引脚初步理解IOMUX复用机制记录学习过程中的问题与概念连接二、环境确认项目状态备注Keil MDK✅ 正常已安装TI MSPM0支持包J-Link驱动✅ 正常昨天更新过核心板连接✅ 正常SWD四线连接例程工程编译✅ 0 Error, 0 Warning直接打开1_empty_project_led.uvprojx硬件无名创新24年电赛H题小车套件MSPM0G3507核心板三、例程1核心代码分析3.1 main.c 完整结构#includeti_msp_dl_config.h// SysConfig生成的配置头文件#defineDELAY(16000000)// 循环计数决定延时长短intmain(void){SYSCFG_DL_init();// 一键初始化时钟、GPIO、电源等while(1){delay_cycles(DELAY);// 空转延时DL_GPIO_togglePins(PORTB_PORT,PORTB_RGB_R_PIN|PORTB_RGB_G_PIN|PORTB_RGB_B_PIN);}}3.2 代码元素逐行拆解代码元素作用对应STM32标准库关键理解#include ti_msp_dl_config.h包含SysConfig生成的配置头无直接写寄存器或用HALTI把配置封装成宏不用手动记寄存器地址SYSCFG_DL_init()调用SysConfig生成的总初始化函数RCC_APB2PeriphClockCmd()GPIO_Init()一键完成时钟使能引脚复用方向配置delay_cycles(DELAY)阻塞式空转延时for(i0; idelay; i);纯软件延时CPU在此期间空转DL_GPIO_togglePins()翻转引脚电平GPIO_WriteBit()高变低低变高PORTB_PORT宏定义对应GPIOBGPIOBTI用PORTB_PORT代替GPIOBPORTB_RGB_R_PIN宏定义对应PB26GPIO_Pin_26具体引脚号封装在宏里3.3 SysConfig生成的配置解读ti_msp_dl_config.h关键宏#definePORTB_PORT(GPIOB)#definePORTB_RGB_R_PIN(DL_GPIO_PIN_26)#definePORTB_RGB_R_IOMUX(IOMUX_PINCM57)#definePORTB_RGB_G_PIN(DL_GPIO_PIN_27)#definePORTB_RGB_G_IOMUX(IOMUX_PINCM58)#definePORTB_RGB_B_PIN(DL_GPIO_PIN_22)#definePORTB_RGB_B_IOMUX(IOMUX_PINCM50)#defineCPCLK_FREQ(32000000)// 32MHz主频核心理解——IOMUX的作用物理引脚PB26 → IOMUX_PINCM57 → 可以连到GPIO/PWM/UART/ADC... ↑ SysConfig在这里配置Codex的原话“如果你不理解IOMUX决定了一个物理引脚到底连到GPIO还是PWM/UART那么你就无法解释为什么把PB26改成PWM输出时必须在SysConfig里重新配置而不是只改代码里的API。”四、拓展练习详细记录拓展1修改延时时间操作修改DELAY宏定义重新编译烧录观察LED闪烁频率DELAY值理论计算实际现象验证结论1600000016000000 / 32MHz 0.5sLED约0.5秒闪烁一次✅ 基准正确80000008000000 / 32MHz 0.25sLED闪烁加快✅ 时间减半3200000032000000 / 32MHz 1sLED闪烁变慢✅ 时间翻倍关键公式延时时间(秒) DELAY / CPCLK_FREQ DELAY / 32000000理解delay_cycles()就是让CPU空转N个时钟周期。32MHz主频下1600万个周期 0.5秒。对比STM32以前用for(i0; i0xFFFFF; i);这种魔法数字现在用delay_cycles(16000000)语义更清晰。拓展2单独控制RGB三色目标实现红灯亮0.5s → 绿灯亮0.5s → 蓝灯亮0.5s → 循环代码while(1){// 状态1红灯亮DL_GPIO_setPins(PORTB_PORT,PORTB_RGB_R_PIN);DL_GPIO_clearPins(PORTB_PORT,PORTB_RGB_G_PIN|PORTB_RGB_B_PIN);delay_cycles(DELAY);// 状态2绿灯亮DL_GPIO_clearPins(PORTB_PORT,PORTB_RGB_R_PIN);DL_GPIO_setPins(PORTB_PORT,PORTB_RGB_G_PIN);DL_GPIO_clearPins(PORTB_PORT,PORTB_RGB_B_PIN);delay_cycles(DELAY);// 状态3蓝灯亮DL_GPIO_clearPins(PORTB_PORT,PORTB_RGB_R_PIN|PORTB_RGB_G_PIN);DL_GPIO_setPins(PORTB_PORT,PORTB_RGB_B_PIN);delay_cycles(DELAY);}API对比表操作MSPM0 DriverLibSTM32标准库置高电平DL_GPIO_setPins(port, pin)GPIO_SetBits(GPIOx, GPIO_Pin)置低电平DL_GPIO_clearPins(port, pin)GPIO_ResetBits(GPIOx, GPIO_Pin)翻转电平DL_GPIO_togglePins(port, pin)GPIO_WriteBit(GPIOx, Pin, Bit_SET/RESET)读取电平DL_GPIO_readPins(port, pin)GPIO_ReadInputDataBit(GPIOx, GPIO_Pin)命名习惯差异TI用set/clear/read/toggle动词在前ST用SetBits/ResetBits/ReadInputDataBit/WriteBit更强调寄存器操作拓展3SysConfig换引脚操作步骤打开empty_project_led.syscfgSysConfig图形化配置界面在GPIO配置面板中找到RGB_R的配置将引脚从PB26改为PA0或其他可用引脚点击Save→ 自动生成ti_msp_dl_config.c和ti_msp_dl_config.h回到Keil编译 → 烧录 → 观察现象遇到的问题现象尝试的引脚结果LED正常闪烁PB26原配置✅ 正常LED不亮PA0❌ 不亮LED不亮某些其他PB引脚❌ 不亮初步分析待验证可能原因1IOMUX未配置为GPIO模式在SysConfig里选了PA0但可能没把复用功能MUX设为GPIO需要检查生成的代码中DL_GPIO_initDigitalOutput()的参数可能原因2该引脚被其他功能占用MSPM0G3507某些引脚默认是调试口SWD、晶振口XIN/XOUT或电源脚需要查数据手册确认引脚功能表可能原因3物理连接问题核心板上PA0没有接LED或者接了其他外设需要用万用表量引脚电平确认关键教训在MSPM0上“选了引脚不等于能用GPIO”。必须同时确认SysConfig里该引脚的IOMUX设为GPIO模式该引脚物理上没有被其他功能调试口、晶振等占用该引脚在硬件上连接了你想要的设备LED五、概念连接状态机5.1 从例程1发现状态机例程1的LED闪烁如果显式写出状态就是一个极简状态机uint8_tled_state0;// 0灭, 1亮while(1){if(led_state0){DL_GPIO_setPins(PORTB_PORT,PORTB_RGB_R_PIN);// 动作亮led_state1;// 转移灭→亮}else{DL_GPIO_clearPins(PORTB_PORT,PORTB_RGB_R_PIN);// 动作灭led_state0;// 转移亮→灭}delay_cycles(DELAY);// 条件延时到期才转移}当前状态触发条件下一个状态执行动作LED灭0延时到期LED亮1setPinsLED亮1延时到期LED灭0clearPins5.2 与上学期经验的连接上学期循迹小车——隐式状态机// 没有状态变量状态藏在条件判断里while(1){if(传感器黑线)直走();elseif(传感器偏左)右转();elseif(传感器偏右)左转();else停止();}当前状态谁决定的状态转移条件直走传感器实时读数传感器偏左 → 右转右转传感器实时读数传感器黑线 → 直走特点无记忆性当前状态完全由传感器实时决定不需要记住之前在哪。H题代码——显式状态机// duty1从A点出发循迹到B点声光提示voidauto_drive_smartcar_duty1(void){staticuint8_tn8;// 任务编号if(flight_subtask_cnt[n]0){// 状态0初始化speed_ctrl_mode1;trackless_output.yaw_ctrl_modeROTATE;flight_subtask_cnt[n]1;// 转移到状态1}elseif(flight_subtask_cnt[n]1){// 状态1行驶中distance_control_with_speed_limit(50);if(ABS(distance_ctrl.error)distance_precision_cm){flight_subtask_cnt[n]2;// 条件满足转移到状态2}}else{// 状态2到达声光提示speed_expect[0]0;// 停止电机speed_expect[1]0;bling_set(light_red,2000,500,0.5,0,0);// 红灯闪烁beep.reset1;beep.times2;}}状态值含义转移条件动作0初始化无条件设置速度、启动循迹 → 进入状态11行驶中distance_ctrl.error 1cm距离控制、速度控制 → 到达后进入状态22到达提示无结束停止电机、红灯闪烁、蜂鸣器响特点有记忆性必须记住走到哪一步了状态转移是单向的0→1→2。5.3 隐式 vs 显式状态机对比维度隐式状态机循迹小车显式状态机H题代码状态记录无状态变量状态藏在if-else里flight_subtask_cnt[n]显式记录状态转移双向/多向传感器变就跳单向0→1→2不回头记忆性无记忆只看当前输入有记忆必须知道之前在哪适用场景响应式、实时反馈循迹流程式、时序控制A→B→C代码复杂度状态少时简单状态多时更清晰易扩展调试难度难不知道卡在哪个逻辑分支易看cnt值就知道在哪一步5.4 为什么H题必须用显式状态机H题需求隐式能否满足显式如何解决从A到B是固定流程❌ 不能靠传感器实时判断✅cnt记录步骤按顺序执行需要记住已经启动过❌ 无记忆✅cnt1表示已启动正在行驶多个任务duty1~4共享调度❌ 每个任务逻辑混杂✅ 每个任务有自己的cnt数组非阻塞执行不能卡死❌while循环会阻塞✅ 每个状态执行一次立即返回六、今日问题清单序号问题描述当前状态优先级下一步行动1换引脚后LED不亮的具体原因 待验证高查MSPM0G3507数据手册引脚功能表用万用表量引脚电平2IOMUX_PINCMx和物理引脚号的对应关系 待理解高阅读数据手册IOMUX章节对比SysConfig生成的前后代码3哪些引脚确定可用作GPIO输出 待整理中整理一份48引脚封装的安全GPIO清单4delay_cycles的精确性如何受中断影响吗 待验证低对比例程8的systick精准延时5状态机从隐式到显式的改写练习 待做中把上学期循迹代码改成显式状态机版本七、下一步学习计划近期下周优先级任务目标预计时间P0跑通例程10keyscan理解GPIO输入、按键消抖1-2天P0跑通例程8systick理解精准延时、替代delay_cycles1天P1确认换引脚不亮原因查数据手册整理安全引脚清单半天P1跑通例程6timer_period理解定时器中断、周期触发1-2天中期暑假里程碑目标标志M1跑完前5个例程1, 10, 8, 6, 7M2让电机转起来用例程7输出PWM控制左右轮M3建立速度闭环例程14编码器测速 例程7 PWMM4接触H题代码骨架提取电机驱动层理解状态机调度八、今日感悟与模式记录学习节奏“进度太快跟不上” → 主动刹车 → 记录消化 → 下周继续这个节奏比一天刷完5个例程但只记得最后一个效率高得多。验证ISTP学习模式✅ 边做边调整跑例程→发现问题→定向查资料✅ 问题导向补理论不前置灌输遇到卡点再深入✅ 最小闭环验证每个例程跑通改参数确认现象工具链使用工具今日用途效果Keil编译、烧录、调试熟悉无卡点SysConfig图形化配置GPIO、IOMUX新接触换引脚时遇到复用问题J-Link程序下载昨天已配好今日顺畅Codex扫描24个例程、生成学习路径输出质量高已建立信任Kimi实时答疑、概念连接、记录整理长期陪伴理解上下文关键认知更新IOMUX是TI的灵魂不是选了引脚就能用必须理解复用配置状态机不是新概念上学期已经用过只是不知道名字显式状态机的价值在流程式任务A→B→C中记忆性是必须的Codex的边界适合代码扫描、路径规划Kimi适合实时对话、概念连接记录时间2026-07-18 17:53下次学习2026-07-21周一