物联网|串口的编程技巧|发送函数分析|初始化函数|IAR显示行号|串口的数据格式|数据帧的设计思路|物联网之蓝牙4.0 BLE基础-学习笔记(9)

news2024/11/25 22:38:09

文章目录

  • 串口的编程技巧
    • 发送函数分析
    • 串口(UART0)初始化函数
    • 主函数体
    • 完整代码:
    • TIPS1:IAR显示行号
    • TIPS2:IAR编译出现 Fatal Error[e72]: Segment BANKED_CODE must be defined
      • 解决方法:
    • 串口的数据格式

串口的编程技巧

发送函数分析

void UartSendString(char *Data,int len)
{
  uint i;

  for(i = 0;i<len;i++)
  {
    U0DBUF = *Data++;
    while(UTX0IF == 0)
    {
    UTX0IF = 0;
    }
  }
}

检测UTX0IF标志,只要为0,就一直死等;等到标志变成1的时候退出。
这就是所谓串口的查询工作方式:在上一步向发送缓冲区填写数据触发发送之后,在这里死等发送(完成)标志置位。
有些单片机可以查询更细致的标志,例如发送缓冲空标志、线路发送完成标志等等。

串口(UART0)初始化函数

/****************************************************************
串口(UART0)初始化函数:
****************************************************************/
void InitUart(unsigned long int baudrate)
{

    CLKCONCMD &= ~0x40;                           //0: 32 MHz XOSC 与操作,仅设置0位,其他位为1,与后保持不变,设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                      //等待晶振稳定
    CLKCONCMD &= ~0x47;                           // ~0x47=1011 1000,2:0 CLKSPD 001 R/W Clock speed. Cannot be higher than system clock setting given by the OSC bit
                                                  //setting. Indicates current system-clock frequency 000: 32 MHz,设置系统主时钟频率为32MHZ
    PERCFG = 0x00;			          //位外设控制寄存器USART 0的IO位置;0为P0口位置;
    P0SEL = 0x0c;				  //P0用作串口,P0.7 to P0.0 function select
                                                  //0: General-purpose I/O  1: Peripheral function
                                                  //0x0c=0000 1100,P0_2,P0_3用作串口,外设功能
    P2DIR &= ~0XC0;                               //0XC0=1100 0000,~0XC0=0011 1111,与操作,设置0位,P0优先作为UART0
                                           //Port 0 peripheral priority control. These bits determine the order of priority in the case
                                        //when PERCFG assigns several peripherals to the same pins.
                                        //Detailed priority list:
                                        //00:
                                        //1st priority: USART 0
                                        //2nd priority: USART 1
                                        //3rd priority: Timer 1
   U0CSR |= 0X40;			  //允许接收
   switch(baudrate)
   {
   case 115200:
              U0GCR = 11;
              U0BAUD = 216;				  //波特率设为115200
              break;
   case 9600:
              U0GCR = 8;
              U0BAUD = 59;				  //波特率设为9600
              break;
   default:
              U0GCR = 8;
              U0BAUD = 59;				  //默认波特率设为9600
              break;
   }
   UTX0IF = 0;
   U0CSR |= 0x40;                          //允许接收
   IEN0 |= 0x84;			 //开总中断,允许接收中断
}

主函数体

/****************************************************************
主函数				
****************************************************************/
void main(void)
{	  
    InitUart(115200);           //串口初始化
    InitLed();
    UartState = UART0_RX; //串口0默认处于接收模式
    memset(RxData, 0, SIZE);
    
    while(1)
    {
      CmdPro(cmd);
    }
}

完整代码:

#include <ioCC2540.h>
#include <string.h>

#define uint unsigned int
#define uchar unsigned char

//定义控制灯的端口
#define LED1   P1_0  //P1_0口控制LED1
#define UART0_RX  1
#define UART0_TX  2
#define SIZE 51

char RxBuf;
char UartState;
uchar count;
char RxData[SIZE];  //存储发送字符
char cmd;
uint OnOffState;


void DelayMS(uint msec)
{
  uint i,j;

  for (i=0;i<msec; i++)
    for (j=0;j<1070;j++);
}

