STM32使用 :串口的接收与发送

一、串口

  1. 在 STM32 中,串口(UART,通用异步收发传输器)是用于串行通信的外设。它在嵌入式系统中的作用非常广泛,主要包括几个方面
  • 数据通信
    串口用于微控制器与其他设备之间的数据传输。这些设备可以是其他微控制器、传感器、计算机或通信模块(例如蓝牙、Wi-Fi 模块等)。串口以异步方式传输数据,不需要时钟信号,因此实现起来相对简单。
  • 调试功能
    UART 在嵌入式开发中常用于打印调试信息。在 STM32 开发过程中,程序员可以使用 printf 函数将调试信息通过串口输出到计算机终端。
  • 固件升级
    在嵌入式设备的维护过程中,UART 可以用于通过串口线对设备进行固件升级。
  • 外部模块通信
    GPS模块,蓝牙模块
UART 串口的主要特点
  • 异步通信,全双工通信,易于实现,传输效率较快。
调试软件

www.mcuisp.com下载即可

串口的发送(调试功能)
  1. 设置RCC的high SPeed CLock的模式为Crystal/Ceramic

  2. 找到电路板的串口,看清楚串口连接的是哪一个,我的电路板串口启用的是UART1

  3. UART1挂载到APB2总线上,设置APB2为64MHZ即可。

  4. 对USART1模式设置为Asynchronous,即为异步通信方式,当然你也可以在这里设置串口的具体参数
    在这里插入图片描述

  5. 通常将 printf 函数的输出重定向到 UART,这样你可以使用 printf 在终端上输出调试信息。需要实现 __io_putchar 函数来将字符发送到 UART

  6. 实际上是对__io_putchar的改写

int __io_putchar(int ch)
{HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);return ch;
}
参数:
int ch:传入的字符,将要通过串口输出的单个字符。功能:
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY):这个函数使用 STM32 的 HAL 库,通过 huart1(UART1 的句柄)发送数据。
&huart1:表示使用 UART1,也可以换成串口2(uint8_t *)&ch:将字符 ch 的地址转换为 uint8_t* 类型,因为 UART 通常处理的是 8 位数据(字符)。
1:发送 1 个字节的数据。
HAL_MAX_DELAY:设置为最大等待时间,表示发送数据时系统会等待直到传输完成。返回值:
return ch;:函数返回发送的字符 ch,这是为了和标准的 putchar 函数兼容,通常不用于实际逻辑。
  1. 代码示例
#include "main.h"UART_HandleTypeDef huart1;
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
// 主函数
int main(void)
{// 初始化HAL库HAL_Init();// 配置系统时钟SystemClock_Config();// 初始化GPIOMX_GPIO_Init();// 初始化USART1MX_USART1_UART_Init();// 无限循环,用于发送测试信息while (1){// 打印当前天气信息printf("today is sunshine,temp=45,shidu=35.\r\n");// 打印欢迎信息printf("hello world---------------->");// 延迟500毫秒HAL_Delay(500);}
}// 重定向printf函数,使其可以通过USART1发送字符
int __io_putchar(int ch)
{// 通过USART1发送字符HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, HAL_MAX_DELAY);return ch;
}// 配置系统时钟
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};// 配置时钟源RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;         // 启用外部高速时钟 (HSE)RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; // HSE预分频值为1RCC_OscInitStruct.HSIState = RCC_HSI_ON;         // 启用内部高速时钟 (HSI)RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;     // 启用锁相环 (PLL)RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; // PLL时钟源为HSERCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;     // PLL倍频因子为8if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){// 如果时钟配置失败,则进入错误处理Error_Handler();}// 配置时钟树RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; // 系统时钟源为PLLRCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;       // AHB时钟不分频RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;        // APB1时钟分频为2RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;        // APB2时钟不分频if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){// 如果时钟配置失败,则进入错误处理Error_Handler();}
}// 初始化USART1
static void MX_USART1_UART_Init(void)
{// 初始化USART1结构体huart1.Instance = USART1;                          // USART1实例huart1.Init.BaudRate = 115200;                     // 波特率为115200huart1.Init.WordLength = UART_WORDLENGTH_8B;       // 数据字长为8位huart1.Init.StopBits = UART_STOPBITS_1;            // 停止位为1位huart1.Init.Parity = UART_PARITY_NONE;             // 无奇偶校验huart1.Init.Mode = UART_MODE_TX_RX;                // 启用发送和接收模式huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;       // 无硬件流控制huart1.Init.OverSampling = UART_OVERSAMPLING_16;   // 过采样为16if (HAL_UART_Init(&huart1) != HAL_OK){// 如果USART1初始化失败,则进入错误处理Error_Handler();}
}// 初始化GPIO
static void MX_GPIO_Init(void)
{// 使能GPIOD和GPIOA的时钟__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();
}// 错误处理函数
void Error_Handler(void)
{// 禁用中断__disable_irq();// 进入无限循环while (1){}
}
串口的接收
  1. 设置RCC的High SPeed CLock为Crystal/Ceramic
  2. 设置USART1的模式为Asynchronous,并在NVIC开启中断,不用轮询访问
  3. 配置对应的总线上的时钟频率
  4. void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart,uint16_t Size)进行改写即可。
  5. 代码示例
