当前位置: 首页 > news >正文

STM3学习记录

一、串口
1.串口定义,将串口相关寄存器的首地址强制转化为串口结构体,方便通过结果体访问串口的寄存器

#define     __IO    volatile             /*!< Defines 'read / write' permissions */
typedef struct
{__IO uint32_t SR;         /*!< USART Status register,                   Address offset: 0x00 */__IO uint32_t DR;         /*!< USART Data register,                     Address offset: 0x04 */__IO uint32_t BRR;        /*!< USART Baud rate register,                Address offset: 0x08 */__IO uint32_t CR1;        /*!< USART Control register 1,                Address offset: 0x0C */__IO uint32_t CR2;        /*!< USART Control register 2,                Address offset: 0x10 */__IO uint32_t CR3;        /*!< USART Control register 3,                Address offset: 0x14 */__IO uint32_t GTPR;       /*!< USART Guard time and prescaler register, Address offset: 0x18 */
} USART_TypeDef;#define PERIPH_BASE           0x40000000UL /*!< Peripheral base address in the alias region */
#define APB1PERIPH_BASE       PERIPH_BASE
#define USART3_BASE           (APB1PERIPH_BASE + 0x00004800UL)
#define USART3              ((USART_TypeDef *)USART3_BASE)

2.若有奇偶校验位 16比特数据传输

/* In case of 9bits/No Parity transfer, pTxData needs to be handled as a uint16_t pointer */
if ((husart->Init.WordLength == USART_WORDLENGTH_9B) && (husart->Init.Parity == USART_PARITY_NONE))
{ptxdata8bits  = NULL;ptxdata16bits = (const uint16_t *) pTxData;
}
else
{ptxdata8bits  = pTxData;ptxdata16bits = NULL;
}

3.采样频率是波特率的16倍,起始位将采样位置定位到一位的中间
4.串口有一个字节的缓冲
现象:
串口助手连续发送received@abc
打印数据为:

9 received@
10 areceived@
10 areceived@
10 areceived@
10 areceived@

解释:
从框图得知(只看接收部分结构):
数据先进入接收移位寄存器,再进入接受数据寄存器
串口助手第一次发送received@abc,程序读取到@停止,即读到received@后停止,但是a进入串口接收移位寄存器,等接收数据寄存器读空,接收移位寄存器数据将移入接收数据寄存器,因此第二次读取数据时,从接收数据寄存器读取到的是字符’a’,后续读取received@,也就是说,第二次开始,读取的是areceived@。
在这里插入图片描述

  while (1){rec_len = get_usart_line(rx_buf, rx_max_size, 500000);rx_buf[rec_len] = '\0';if(rec_len > 0) {char str[100];rec_len = snprintf(str, sizeof(str) / sizeof(str[0]), "%d %s\r\n", rec_len, rx_buf);HAL_UART_Transmit_DMA(&huart6, (uint8_t *)str, rec_len);// HAL_UART_Transmit_DMA(&huart6, rx_buf, rec_len);len = rec_len;}rx_buf[0] = 0;/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}int get_usart_line(uint8_t *rx, int rx_max_size, int timeout) {int t = 0, i;uint8_t rx_buf = 0;for(i = 0; rx_buf != '@' && t < timeout && i < rx_max_size; t++) {if(HAL_UART_Receive(&huart6, &rx_buf, 1, 0) == HAL_OK) {// if(HAL_UART_Receive_DMA(&huart6, &rx_buf, 1) == HAL_OK) {rx[i++] = rx_buf;}}return t >= timeout ? -1 : i;
}

二、定时器
1.允许定时器中断

HAL_TIM_Base_Start_IT(&htim2);

2.重写定时器回调函数
函数原型:

/*** @brief  Period elapsed callback in non-blocking mode* @param  htim TIM handle* @retval None*/
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{/* Prevent unused argument(s) compilation warning */UNUSED(htim);/* NOTE : This function should not be modified, when the callback is needed,the HAL_TIM_PeriodElapsedCallback could be implemented in the user file*/
}

重写:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2) {static int cnt = 0;if(cnt < 500) led_on();else if(cnt < 1000) led_off();else cnt = 0;cnt++;}
}

