(1)申请Nucleo开发板原因: 从上学接触51单片机,到买的第一块stm32 cortex-M3内核的开发板,到上班后,从从未接触lpc3268到做成项目,心里对嵌入式有种无法割舍的感情。一天不玩玩,就会感觉心里少点什么,看见这个cortex—M4内核的开发板,自热也是手痒,想玩转一下。 (2)、说说对Nucleo产品的认知、疑问、应用、或者开发等等 这个开发板可以说是麻雀虽小,五脏俱全,该有的都有,st-link仅仅通过普通的usb就可以实现仿真调试, 首先,IO口外设通过排针座引出,通过跳线,接外部器件,调试一下各个功能模块,然后用她作为中主控板尝试着编写一些项目。将以前用stm32f103编写的电梯控制系统尝试移植到上面。 同时,有个疑问:这款片子的函数库做的怎么样。 希望好运降临,能有幸得到这款精巧的开发板,我将好好利用,经常发一些关于这款片子的开发心得,同时也愿意将自己的电梯控制系统程序和硬件开源,作为论坛汇报。 (3)今天逛看见的一篇不错的关于MCU串口中断接收,以及缓存发送大量数据的程序,和大家分享。 再贴上一段环链方式处理的,就是楼上所说的这样。但有时实时要求高的不怎么适用。因为我定的这个协议长度不固定,每收到一个数据都要判断.... #include "includes.h" /**************************** 发送指令格式 ************************************* 帧格式: 帧头 接收方地址 发送方地址 帧长 命令字 数据域 校验和 字节数: 2 1 1 1 1 N 1 帧头: 两个特殊字节 0x55 0xAA 接收方地址:通讯对象地址 发送方地址:通讯主机地址 / 为分机之间可通讯扩展 帧长: 从 命令 到 校验和 的字节数 不包含校验和 为 N + 1 命令字: 操作内容 数据域: 命令相关数据 校验和: 命令字 与 数据域 的算术和 /**************************** 返回指令格式 ************************************* 09/14测试通过 */ #define SELF_ADDR 0x03 #define TXD_MAX 32 #define RCV_MAX 32 #define GET_CONNECT 0x00 // 0号命令用于检测设备连接 分机接收到此命令则返回特定命令以示连接 #define READ_ADDR 0x01 // 1号命令用于读取设备的编号 只能一对一识别设备时使用 否则无效 #define READ_CUR 0x02 // 2号命令用于读取指定设备电流 #define READ_VOL 0x03 // 3号命令用于读取指定设备电压 volatile INT8U TxdBuf[TXD_MAX]; // 发送缓存 INT8U TxdPtr; // 发送指针 指向将要发送的字节 INT8U TxdCnt; // 发送字节计数 volatile INT8U RcvBuf[RCV_MAX]; // 接收缓存 volatile INT8U SavePtr; // 接收存储指针 volatile INT8U GetPtr; // 接收缓存读取指针 volatile INT8U StartPtr; // 识别出命令字对应的指针 volatile INT8U EndPtr; // 根据帧长计算出帧结束地址 INT8U DataLen; BOOLEAN Rcvbit; // 串口收到一个字节标志,为减少变量交互。 BOOLEAN StartRcv; // 开始接收数据帧标志 void Device_Init(void) { SavePtr = 0; GetPtr = 0; Rcvbit = 0; StartRcv= 0; } void ISR_Uart0(void) interrupt 4 { if(RI0) { RI0 = 0; RcvBuf[SavePtr] = SBUF0; SavePtr = (SavePtr + 1) & (RCV_MAX - 1); Rcvbit = 1; } if(TI0) { TI0 = 0; TxdCnt--; if(TxdCnt > 0) { TxdPtr++; SBUF0 = TxdBuf[TxdPtr]; } } } BOOLEAN Cmd_Adjust(void) { INT8U i, j, k; BOOLEAN flag = 0; while(GetPtr != SavePtr) { if(!StartRcv) { k = 0; i = (GetPtr - 5) & (RCV_MAX - 1); if(RcvBuf == 0x55) k++; i = (GetPtr - 4) & (RCV_MAX - 1); if(RcvBuf == 0xAA) k++; i = (GetPtr - 3) & (RCV_MAX - 1); if(RcvBuf == SELF_ADDR) k++; if(k == 3) { StartRcv = 1; i = (GetPtr - 1) & (RCV_MAX - 1); DataLen = RcvBuf; StartPtr = GetPtr; EndPtr = (GetPtr + DataLen) & (RCV_MAX - 1); } } else //开始接收数据处理 { if(GetPtr == EndPtr) { StartRcv = 0; // 数据帧接收完成 j = StartPtr; k = 0; for(i = 0; i < DataLen; i++) // 计算校验和 { k += RcvBuf[j]; j = (j + 1) & (RCV_MAX - 1); } k = ~k; if(k == RcvBuf[j]) flag = 1; } } GetPtr = (GetPtr + 1) & (RCV_MAX - 1); } return flag; } void Deal_Cmd(void) { INT8U cmd; cmd = RcvBuf[StartPtr]; switch(cmd) { case GET_CONNECT: Display_String(40, 2, "Connect..", ASC_6x8, 0); break; case READ_ADDR: Display_String(40, 2, "Read Addr", ASC_6x8, 0); break; case READ_CUR: Display_String(40, 2, "Read Cur ", ASC_6x8, 0); break; case READ_VOL: Display_String(40, 2, "Read Vol ", ASC_6x8, 0); break; default: break; } } |
【stm32F429开发日志】STM32F429上 NES 模拟器 移植 试玩
【小“福”蝶赏灯展+Nucleo-STM32F410】
读书感悟--STM32库开发实战指南——基于STM32F4(有空更新)
【STM32F429心得\疑问】+STM32学习心得(新手必看)
【我要为STM32站台】+基于STM32F4的视觉追踪系统
【我要SHOW】我的STM32F411
【我要show】+STM32F407+我爱ST
【我与STM32共成长】+脚踏STM32F1和STM32F4两条船
[线下活动] STM32F4与STM32L4系列功耗对比分析与测试
[STM32粉丝狂欢节开箱]STM32F410和L432
RE:【Nucleo板申请】+玩转STM32F401 Nucleo