#include "main.h"UART_HandleTypeDef huart1;  // UART1 句柄,用于配置和管理 UART1 外设char rxbuf[64];  // 接收缓冲区,用于存储从 UART 接收到的数据/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);/* UART 接收中断回调函数 ---------------------------------------------*/
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{// 在接收到数据后,这里将接收到的数据打印到终端printf("uart recv:%s\r\n", rxbuf);// 清空接收缓冲区memset(rxbuf, 0, sizeof(rxbuf));// 重新启动 UART 接收,以便持续接收数据HAL_UARTEx_ReceiveToIdle_IT(&huart1, rxbuf, sizeof(rxbuf));
}/* 重定向 printf 到 UART1 --------------------------------------------*/
int __io_putchar(int ch)
{// 通过 UART1 发送单个字符HAL_UART_Transmit(&huart1, (unsigned char*)&ch, 1, 1);return ch;  // 返回发送的字符
}int main(void)
{// 初始化 HAL 库HAL_Init();// 配置系统时钟SystemClock_Config();// 初始化 GPIO 和 UART1 外设MX_GPIO_Init();MX_USART1_UART_Init();// 启动 UART 接收中断,准备接收数据HAL_UARTEx_ReceiveToIdle_IT(&huart1, rxbuf, sizeof(rxbuf));while (1){// 主循环,保持程序运行}
}/* 配置系统时钟 -------------------------------------------------------*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};// 配置振荡器和 PLLRCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;HAL_RCC_OscConfig(&RCC_OscInitStruct);// 配置时钟源和时钟分频RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK| RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
}/* 初始化 USART1 ------------------------------------------------------*/
static void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 115200;  // 波特率设置为 115200huart1.Init.WordLength = UART_WORDLENGTH_8B;  // 8 数据位huart1.Init.StopBits = UART_STOPBITS_1;  // 1 停止位huart1.Init.Parity = UART_PARITY_NONE;  // 无校验huart1.Init.Mode = UART_MODE_TX_RX;  // 启用发送和接收模式huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;  // 无硬件流控huart1.Init.OverSampling = UART_OVERSAMPLING_16;  // 16 倍采样HAL_UART_Init(&huart1);  // 初始化 UART1
}/* 初始化 GPIO --------------------------------------------------------*/
static void MX_GPIO_Init(void)
{// 启用 GPIOD 和 GPIOA 时钟__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();
}/* 错误处理函数 -------------------------------------------------------*/
void Error_Handler(void)
{__disable_irq();  // 禁用所有中断while (1){// 在出现错误时,进入死循环}
}

在这里插入图片描述

应用:串口协议解析用户命令
  • 其实就是对收到的数据(该数据具有一定的格式)截取对应的关键字进行处理的过程。
  • 主要应用函数strstr