三、DMA
STM32 DMA结构图
1.触发方式
硬件触发:UART、ADC、IIC等外设设备
软件触发:M2M置1,内部触发,尽快连续触发传输计数器,快速转运数据,不能喝自动重装一起使用,否则会无限转运。
2.开关控制
当没有开启自动重装,计数器清零时需要先关闭DMA,重新填充初值,再开启DMA,注意必须先关闭
3.DMA通道
每个通道连接的外设不同,必须选择对应外设的通道才能转运,例如STM32F427IIH DMA+UART6 RX必须选择DMA2通道1或通道2 TX必须选择通道DMA2的通道6或7。

四、SPI协议
1.硬件电路
特点:输出引脚始终输出,输入引脚始终输入,主机MISO输出,从机MISO输入。
引脚模式:输出配置为推挽输出,输入为浮空或则上拉。
从机:所有从机输出默认高阻态,否则可能造成短路,例如从机1默认低电平,从机2获得控制器权,发送高电平,将导致短路。
在这里插入图片描述
2.移位模型
一个时钟周期的一个边沿,主机和从机移位寄存器同时左移一位,根据移出的那一位将信号线置高或者拉低;另一个边沿,主机和从机同时从信号线将电平读入,并将电平放入移位寄存器的最低位,之后移位寄存器左移一位。
左边为最高位,SPI是高位先行
在这里插入图片描述
3.传输模式
按scl空闲时状态(CPOL控制),输入和输出时机(CPHA控制),分四种模式
模式0:scl空闲低电平,第一个边沿读入,第二个边沿输出
模式1:scl空闲低电平,第一个边沿输出,第二个边沿读入
模式2:scl空闲高电平,第一个边沿读入,第二个边沿输出
模式3:scl空闲高电平,第一个边沿输出,第二个边沿读入
4.模式0时序
在SCK第一个边沿(上升沿),主机和从机从信号线读取最高位;第二个边沿(下降沿),主机和从机将最高位移到信号线,后续也是上升沿读取,下降沿写入,由于SCK第一个边沿就得读取,因此在SS下降沿就应该先讲数据写入到数据线上
在这里插入图片描述

5.全部模式时序四种模式的时序图,分别为模式3 1 2 0在这里插入图片描述
6.软件模拟spi读取mpu6500
协议时序核心代码:

uint8_t swap_one_byte(uint8_t data) {/* 优化:模拟移位寄存器,从左边移出一位,右边移入一位时序:模式1:空闲时scl为低电平,第一个边沿读取数据;即上升沿后立即读取数据,下降沿后立即写入数据第一个数据是在ncss的下降沿发送*/for(int i = 0; i < 8; i++) {mosi(data & 0x80);data <<= 1;scl(1);if(miso()) data |= 0x01;scl(0);} return data;
}

BUG记录:
现象:miso读取的电平始终为低电平
排查:
1.烧录robomaster官方代码,可正常读取,排除硬件问题
2.排查代码:GPIO配置、协议时序实现、GPIO读写接口
最后发现是GPIO读写接口错误,具体如下:
使用宏定义读写GPIO口,但是GPIO口编号并不是1,2,3,4,5,而是需要使用HAL库的宏GPIO_PIN_x

#define SPI_NCSS 6
#define SPI_SCL 7
#define SPI_MOSI 9
#define SPI_MISO 8
#define SPI_GPIO GPIOF

修改后:

#define SPI_NCSS GPIO_PIN_6
#define SPI_SCL GPIO_PIN_7
#define SPI_MOSI GPIO_PIN_9
#define SPI_MISO GPIO_PIN_8
#define SPI_GPIO GPIOF

现象:烧录后第一次读取mpu6500 id为0x00,应为0x70
原因:scl配置为默认高电平,mpu6500采用模式0,即第scl空闲时为0,导致初始时mpu无法侦测到空闲位,从而导致mpu无法正常读取到第一位数据。
应在0x75寄存器读取设备id,拼接读写位后(读写位拼接到最高位)为0xf5,由于上述原因,mpu实际接受到的数据为0x75,这意味着在0x75寄存器写入数据,因此无法读取到0x75寄存器,id为0是因为MISO默认电平为0;
解决方案:scl配置为默认低电平