void InitLed(void)
{
  P1DIR |= 0x01;     //0x01=0000 0001 置1,或操作, 定义P1.0为输出
  LED1 = 0;         //LED1灯灭
}

void CmdPro(char MyCmd)
{
  switch(MyCmd)
  {
  case 'A':
    cmd = 0;
    LED1 = 1;
    OnOffState = 1;
    break;
  case 'B':
    cmd = 0;
    LED1 = 0;
    OnOffState = 0;
    break;
  case 'C':
    if(OnOffState)
    {
      LED1 = 0;
      DelayMS(1000);
      LED1 = 1;
      DelayMS(1000);
      LED1 = 0;
      DelayMS(1000);
      LED1 = 1;
      DelayMS(1000);
      LED1 = 0;
      OnOffState = 0;
    }
   break;
  default:
    break;
  }
}

/****************************************************************
串口(UART0)初始化函数:
****************************************************************/
void InitUart(unsigned long int baudrate)
{

    CLKCONCMD &= ~0x40;                           //0: 32 MHz XOSC 与操作,仅设置0位,其他位为1,与后保持不变,设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                      //等待晶振稳定
    CLKCONCMD &= ~0x47;                           // ~0x47=1011 1000,2:0 CLKSPD 001 R/W Clock speed. Cannot be higher than system clock setting given by the OSC bit
                                                  //setting. Indicates current system-clock frequency 000: 32 MHz,设置系统主时钟频率为32MHZ
    PERCFG = 0x00;			          //位外设控制寄存器USART 0的IO位置;0为P0口位置;
    P0SEL = 0x0c;				  //P0用作串口,P0.7 to P0.0 function select
                                                  //0: General-purpose I/O  1: Peripheral function
                                                  //0x0c=0000 1100,P0_2,P0_3用作串口,外设功能
    P2DIR &= ~0XC0;                               //0XC0=1100 0000,~0XC0=0011 1111,与操作,设置0位,P0优先作为UART0
                                           //Port 0 peripheral priority control. These bits determine the order of priority in the case
                                        //when PERCFG assigns several peripherals to the same pins.
                                        //Detailed priority list:
                                        //00:
                                        //1st priority: USART 0
                                        //2nd priority: USART 1
                                        //3rd priority: Timer 1
   U0CSR |= 0X40;			  //允许接收
   switch(baudrate)
   {
   case 115200:
              U0GCR = 11;
              U0BAUD = 216;				  //波特率设为115200
              break;
   case 9600:
              U0GCR = 8;
              U0BAUD = 59;				  //波特率设为9600
              break;
   default:
              U0GCR = 8;
              U0BAUD = 59;				  //默认波特率设为9600
              break;
   }
   UTX0IF = 0;
   U0CSR |= 0x40;                          //允许接收
   IEN0 |= 0x84;			 //开总中断,允许接收中断
}

void UartSendString(char *Data,int len)
{
  uint i;

  for(i = 0;i<len;i++)
  {
    U0DBUF = *Data++;
    while(UTX0IF == 0)
    {
    UTX0IF = 0;
    }
  }
}


#pragma vector = URX0_VECTOR    //格式:#pragma vector = 中断向量,紧接着是中断处理程序
  __interrupt void UART0_ISR(void)
 {
   URX0IF = 0;                                 //UART0 TX中断标志初始置位0(清中断标志)
   cmd = U0DBUF;
 }

/****************************************************************
主函数
****************************************************************/
void main(void)
{
    InitUart(115200);           //串口初始化
    InitLed();
    UartState = UART0_RX; //串口0默认处于接收模式
    memset(RxData, 0, SIZE);

    while(1)
    {
      CmdPro(cmd);
    }
}

TIPS1:IAR显示行号

在这里插入图片描述

TIPS2:IAR编译出现 Fatal Error[e72]: Segment BANKED_CODE must be defined

IAR编译出现 Fatal Error[e72]: Segment BANKED_CODE must be defined in a segment definition option (-Z, -b or -P)****
是链接(Link)出错:
原因是IAR新版本使用旧版本文件
在这里插入图片描述
在这里插入图片描述

解决方法:

打开project->options->linker->config->override default
填入地址:
T O O L K I T D I R TOOLKIT_DIR TOOLKITDIR\config\devices\Texas Instruments\lnk51ew_cc2540F256_banked.xcl
选择banked的xcl文件即可,具体的文件可根据所用的芯片型号来选择。

串口的数据格式

头码1 | 头码2 | 长度 | 数据 | 校验
1BYTE | 1BYTE | 1BYTE | NBYTE | 1BYTE
头码1:0xAA
头码2:OxS5
长度为数据和校验总字节数
校验为长度字节和数据字节值求和,即和校验
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/539038.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能Python-pycharm爬虫电影代码

PyCharm爬虫电影代码详解 作为一位有着10年python编程经验的工程师&#xff0c;我想分享一下关于PyCharm爬虫电影代码的详细介绍和使用方法。 PyCharm简介 PyCharm是由JetBrains开发的一款Python IDE&#xff0c;它为Python开发者提供了一站式的开发环境&#xff0c;包括代码…

WALN网络不存在? 离谱事件解决方法

前情&#xff1a; 本来在高高兴兴赶ddl&#xff0c;突然发现网断了。尝试重连&#xff0c;显示无法连接... 遂重启&#xff0c;结果事情更糟了&#xff0c;WALN就没了&#xff0c;没了&#xff0c;没了... 这张是修好之后的图&#xff0c;但是当时所有包括蓝牙&#xff0c;waln…

例2:子流程

例&#xff1a;如图所示流程&#xff0c;物流Feed经冷却器Chiller冷却后进入子流程Sub进行气液分离。物性包选择Peng-Robinson。 目录 &#xff08;1&#xff09;新建模拟&#xff08;2&#xff09;创建组分列表&#xff08;3&#xff09;定义物性包&#xff08;4&#xff09;…

Goldengate Monitor Agent 安装

Goldengate Monitor & Agent GoldenGate Monitor基础知识1.GoldenGate Monitor介绍2.GoldenGate Monitor 的技术架构如下&#xff1a;3.Oracle GoldenGate4.GoldenGate Monitor Server5.GoldenGate Monitor Repository6.GoldenGate Monitor AgentGOLDENGATE MONITOR安装安…

计算机基础知识之字符编码

目录 1、基础知识2、ASCII编码3、编码格式4、多字节字符集&#xff08;MBCS&#xff09;和中文字符集5、ANSI 标准、国家标准、 ISO 标准6、Unicode 编码7、 UTF-8编码 1、基础知识 &#x1f449;字符&#xff1a;是各种文字和符号的总称&#xff0c;包括各个国家的文字&#…

nodejs进阶(6)—连接MySQL数据库

1. 建库连库 连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 mysql> CREATE DATABASE mydb1; mysql> SHOW DATABASES; -------------------- | Database | -------------------- | information_schem…

IOS描述文件制作教程​

转载&#xff1a;IOS描述文件制作教程 iOS描述文件(.mobileprovision)一键申请 在主界面上点击描述文件按钮。 ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 新建ios描述文件 然后点击新建&#xff0c;然后输入描述文件名称&…

chatgpt赋能Python-phython_抓取数据

Python 抓取数据的SEO 介绍 在今天的数字化时代&#xff0c;数据是企业的核心资产之一。然而&#xff0c;这些数据往往散布在网络上的不同源头。大多数的企业需要使用各种不同的技术来从各种不同的来源中抓取数据。Python 是一种强大的工具&#xff0c;可以使这个过程更加简单…

【Linux内核】自旋锁spinlock机制

自旋锁 Note: 在使用自旋锁时应该避免长时间持有锁&#xff0c;否则可能会导致其他线程或进程无法访问共享资源。因此&#xff0c;建议将锁的持有时间尽量缩短&#xff0c;以提高系统的并发性能。 Linux中的自旋锁机制是一种用于同步多个线程或进程访问共享资源的技术。当一个…

chatgpt赋能Python-nan在python

Nan在Python中的介绍 Nan是Python中的一个特殊值&#xff0c;它代表非数值&#xff08;Not a Number&#xff09;。在Python中&#xff0c;Nan常被用于表示缺失值或无意义的数值。 Nan的意义 Nan在Python中的意义与其他编程语言中的NaN类似。它表示一个数值是未定义或无法计…