strstr 函数是 C 标准库中的一个字符串处理函数,用于查找一个子字符串在另一个字符串中的第一次出现位置。它的函数原型在 <string.h> 头文件中定义。
函数原型:char *strstr(const char *haystack, const char *needle);
参数:haystack ->>指向要搜索的主字符串的指针。needle   ->>指向要查找的子字符串的指针。
返回值如果找到子字符串 needle 在主字符串 haystack 中的第一次出现位置,strstr 返回指向子字符串首次出现位置的指针。位置从0开始算如果没有找到子字符串,strstr 返回 NULL。atoi函数:用于将一个字符串转换成整数。定义在 <stdlib.h> 
原型:int atoi(const char *str);
  • 代码示例
该代码的主要功能是可以对以下格式的数据进行处理
cmd:ledr=on,usrname=xiaowang,passwd=123456,temp=23;
代码中有限制对应的字长
硬件操作LED灯,管脚在PC6,PC7,PC8,软件输出用户名,密码和温度#include "string.h"
#include <stdlib.h>
#include "main.h"// UART句柄声明,用于管理USART1的UART通信
UART_HandleTypeDef huart1;// 函数声明
void SystemClock_Config(void);         // 系统时钟配置
static void MX_GPIO_Init(void);        // GPIO初始化
static void MX_USART1_UART_Init(void); // USART1 UART初始化
char rxbuf[64];                        // UART接收缓冲区
char name[64];                         // 用户名存储
char passwd[64];                       // 密码存储
char temp[32];                         // 临时存储温度数据
int itemp;                             // 存储温度的整数值/*** @brief UART接收回调函数* @param huart: UART句柄* @param Size: 接收的数据大小* @retval None*/
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{// 确保这是USART1的事件if (huart->Instance == USART1) {// 查找命令 "ledr=on" 并开启红色LEDchar *p = strstr(rxbuf, "ledr=on");if (p) {HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_SET);}// 查找命令 "ledr=off" 并关闭红色LEDp = strstr(rxbuf, "ledr=off");if (p) {HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6, GPIO_PIN_RESET);}// 查找命令 "ledg=on" 并开启绿色LEDp = strstr(rxbuf, "ledg=on");if (p) {HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_SET);}// 查找命令 "ledg=off" 并关闭绿色LEDp = strstr(rxbuf, "ledg=off");if (p) {HAL_GPIO_WritePin(GPIOC, GPIO_PIN_7, GPIO_PIN_RESET);}// 查找命令 "ledb=on" 并开启蓝色LEDp = strstr(rxbuf, "ledb=on");if (p) {HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_SET);}// 查找命令 "ledb=off" 并关闭蓝色LEDp = strstr(rxbuf, "ledb=off");if (p) {HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);}// 解析 "usrname=" 后的用户名信息p = strstr(rxbuf, "usrname=");if (p) {p += strlen("usrname=");int i = 0;while (p[i] != ',' && p[i] != ';') {name[i] = p[i];i++;}name[i] = '\0'; // 添加字符串终止符}// 解析 "passwd=" 后的密码信息p = strstr(rxbuf, "passwd=");if (p) {p += strlen("passwd=");int i = 0;while (p[i] != ',' && p[i] != ';') {passwd[i] = p[i];i++;}passwd[i] = '\0'; // 添加字符串终止符}// 解析 "temp=" 后的温度数据p = strstr(rxbuf, "temp=");if (p) {p += strlen("temp=");int i = 0;while (p[i] != ',' && p[i] != ';') {temp[i] = p[i];i++;}temp[i] = '\0'; // 添加字符串终止符itemp = atoi(temp); // 将字符串转换为整数}// 打印调试信息,包括用户名、密码和温度值printf("xuart recv username=%s passwd=%s temp=%d\n", name, passwd, itemp);// 清空接收缓冲区memset(rxbuf, 0, sizeof(rxbuf));// 重新启用接收中断HAL_UARTEx_ReceiveToIdle_IT(&huart1, (uint8_t *)rxbuf, sizeof(rxbuf));}
}/*** @brief 重定向printf函数到UART* @param ch: 字符* @retval 传输的字符*/
int __io_putchar(int ch)
{HAL_UART_Transmit(&huart1,(unsigned char*)&ch,1,HAL_MAX_DELAY);return ch;
}/*** @brief 主函数,系统的入口* @retval None*/
int main(void)
{// 初始化HAL库HAL_Init();// 系统时钟配置SystemClock_Config();// 初始化GPIO和USART1MX_GPIO_Init();MX_USART1_UART_Init();// 启动UART接收HAL_UARTEx_ReceiveToIdle_IT(&huart1, rxbuf, sizeof(rxbuf));// 无限循环,保持程序运行while (1){}
}/*** @brief 配置系统时钟* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};// 配置HSE时钟RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}// 初始化CPU, AHB, APB时钟RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;// 配置时钟if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/*** @brief USART1初始化函数* @retval None*/
static void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}
}/*** @brief GPIO初始化函数* @retval None*/
static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};// 启用GPIO时钟__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();// 配置PC6、PC7和PC8引脚为输出HAL_GPIO_WritePin(GPIOC, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8, GPIO_PIN_RESET);GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
}/*** @brief 错误处理函数* @retval None*/
void Error_Handler(void)
{__disable_irq();while (1){}
}#ifdef  USE_FULL_ASSERT
/*** @brief  报告错误的文件名和行号* @param  file: 错误发生的文件名* @param  line: 错误发生的行号* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif /* USE_FULL_ASSERT */

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql的zip解压缩版安装