相关文章:

STM3学习记录

一、串口 1.串口定义&#xff0c;将串口相关寄存器的首地址强制转化为串口结构体&#xff0c;方便通过结果体访问串口的寄存器 #define __IO volatile /*!< Defines read / write permissions */ typedef struct {__IO uint32_t SR; /*!< US…...

【网络】应用层协议-http协议

应用层协议-http协议 文章目录 1.Http协议1.1什么是http协议1.2认识URL1.3urlencode和urldecode1.4HTTP请求协议格式1.5HTTP响应协议格式1.6HTTP常见的Header1.7HTTP常见状态码1.8HTTP的方法1.8根据url调取对应的服务 2.cookie和session2.1cookie2.2session 3.HTTPS协议3.1对称…...

【python】OpenCV—Mask RCNN for Object Detection and Instance Segmentation

文章目录 1、任务描述2、MASR RCNN 网络结构3、方法实现4、结果展示5、涉及到的库getPerfProfile 6、参考 1、任务描述 利用 mask rcnn 网络&#xff0c;进行图片和视频的目标检测和实例分割 2、MASR RCNN 网络结构 3、方法实现 # Copyright (C) 2018-2019, BigVision LLC (L…...

通过 Python 使用 Pexels图片库 API 打造个性化壁纸应用

在数字时代&#xff0c;照片不仅仅是回忆的载体&#xff0c;它们还是我们生活的美丽装饰品。想象一下&#xff0c;如果你能轻松地将世界上最美的免费图片应用到你的应用程序中&#xff0c;岂不是让你的程序立刻闪亮起来&#xff1f;好消息是&#xff0c;这不仅仅是一个梦想。今…...

多线程篇(其它容器- CopyOnWriteArrayList)(持续更新迭代)

一、CopyOnWriteArrayList&#xff08;一&#xff09; 1. 简介 并发包中的并发List只有CopyOnWriteArrayList。 CopyOnWriteArrayList是一个线程安全的ArrayList&#xff0c;对其进行的修改操作都是在底层的一个复制的数 组&#xff08;快照&#xff09;上进行的&#xff0…...

OPENAIGC开发者大赛高校组金奖 | 知洞—基于大模型的智慧题库

在第二届拯救者杯OPENAIGC开发者大赛中&#xff0c;涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到&#xff0c;我们特意开设了优秀作品报道专栏&#xff0c;旨在展示其独特之处和开发者的精彩故事。 无论您是技术专家还是爱好者&#xff0c;希望能带给您…...

java服务CPU使用率高排查

第一步 使用top命令进行查看 如果是死锁&#xff0c;cpu使用率不会很高&#xff0c;但不会响应&#xff0c;这时这样排查。 第二步 使用jps查看到进程id,再使用jstack pid查看线程堆栈信息 jstack pid会出现如图所示的信息&#xff0c;表示发生死锁&#xff0c;然后去排查这…...

聚焦:clicOH 借助 NVIDIA cuOpt 实现最后一英里交付速度 20 倍提升

受消费者行为转变和疫情影响&#xff0c;电子商务继续呈爆炸式增长和转型。因此&#xff0c;物流和运输公司发现自己处于包裹配送革命的前沿。这新的现实情况在最后一英里配送中尤为明显&#xff0c;而后者现在已经成为供应链物流中成本最高的要素&#xff0c;占从零售到制造等…...

从头开始嵌入式第三十八天(数据结构 双向链表)

目录 双向链表 一、结构特点 二、操作优势 三、应用场景 1.创建链表 2.头插数据 3.打印数据 4.查找数据 5.删除数据 6.更改数据 7.清空数据 8.尾插数据 9.按位插入 10.获取长度 11.是否为空 双向链表 双向链表是一种链表结构。 一、结构特点 1. 每个节点包含两个…...

chapter14-集合——(List-HashSet)——day18