使用viewport-fit=cover来解决关于ios在Safari浏览器内容被地址栏、菜单栏或工具栏遮挡导致的兼容问题

文章目录 前言一、viewport-fit1. 作用2. 取值3. 使用 二、使用css 的 env() 和 constant()函数用于设定安全区域与边界的距离1.iPhone手机的安全区域&#xff08;如下图&#xff09;2. 由来、作用3. 使用4.语法5.兼容问题 三、解决ios内容被Safari遮挡的两种情况1.顶层div的he…

chatgpt赋能Python-numpy转化为pandas

从Numpy到Pandas: 如何将数组转换为数据框 如果您正在使用Python进行数据分析&#xff0c;那么您一定会听说过Numpy和Pandas。他们是Python中最受欢迎的数据科学库之一&#xff0c;可以极大地简化数据处理的流程。但是&#xff0c;当您想从numpy数组转换为pandas数据框时&…

chatgpt赋能Python-pycharm的location

Pycharm Location: 如何更好地管理Python项目文件 在日常Python开发中&#xff0c;我们很少能避免需要同时管理多个项目&#xff0c;这就要求我们有一款优秀的IDE来帮助我们更好地进行项目管理。Pycharm 是一款备受欢迎的 Python IDE。其中的 Location 功能可以帮助我们更好地…

Java 基础进阶篇(十五):IO 流总结(全网最全面)

文章目录 前置内容&#xff1a;字符集一、IO 流概述二、字节流2.1 文件字节输入流 FileInputStream2.1.1 案例&#xff1a;每次读取一个字节2.1.2 案例&#xff1a;每次读取一个字节数组2.1.3 案例&#xff1a;读取文件的全部字节 2.2 文件字节输出流 FileOutputStream2.3 文件…

AI绘画:Midjourney 注册

AI绘画:Midjourney 注册 前提:需要魔法才能使用 第一步:下载Discord 官方网站:https://discord.com/,打开网址,下载您需要的版本。 注意:支持手机端(Android&ios),Windows,Linux,Mac 下面以Windows注册为例<

纵使AI再强悍,低代码风韵犹存

互联网沉默已久&#xff0c;ChatGPT的出现激起千层浪&#xff0c;沉寂已久的互联网迎来新一轮的机遇。毫不夸张地说&#xff0c;任何一家以技术见长的企业&#xff0c;人工智能绝对占有一席之地。 目录 人工智能很强悍 低代码风韵犹存 快速开发平台&#xff0c;大有看头 AI…

网络安全等级保护等级保护对象的安全保护等级

什么是等保&#xff1f; 2017年6月1号&#xff0c;《中华人民共和国网络安全法》出台&#xff0c;国家实行等级安全保护制度。网络安全等级保护以《中华人民共和国网络安全法》为法律依据&#xff0c;以2019年5月发布的《GB/T22239-2019 信息安全技术 网络安全等级保护基本要求…

网络安全难学吗?前途怎么样?

网络安全是一门技术性很强的学科&#xff0c;需要掌握扎实的计算机技术基础和相关的安全技能&#xff0c;因此对于初学者来说可能会比较困难。但是&#xff0c;网络安全是一个非常重要的领域&#xff0c;在如今数字化的时代&#xff0c;各种网络犯罪、信息泄露等安全问题屡见不…

javassist动态生成,修改字节码 demo

Javassist 是一个开源的分析、编辑和创建 Java 字节码的类库&#xff0c;被广泛用于程序性的类文件操作和运行时 AOP 框架&#xff0c;能动态改变类的结构&#xff0c;或者动态生成类。 关于javassist和反射 Javassist 不是通过反射来实现的&#xff0c;而是通过直接操作字节…

python3+telnetlib实现简单自动测试

1 telnetlib介绍 1.1 简介 官方介绍文档&#xff1a;telnetlib – Telnet 客户端 — Python 3.9.6 文档 telnetlib 模块提供一个实现Telnet协议的类 Telnet。 1.2 库常用函数及使用 1.2.1 建立连接 建立连接有两种方式&#xff1a;1、实例化函数的时候&#xff0c;将可选参数…