文章目录 一、MySQL下载二、mysql解压缩版安装1、解压缩2、设置环境变量3、mysql初始化4、安装mysql服务5、启动mysql服务6、连接mysql7、修改初始密码8、安装完成 一、MySQL下载 下载网址&#xff1a;MySQL下载 本文以mysql8.4.2版本为例下载解压缩版。 二、mysql解压缩版安…

MS SQL Server 实战 排查多列之间的值是否重复

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 SQL语句 小结 需求 在日常的应用中&#xff0c;排查列重复记录是经常遇到的一个问题&#xff0c;但某些需求下&#xff0c;需要我们排查一组列之间是否有重复值的情况。比如我们有一组题库数据&…

STM32的寄存器深度解析

目录 一、STM32 寄存器概述 二、寄存器的定义与作用 三、寄存器分类 1.内核寄存器 2.外设寄存器 四、重要寄存器详解 1.GPIO 相关寄存器 2.定时器相关寄存器 3.中断相关寄存器 4.RCC 相关寄存器 五、寄存器操作方法 1.直接操作寄存器 2.使用库函数操作寄存器 六…

数字高程模型DEM详细应用分析

DEM在各个领域都有广泛应用&#xff0c;它不仅仅是一张“高程地图”&#xff0c;更是地理分析、模拟和预测的重要工具。 一、地形分析 在地形分析中&#xff0c;DEM是不可或缺的工具. 1 坡度分析&#xff08;Slope Analysis&#xff09; 定义&#xff1a;坡度是指地形表面的…

go语言的基本语法

学了go语言但是一直没整理。。。那怎么证明我学了&#xff1f;如果学了之后忘了怎么复习&#xff1f;遂诞生这几篇&#xff0c;当作Linux中间的小插曲 整理一下go语言的基本语法&#xff1a; package mainimport ("bufio""fmt""os" ) 在使用对…

模拟退火算法(SA算法)求解实例---旅行商问题 (TSP)

目录 一、采用SA求解 TSP二、 旅行商问题2.1 实际例子&#xff1a;求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏&#xff08;后续和其他算法进行对比&#xff09; 三、 如何修改代码&#xff1f;3.1 减少城市坐标&#xff0c;如下&am…

文件格式转换:EXCEL和CSV文件格式互相转换

目录 1.EXCEl和CSV文件格式互相转换1.1首先安装所需的Python包1.2excel转换为csv代码如下&#xff1a;1.3csv转换为excel代码如下&#xff1a; 由于excel文件在数学建模数据处理当中的局限性&#xff0c;我们通常把excel文件转换为csv文件来处理&#xff0c;下面是相关的代码&a…

用网卡的ap模式抓嵌入式设备的网络包

嵌入式设备不像pc上&#xff0c;有一些专门的工具比如wareshark来抓包&#xff0c;嵌入式设备中&#xff0c;有的可能集成了tcpdump&#xff0c;可以用来进行简单的抓包&#xff0c;但是不方便分析&#xff0c;况且有的嵌入式设备不一定就集成了tcpdump工具。 关于tcpdump工具…