目录 519-HashSet全面说明 520-数组链表模拟 521-HashSet扩容机制 重要 522-HashSet源码解读1 526-HashSet最佳实践 527-hashSet思考题 519-HashSet全面说明 题一、 两个tom都可以添加成功是因为这是两个对象 看源码做分析&#xff1a;不是直接指向常量池的吗&#xff1f;…...

企业会议室预约管理系统

基于springbootvuemysql实现的企业会议室预约管理系统&#xff08;源码数据库部署视频&#xff09; ### 主要技术 SpringBoot、Vue、MySQL ### 系统角色 员工、管理员 ### 系统功能 1&#xff09;管理员&#xff1a;数据统计&#xff08;会议室使用统计-柱状图、设备状态统计…...

安全API

提到安全&#xff0c;大部分在学习和调试编程语言时并不太在意&#xff0c;真正爆发问题是在用户端。真正的安全漏洞是很可怕的&#xff0c;获取系统最高权限&#xff0c;获得敏感资讯&#xff0c;伤心不已&#xff0c;泪流满面。 字符串 C语言简洁自由的风格&#xff0c;产生…...

【论文阅读】视觉分割新SOTA: Segment Anything(SAM)

导言 随着基于对比文本—图像对的预训练&#xff08;CLIP&#xff09;方法或者模型、聊天生成预训练转换器&#xff08;ChatGPT&#xff09;、生成预训练转换器-4&#xff08;GPT-4&#xff09;等基础大模型的出现&#xff0c;通用人工智能&#xff08; AGI&#xff09;的研究…...

redis之list核心命令演示与细节探索

redis之list核心命令演示与细节探索 BLMOVE source destination LEFT|RIGHT LEFT|RIGHT timeout summary: Pop an element from a list, push it to another list and return it; or block until one is available since: 6.2.0 BLPOP key [key …] timeout summary: Remove …...

[数据集][目标检测]智慧农业草莓叶子病虫害检测数据集VOC+YOLO格式4040张9类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4040 标注数量(xml文件个数)&#xff1a;4040 标注数量(txt文件个数)&#xff1a;4040 标注…...

Lua 与 C#交互

Lua 与C#交互 前提 Lua是一种嵌入式脚本语言&#xff0c;Lua的解释器是用C编写的&#xff0c;因此可以方便的与C/C进行相互调用。轻量级 Lua语言的官方版本只包括一个精简的核心和最基本的库&#xff0c;这使得Lua体积小、启动速度快&#xff0c;也适合嵌入在别的程序里。 交…...

【办公类】大组工会学习(文心一言+Python批量)

背景需求&#xff1a; 每学期要写一份工会的大组政治学习读后感&#xff08;9月-1月&#xff0c;共5次&#xff09; 学习内容 9月、10月、11月、12月、1月的学习内容文字稿 在班级里&#xff0c;我擅长电脑工作&#xff0c;所以这种写的工作都包了。 中2班三位老师一共写3篇&…...

项目管理工作流是什么?项目管理工作流管理实战技巧!

项目管理工作流是指在协作过程中通过限制任务状态的流转进行流程控制的一种方式。项目从启动到完成所经历的一系列有序、可控的步骤和流程&#xff0c;它详细描述了项目执行过程中各项任务和活动的顺序、依赖关系、责任人以及完成标准等&#xff0c;是项目成功执行的重要保障。…...

leveldb源码剖析(二)——LSM Tree

LSM Tree LSM Tree&#xff1a;Log-Structured Merge Tree&#xff0c;日志结构合并树。是一种频繁写性能很高的数据结构。 LSM Tree将写入操作与合并操作分离&#xff0c;数据首先写入磁盘中的日志文件&#xff08;WAL&#xff09;&#xff0c;随后写入内存缓存&#xff0c;…...

三十六、Gin注册功能-检查账号是否存在

一、初始化 1、在cms.go中添加数据库连接方法 func connDB(app *CmsApp) {mysqlDB, err : gorm.Open(mysql.Open("root:rootroottcp(localhost:3306)/?charsetutf8mb4&parseTimeTrue&locLocal"))if err ! nil {panic(err)}db, err : mysqlDB.DB()if err !…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...