在线时间2 小时
UID2107445
ST金币0
蝴蝶豆0
注册时间2014-7-4
新手上路
- 最后登录
- 1970-1-1
|
a0a.1 0b0c
(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;
}
} |
|