基于stm32f1的lora开发基础通信实验

2023-11-02

一、实验条件

环境:
win10专业版;
keil uv5 ;
串口调试助手;
stm32f1系列单片机;
as32lora模块(这里是泽耀科技的as32_ttl_100)

二、实现功能

1.使用定时器将底层数据通过as32每隔1秒向上层串口发送一段数据帧
2.上层串口可通过as32像底层发送数据

三、实验讲解

1.配置定时器

void Timer_Config(u16 arr,u16 psc)//1s中断
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;				 //定义TIM结构体变量
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);	         //使能TIM2外设
    TIM_DeInit(TIM2);                                         	 //复位时钟TIM2,恢复到初始状态
    //  定时时间T计算公式:
    //  T=(TIM_Period+1)*(TIM_Prescaler+1)/TIMxCLK=(3599+1)*(99+1)/72MHz=5us
    TIM_TimeBaseStructure.TIM_Period=arr;
    TIM_TimeBaseStructure.TIM_Prescaler=psc;
    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 		 //TIM2时钟分频
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; 	 //计数方式

    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); 		 		 //初始化
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);  				  		 //清除标志
    //  中断方式下,使能中断源
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);                     //使能中断源
    //TIM_Cmd(TIM2,ENABLE); 		//放MIAN里面								 //使能TIM2
    //  设置优先分级组
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);            //0组,全副优先级
    NVIC_InitStructure.NVIC_IRQChannel=TIM2_IRQn;             //选择中断通道,库P166页,
    //  选择中断通道。注意:固件库中为XXX_IRQChannel,但该程序预定义为XXX_IRQn,所以要特别注意
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;    //抢占优先级0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;           //响应优先级0
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;              //启动此通道的中断
    NVIC_Init(&NVIC_InitStructure);

    TIM_Cmd(TIM2,ENABLE);//开启定时器
}

2.配置as引脚

void usart3_init(u32 bound)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    USART_ClockInitTypeDef USART_ClockInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
    //USART3_TX   B.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    //USART3_RX	  B.11
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //0
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //0

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);	 //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1

    USART_InitStructure.USART_BaudRate = bound;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
    //---------------------------------------------------------------------------------
    USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
    USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
    USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
    USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
    USART_ClockInit(USART3, &USART_ClockInitStructure);
    //---------------------------------------------------------------------------------
    USART_Init(USART3, &USART_InitStructure);
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART3, ENABLE);                    //使能串口
}

3.配置串口,串口中断

void USART3_IRQHandler(void)
{
    u8 Res;
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)/// 接收到数据
    {
        Res =USART_ReceiveData(USART3);
        RS232_RX_BUF[RS232_RX_STA]=Res;           //读取数据
        RS232_RX_STA++;  			//ESP_RX_STA计数,收到多少数据
			 	if(RS232_RX_STA>=6) {
            DealBufproc();
        }
        
    }
}

4.看门狗配置(防止程序跑死)

