你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【Nucleo板申请】+玩转STM32F401 Nucleo

[复制链接]
龙战天下 提问时间:2014-7-4 21:13 /
  (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;
    }
}
收藏 评论1 发布时间:2014-7-4 21:13

举报

1个回答
龙战天下 回答时间:2014-7-4 21:15:41

RE:【Nucleo板申请】+玩转STM32F401 Nucleo

回家了,今天就到这吧。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版