Hibernate基础

Hibernate基础总结 有利的条件和主动的恢复产生于再坚持一下的努力之中&#xff01; 好久没更新了&#xff0c;今天入门了Hibernate&#xff0c;由于之前学习了MyBatis&#xff0c;初步感觉二者的底层实现思想有很多相似之处&#xff0c;下面让我们以一个入门Demo的形式感受一…

AIGC实战——多模态模型Flamingo

AIGC实战——多模态模型Flamingo 0. 前言1. Flamingo 架构2. 视觉编码器3. Perceiver 重采样器4. 语言模型5. FIamingo 应用小结系列链接 0. 前言 我们已经学习了文本生成图像模型 DALL.E 2&#xff0c;在本节中&#xff0c;我们将探索另一种多模态模型 Flamingo&#xff0c;它…

Docker上安装mysql

获取 MySQL 镜像 获取镜像。使用以下命令来拉取镜像&#xff1a; 1docker pull mysql:latest 这里拉取的是最新版本的 MySQL 镜像。你也可以指定特定版本&#xff0c;例如&#xff1a; 1docker pull mysql:8.0 运行 MySQL 容器 运行 MySQL 容器时&#xff0c;你需要指定一些…

redis基本数据结构-hash

这里写自定义目录标题 1. redis的数据结构hash1.1 Hash 数据结构的特点1.2 常见命令1.3 适用示例 2. 常见业务场景2.1 用户信息存储2.1.1 场景2.1.2 优势2.1.3 解决方案2.1.4 代码实现 2.2 购物车管理2.2.1 背景2.2.2 优势2.2.3 解决方案2.2.4 代码实现 3. 注意事项&#xff1a…

USB的电气特性

文章目录 一、USB的三种速率及状态切换图1. **附加&#xff08;Attached&#xff09;**2. **供电&#xff08;Powered&#xff09;**3. **复位&#xff08;Reset&#xff09;**4. **地址设置&#xff08;Addressed&#xff09;**5. **配置&#xff08;Configured&#xff09;**…

llama网络结构及源码

目录 模型初始化 config lm_head transformer wte h rms_1/rms_2 attn c_attn c_proj 线性层mlp ln_f rope_cache mask_cache kv_caches tokenizer tokenizer初始化 tokennizer.encoder 位置编码和mask 确定最大文本长度 建立rope_cache 建立mask_cache …

C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿&…

ICM20948 DMP代码详解(23)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;22&#xff09; 上一回解析完了inv_icm20948_wakeup_mems函数&#xff0c;本回回到inv_icm20948_initialize_lower_driver函数中&#xff0c;继续往下解析。为了便于理解和回顾&#xff0c;再次贴出inv_icm20948_init…

闯关leetcode——26. Remove Duplicates from Sorted Array

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/ 内容 Given an integer array nums sorted in non-decreasing order, remove the duplicates in-place such that each unique element appear…

Framebuffer应用编程

目录 前言 LCD操作原理 涉及的 API 函数 open函数 ioctl 函数 mmap 函数 Framebuffer程序分析 源码 1.打开设备 2.获取LCD参数 3.映射Framebuffer 4.描点函数 5.随便画几个点 上机实验 前言 本文介绍LCD的操作原理和涉及到的API函数&#xff0c;分析Framebuffer…

Python青少年简明教程:tkinter库入门

Python青少年简明教程&#xff1a;tkinter库入门 tkinter是Python的标准GUI&#xff08;图形用户界面&#xff09;库。它提供了一种快速而简单的方法来创建GUI应用程序。tkinter是Python自带的&#xff0c;无需额外安装&#xff0c;随 Python 安装包一起提供。 在Python 3.x中…

rtems 5.3 qemu realview_pbx_a9 环境搭建:生成 rtems arm 工具链

前言 rtems 是一款比较优秀的 RTOS&#xff0c;官方网址 https://www.rtems.org/ 当前 rtems 最新发布的版本&#xff1a;rtems-5.3 版本&#xff0c; 下载地址 https://ftp.rtems.org/pub/rtems/releases/5/5.3/ rtems 支持的 平台也是比较多的&#xff0c;当前支持 STM32F4…