//以下是看门狗,作用是防止程序跑死(跑死程序重启)
void IWDG_Init(u8 prer,u16 rlr)
{
    IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);  //使能对寄存器IWDG_PR和IWDG_RLR的写操作

    IWDG_SetPrescaler(prer);  //设置IWDG预分频值:设置IWDG预分频值为64

    IWDG_SetReload(rlr);  //设置IWDG重装载值

    IWDG_ReloadCounter();  //按照IWDG重装载寄存器的值重装载IWDG计数器

    IWDG_Enable();  //使能IWDG
}
//喂独立看门狗
void IWDG_Feed(void)
{
    IWDG_ReloadCounter();//reload

主函数:

int main(void)
{
    Delay_Init(72);//用定时器延时
    usart1_init(9600);
    usart3_init(9600);
   Timer_Config(4999,7199);//1s触发一次中断
   IWDG_Init(4,625);//看门狗溢出时间1s
    while(1)
    {
			//IWDG_Feed();//重置看门狗溢出时间
		
			Delay_100ms(5);
    }
}

四、实验效果

上层串口调试助手实际接收数据:

底层接收数据串口1提示信息:

五、注意点

  1. 串口乱码问题:检查波特率和串口配置,必须十六进制显示
  2. 串口接收数据格式:as必须采用十六进制接收和发送
  3. 数据丢失问题:as32不支持双向通信,同时进行收发就会造成数据的丢失,可以采用as62.这个是双向通信的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于stm32f1的lora开发基础通信实验 的相关文章

  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • 源和目标具有不同的 EABI 版本

    我正在尝试使用 ARM 工具链编译 so 文件 但是我不断收到这个错误 错误 源对象的 EABI 版本为 0 但目标对象的 EABI 版本为 5 我无法更改工具链中的任何内容 因为我必须使用给定的工具链 我以前从未见过这个错误 我使用了这个
  • 可以使用Visual Studio 2012构建ARM桌面程序吗?

    我正在使用 Visual Studio 2012 beta 我的桌面 win32 程序在 ARM 架构中编译得很好 升级到 Visual Studio 2012 RC 后 编译器无法工作并出现以下错误 不支持为 ARM 平台编译桌面应用程序
  • 为 ARM 交叉编译 zlib

    我尝试为arm poky linux gnueabi交叉编译zlib 但启动 make 时出现错误 zlib 1 2 11 AR HOST ar CC HOST gcc RANLIB HOST ranlib configure prefix
  • 交叉编译 Qt 4.7 时出现“非法指令”

    我已经在这个问题上苦苦挣扎了一个多星期了 但仍然找不到解决方案 我正在尝试为 ARM 设备交叉编译 Qt 4 7 嵌入式开源版本 构建过程本身可以顺利完成 但生成的二进制文件似乎包含处理器无法理解的指令 构建主机是 i386 上的 Debi
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • ARM 系统调用的接口是什么?它在 Linux 内核中的何处定义?

    我读过有关 Linux 中的系统调用的内容 并且到处都给出了有关 x86 架构的描述 0x80中断和SYSENTER 但我无法追踪 ARM 架构中系统调用的文件和进程 任何人都可以帮忙吗 我知道的几个相关文件是 arch arm kerne
  • 使用 NEON 优化 Cortex-A8 颜色转换

    我目前正在执行颜色转换例程 以便从 YUY2 转换为 NV12 我有一个相当快的函数 但没有我预期的那么快 主要是由于缓存未命中 void convert hd uint8 t orig uint8 t result uint32 t wi
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 直接在 ARM 目标上调试单声道应用程序

    我最近在 BeagleBone 嵌入式 ARM 设备上安装了 Mono 希望通过 USB 连接 Kinnect 传感器并使用 C Mono 控制它 我想知道 Mono 我正在使用 MonoDevelop 但我想这个问题也适用于 VS 是否允
  • iPhone 3GS 上的 ARM 与 Thumb 性能比较,非浮点代码

    我想知道是否有人有关于 iPhone 3GS 上 ARM 与 Thumb 代码性能的硬性数据 特别是对于非浮点 VFP 或 NEON 代码 我知道 Thumb 模式下的浮点性能问题 更大的 ARM 指令的额外代码大小是否会在某个时刻成为性能
  • 架构armv7的重复符号

    尝试在我现有的应用程序中使用 Layar SDK 时出现以下错误 我该如何解决这个问题 Ld Users pnawale Library Developer Xcode DerivedData hub afxxzaqisdfliwbzxbi
  • 如何获取结构体中任意成员的位位置

    如何获取结构体中任意成员的位位置 在示例中 gt typedef struct BitExamStruct unsigned int v1 3 unsigned int v2 4 unsigned int v3 5 unsigned int
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • 可以对 Xcode 中的 Arm 架构设置进行一些澄清

    据我了解 iPhone 5将采用新的架构 armv7s 我的项目具有有效的架构armv7 并且有Build Active Architecture Only set to true 由于现在商店中的每个应用程序都是为armv6 and or
  • 直接写入 ARM Cortex A8 分支预测器中的全局历史缓冲区 (GHB) 或 BTB?

    我有兴趣直接修改 Cortex A8 上的 BTB 分支目标缓冲区 和 GHB 的内容 ARM 手册上有这样的内容 要在指令端 GHB 数组中写入一项 例如 LDR R0 0x3333AAAA MCR p15 0 R0 c15 c1 0 M
  • 了解带有 pc 偏移的 Cortex-M 组件 LDR

    我正在查看这段 C 代码的反汇编代码 define GPIO PORTF DATA R volatile unsigned long 0x400253FC int main void Initialization code while 1
  • 读取STM32 MCU SPI数据寄存器的值

    有很多类似的问题 但似乎没有一个问题完全相同 我正在将 STML4 MCU 连接到 6 轴传感器 LSM6DS3 我已经成功地在 I2C 中实现了所有内容 但想要 SPI 的额外速度 和 DMA 如果我能让这些第一步工作起来的话 因此 第一
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公

随机推荐

  • 计算机如何执行(运行)程序

    1 1 计算机如何执行 运行 程序 当打开计算机时 主内存 RAM 是空的 计算机要做的第一件事就是将操作系统从硬盘加载到主存 RAM 中 操作系统被加载到主存 RAM 后 可以执行 运行 任何您希望运行的程序 应用程序软件 通常通过点击
  • [948]Pandas数据分组的函数应用(df.apply()、df.agg()、df.transform()、df.applymap()、df.groupby())

    文章目录 apply 数据聚合agg 数据转换transform applymap groupby apply 分组 分组 可迭代对象 其他轴上的分组 通过字典或者Series分组 通过函数分组 分组计算函数方法 多函数计算 agg 将自己
  • vue简单的倒计时组件

    例如想要获取今年的国庆倒计时 2023 10 1 可以先在组件中定义好时间 可以在props中给默认值 方便可以在组件中切换其他时间 默认给今年国庆 vue2语法 props date type String default 2023 10
  • 概率论 - 常见分布(及其分布表)

    分布表在对应的分布下边 离散型的分布 一 0 1分布 二 几何分布 三 二项分布 四 泊松分布 五 超几何分布 连续性的分布 一 均匀分布 二 指数分布 三 正态分布与标准正态分布 格格不入的三个分布 一 卡方分布 二 t 分布 三 F 分
  • RabbitMQ延时消息队列

    1 延时队列介绍 延时队列即放置在该队列里面的消息是不需要立即消费的 而是等待一段时间之后取出消费 那么 为什么需要延迟消费呢 我们来看以下的场景 网上商城下订单后30分钟后没有完成支付 取消订单 如 淘宝 去哪儿网 系统创建了预约之后 需
  • visual studio 2019 sql server localdb 数据库中文乱码解决方法

    今天使用localdb学习asp net core时 发现写入localdb数据库的中文为乱码 按照网上的方法解决 却无法显示 这里只有用sql语句更改了 参考这个 但我试了不成功 用sql语句更改可以 https www cnblogs
  • vue 生成条形码、二维码

    条形码 1 安装 cnpm install jsbarcode save 2 引入 import JsBarcode from jsbarcode 3 二维码容器
  • STM32理论 —— 定时器、时钟

    文章目录 1 定时器 1 1 分类与简介 1 1 1 分类与主要功能特点 1 1 2 三种常用的定时器简介 1 1 3 三种计数模式 1 1 4 定时器计数原理 1 1 5 如何快速定位定时器对应IO 引脚 1 2 时钟来源 1 3 通用定
  • MFC中传递消息的方法

    通过自定义消息实现进程间通信的方法 消息分为两种 即系统消息和用户 程序设计者 自定义消息 系统消息定义从0到0x3FF 可以使用0x400到0x7FFF定义自己的消息 Windows把0x400定义为WM USER 如果想定义自己的一个消
  • YOLOv5改进系列(23)——替换主干网络之MobileViTv2(移动视觉 Transformer 的高效可分离自注意力机制)

    YOLOv5改进系列 前期回顾 YOLOv5改进系列 0 重要性能指标与训练结果评价及分析 YOLOv5改进系列 1 添加SE注意力机制
  • 使用Python,OpenCV沿着轮廓寻找极值点

    使用Python OpenCV沿着轮廓寻找极值点 这篇博客将介绍如何使用Python OpenCV沿着轮廓寻找极值点 找到最北 最南 最东和最西 x y 坐标 虽然这项技能本身并不有用 但它通常被用作更高级计算机视觉应用程序的预处理步骤 这
  • 组态王和plc之间如何建立通讯?

    这两者之间可以有很多种通讯方式 比如 PROFIBUS MPI 以太网 DDE OPC MODBUS 自由口等 主要还是要看你的PLC选型 以及组网方式 现在最常见 也最常用的大概要数RS485 MODBUS协议下的无线通讯方式了 我们假定
  • 中国十大最狠的流氓网站曝光!

    动了流氓软件的发展 谁又从流氓软件中获利 揭开流氓软件背后的始佣者 网易科技独家选出中国十大流氓网站 以下是网易科技评选的十大流氓网站 1 3721 com 中文实名 这个是流氓软件的开山鼻祖 就是因它将中国互联网带入到一个流氓时代 这里就
  • 今日头条2018年校招视频面试过程 一面(编程题两道)

    首先面试官让自我介绍一下 然后问你做过的项目问你擅长的语言 你与其他同学相比的优点 等等 有两道笔试题 1 0 9a z表示36进制 写一个方法计算36进制的和 2 单链表进行反转 附上我写的代码 仅供参考 java代码实现 1 36进制求
  • elementUI 框架组件

    文章目录 elementUI 框架学习笔记 1 创建一个vue cli脚手架 2 Container 布局容器 3 Layout 布局 4 按钮 button 5 链接 6 表单系列 6 1 input 输入框 6 1 1 基础用法 6 1
  • vue 项目中使用 Loading 组件

    当在vue项目中请求后台接口时 常常会使用 loding 过渡数据的加载时间 如果 loading 作为一个全局的加载状态 应该写在项目中的App vue中
  • 大数据项目实战——基于某招聘网站进行数据采集及数据分析(五)

    大数据项目实战 第五章 数据分析 文章目录 大数据项目实战 学习目标 一 设计 Hive 数据仓库 1 事实表 ods jobdata origin 2 维度表 t salary detail 3 维度表 t company detail
  • 15 jQuery Plugins For A Better Photo Gallery And Slideshow

    Photo Gallery picture gallery or slideshow are the best way to showcase your images photos to your readers There are a l
  • 设计原则之组合复用原则的概念及实例代码操作

    场景 例题 教育局的学校管理中包括小学 初中和高中等三个级别老师与学生 不使用组合复用原则的解法 代码实现 采用继承实现 class Person class Teachers extends Person class Students e
  • 基于stm32f1的lora开发基础通信实验

    一 实验条件 环境 win10专业版 keil uv5 串口调试助手 stm32f1系列单片机 as32lora模块 这里是泽耀科技的as32 ttl 100 二 实现功能 1 使用定时器将底层数据通过as32每隔1秒向上层串口发送一段数据