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

查看: 3977|回复: 1

【Nucleo板申请】+玩转STM32F401 Nucleo

[复制链接]

1

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2014-7-4 21:13:22 | 显示全部楼层 |阅读模式
  (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

主题

6

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
 楼主| 发表于 2014-7-4 21:15:41 | 显示全部楼层

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

回家了,今天就到这吧。
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版