Air001 使用内部时钟源,倍频跑48MHz主频例程

Air001 使用内部时钟源,倍频跑48MHz主频例程


  • ✨根据该芯片手册描述,Air001最高48MHz工作频率。
  • 🍁Air001使用内部时钟源,固定倍频(X2)路线:
    在这里插入图片描述

🛠频率和CPU访问存储器周期调整

  • 🌿系统主频和Flash Delay等级匹配关系表
    在这里插入图片描述
  • 🔖对应代码:
    if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {  //=48MHz LATENCY=1
//系统时钟周期
        Error_Handler();
    }

🔨系统时钟配置

  • 🔧使用内容RC振动器配置为24MHz,通过倍频器(PLL)固定的2倍频,得到48MHz.
/**
  * @brief   配置系统时钟
  * @param   HSICLKSource_SET:选择HSI时钟频率
  *            @arg @ref RCC_HSICALIBRATION_8MHz:8M时钟
  *            @arg @ref RCC_HSICALIBRATION_16MHz:16M时钟
  *            @arg @ref RCC_HSICALIBRATION_22p12MHz:22.12M时钟
  *            @arg @ref RCC_HSICALIBRATION_24MHz:24M时钟
  * @retval  无
  */

static void APP_SystemClockConfig(uint32_t HSICLKSource_SET)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI ; /* 配置HSE、HSI、LSI、LSE */
    RCC_OscInitStruct.HSIState = RCC_HSI_ON; /* 开启内部高速时钟HSI */
//    RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* HSI不分频 HSIDIV*/
    RCC_OscInitStruct.HSICalibrationValue = HSICLKSource_SET; /* HSI校准频率8MHz */
//    RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* 关闭HSE */
//		RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz; /* HSE频率范围16~32MHz */
//		RCC_OscInitStruct.LSIState = RCC_LSI_ON; /*开启内部低速时钟 关闭LSI:RCC_LSI_OFF */
    /* RCC_OscInitStruct.LSEDriver = RCC_LSEDRIVE_MEDIUM; */ /* 默认LSE驱动能力 */
		
		RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; /* 开启PLL 关闭PLL:RCC_PLL_OFF*/
//		RCC_OscInitStruct.PLL.PLLSource =RCC_PLLSOURCE_HSI; //RCC_PLLSOURCE_HSI   RCC_PLLSOURCE_NONE
	RCC_OscInitStruct.PLL.PLLSource =RCC_PLLSOURCE_HSI;/* PLL内部时钟源 RCC_PLLSOURCE_NONE*/
		
		
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

    /* 配置振荡器 */
    if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
        Error_Handler();
    }

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;/* 配置SYSCLK、HCLK、PCLK */
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 配置系统时钟为HSI RCC_SYSCLKSOURCE_PLLCLK RCC_SYSCLKSOURCE_HSI*/
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB时钟不分频 */
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB时钟不分频 */
    /* 配置时钟源 */
    if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {  //=48MHz LATENCY=1
//系统时钟周期
        Error_Handler();
    }
}
  • 🔧使用内容RC振动器配置为8 - 24MHz,不通过倍频器(PLL)固定的2倍频,走分频器路线:
    在这里插入图片描述
/**
  * @brief   配置系统时钟
  * @param   HSICLKSource_SET:选择HSI时钟频率
  *            @arg @ref RCC_HSICALIBRATION_8MHz:8M时钟
  *            @arg @ref RCC_HSICALIBRATION_16MHz:16M时钟
  *            @arg @ref RCC_HSICALIBRATION_22p12MHz:22.12M时钟
  *            @arg @ref RCC_HSICALIBRATION_24MHz:24M时钟
  * @retval  无
  */
static void APP_SystemClockConfig(uint32_t HSICLKSource_SET)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE | RCC_OSCILLATORTYPE_HSI \
                                       | RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE; /* 配置HSE、HSI、LSI、LSE */
    RCC_OscInitStruct.HSIState = RCC_HSI_ON; /* 开启内部高速时钟HSI */
    RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* HSI不分频 */
    RCC_OscInitStruct.HSICalibrationValue = HSICLKSource_SET; /* HSI校准频率8MHz */
    RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* 关闭HSE */
//    RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz; /* HSE频率范围16~32MHz */
    RCC_OscInitStruct.LSIState = RCC_LSI_ON; /*开启内部低速时钟 关闭LSI:RCC_LSI_OFF */
    RCC_OscInitStruct.LSEState = RCC_LSE_OFF; /* 关闭LSE */
    /* RCC_OscInitStruct.LSEDriver = RCC_LSEDRIVE_MEDIUM; */ /* 默认LSE驱动能力 */

//    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; /* 开启PLL 关闭PLL:RCC_PLL_OFF*/
//    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; /* PLL内部时钟源 RCC_PLLSOURCE_NONE*/


    if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
        Error_Handler();
    }

    /* 配置振荡器 */
    if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
        Error_Handler();
    }

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;/* 配置SYSCLK、HCLK、PCLK */
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; /* 配置系统时钟为HSI RC*/
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB时钟不分频 */
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB时钟不分频 */
    /* 配置时钟源 */
    if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
        Error_Handler();
    }
}

📘时钟测试代码:

/**
  ******************************************************************************
  * @file    main.c
  * @author  MCU Application Team
  * @brief   Main program body
  ******************************************************************************
  * @attention
  *
  * <h2><center>&copy; Copyright (c) AirM2M.
  * All rights reserved.</center></h2>
  *
  * <h2><center>&copy; Copyright (c) 2016 STMicroelectronics.
  * All rights reserved.</center></h2>
  *
  * This software component is licensed by ST under BSD 3-Clause license,
  * the "License"; You may not use this file except in compliance with the
  * License. You may obtain a copy of the License at:
  *                        opensource.org/licenses/BSD-3-Clause
  *
  ******************************************************************************
  */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"
#include "stdio.h"
/* Private define ------------------------------------------------------------*/
#define CPU_8MHZ		8000000u
#define CPU_12MHZ		12000000u
#define CPU_16MHZ		16000000u
#define CPU_22P12MHZ		22120000u
#define CPU_24MHZ		24000000u
#define CPU_48MHZ		48000000u


/* Private variables ---------------------------------------------------------*/
/* Private user code ---------------------------------------------------------*/
static void APP_SystemClockConfig(uint32_t HSICLKSource_SET);

void Hal_delay_us(uint32_t us)
{
    // 确定每个微秒所需的滴答定时器计数值
    uint32_t ticks = us * (SystemCoreClock);

    // 设置滴答定时器的计数值
    SysTick->LOAD = ticks - 1;
    SysTick->VAL = 0;

    // 启用滴答定时器,并等待定时器计数完成
    SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
    while(!(SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk));

    // 关闭滴答定时器
    SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

//void delay_us(uint32_t us)
//{
// uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us);
// while (delay--)
//	{
//	;
//	}
//}
#define DLY_TIM_Handle  (&htim16)
TIM_HandleTypeDef htim16;
/* TIM16 init function */
void MX_TIM16_Init(void)
{

    /* USER CODE BEGIN TIM16_Init 0 */

    /* USER CODE END TIM16_Init 0 */
    __HAL_RCC_TIM16_CLK_ENABLE();

    /* USER CODE BEGIN TIM16_Init 1 */

    /* USER CODE END TIM16_Init 1 */
    htim16.Instance = TIM16;
    htim16.Init.Prescaler = 24000 - 1; //24000000/24000=1000
    htim16.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim16.Init.Period = 65535;
    htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim16.Init.RepetitionCounter = 0;
    htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
    if(HAL_TIM_Base_Init(&htim16) != HAL_OK) {
        Error_Handler();
    }


    /* USER CODE BEGIN TIM16_Init 2 */

    /* USER CODE END TIM16_Init 2 */


}

void delay_ms(uint16_t nus)
{
    __HAL_TIM_SET_COUNTER(DLY_TIM_Handle, 0);
    __HAL_TIM_ENABLE(DLY_TIM_Handle);
    while(__HAL_TIM_GET_COUNTER(DLY_TIM_Handle) < nus) {
    }
    __HAL_TIM_DISABLE(DLY_TIM_Handle);
}


/* Private macro -------------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/


/**
  * @brief  应用程序入口函数.
  * @retval int
  */
int main(void)
{
    /* 初始化所有外设,Flash接口,SysTick */
    HAL_Init();
    APP_SystemClockConfig(RCC_HSICALIBRATION_24MHz);
	
    /* 初始化GPIO */
    MX_GPIO_Init();
     MX_USART_UART_Init();//串口:PA2 PA3
    // __HAL_RCC_TIM16_CLK_ENABLE();
    MX_TIM16_Init();
			 uint32_t Sysclock = HAL_RCC_GetSysClockFreq()  ;
	printf("Sysclock:%d \r\n",Sysclock);
    while(1) {
        /* LED翻转 */
			switch(Sysclock)
			{
				case CPU_8MHZ:
						 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_1); break;
				case CPU_16MHZ:  
					HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);break;
				case CPU_24MHZ:
					 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);break;
				case CPU_48MHZ:
					HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3);break;
				default :break;
			}
			printf("Sysclock:%d \r\n",Sysclock);
        delay_ms(1000);
//			HAL_Delay(1000) ;
        //	__NOP();
        /* 延时250ms */
        // Hal_delay_us(250);
        // HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
        // Hal_delay_us(250);
        // HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_3);
        // Hal_delay_us(250);
        // printf("Hello world2 \n");
    }
}


/**
  * @brief   配置系统时钟
  * @param   HSICLKSource_SET:选择HSI时钟频率
  *            @arg @ref RCC_HSICALIBRATION_8MHz:8M时钟
  *            @arg @ref RCC_HSICALIBRATION_16MHz:16M时钟
  *            @arg @ref RCC_HSICALIBRATION_22p12MHz:22.12M时钟
  *            @arg @ref RCC_HSICALIBRATION_24MHz:24M时钟
  * @retval  无
  */

static void APP_SystemClockConfig(uint32_t HSICLKSource_SET)
{
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    RCC_OscInitStruct.OscillatorType =  RCC_OSCILLATORTYPE_HSI | RCC_OSCILLATORTYPE_LSI ; /* 配置HSE、HSI、LSI、LSE */
    RCC_OscInitStruct.HSIState = RCC_HSI_ON; /* 开启内部高速时钟HSI */
//    RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV1; /* HSI不分频 HSIDIV*/
    RCC_OscInitStruct.HSICalibrationValue = HSICLKSource_SET; /* HSI校准频率8MHz */
//    RCC_OscInitStruct.HSEState = RCC_HSE_OFF; /* 关闭HSE */
//		RCC_OscInitStruct.HSEFreq = RCC_HSE_16_32MHz; /* HSE频率范围16~32MHz */
//		RCC_OscInitStruct.LSIState = RCC_LSI_ON; /*开启内部低速时钟 关闭LSI:RCC_LSI_OFF */
    /* RCC_OscInitStruct.LSEDriver = RCC_LSEDRIVE_MEDIUM; */ /* 默认LSE驱动能力 */
		
		RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; /* 开启PLL 关闭PLL:RCC_PLL_OFF*/
//		RCC_OscInitStruct.PLL.PLLSource =RCC_PLLSOURCE_HSI; //RCC_PLLSOURCE_HSI   RCC_PLLSOURCE_NONE
	RCC_OscInitStruct.PLL.PLLSource =RCC_PLLSOURCE_HSI;/* PLL内部时钟源 RCC_PLLSOURCE_NONE*/
		
		
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

    /* 配置振荡器 */
    if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
        Error_Handler();
    }

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;/* 配置SYSCLK、HCLK、PCLK */
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; /* 配置系统时钟为HSI RCC_SYSCLKSOURCE_PLLCLK RCC_SYSCLKSOURCE_HSI*/
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; /* AHB时钟不分频 */
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; /* APB时钟不分频 */
    /* 配置时钟源 */
    if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {  //=48MHz LATENCY=1
//系统时钟周期
        Error_Handler();
    }
}

/**
  * @brief  错误执行函数
  * @param  无
  * @retval 无
  */
void Error_Handler(void)
{
    while(1) {
    }
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  输出产生断言错误的源文件名及行号
  * @param  file:源文件名指针
  * @param  line:发生断言错误的行号
  * @retval 无
  */
void assert_failed(uint8_t* file, uint32_t line)
{
    /* 用户可以根据需要添加自己的打印信息,
       例如: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
    /* 无限循环 */
    while(1) {
    }
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT AirM2M *****END OF FILE******************/

在这里插入图片描述

📚测试工程

链接:https://pan.baidu.com/s/1ygHz3s5aDP4gZl1r1JgnzA?pwd=zi2g 
提取码:zi2g

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04 ssh终端登录后未自动执行.bashrc

sudo vim ~/.profile输入以下内容 if [ -n "$BASH_VERSION" ]; then if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi 执行 source ~/.profile重新测试 其他答案 如果你的~/.bashrc文件在Ubuntu中没有自动生效&#xff0c;…

Tomcat 学习之 Filter 过滤器

目录 1 Filter 介绍 2 Filter 的生命周期 3 Filter 和 FilterChain 4 Filter 拦截过程 5 FilterConfig 6 Filter 使用 1 Filter 介绍 在 Tomcat 中&#xff0c;Filter 是一种用于拦截请求和过滤响应的组件&#xff0c;可以在请求到达 Servlet 之前或响应离开 Servlet 之后…

第15章-IP子网划分

1. 子网划分的需求 1.1 早期的IP地址分类 1.2 产生的问题 1.3 现实的应用场景 2. IP子网划分基础知识 2.1 概念 2.2 子网掩码 3. IP子网划分相关计算 3.1 概述 4. VLSM和CIDR 4.1 VLSM(可变长子网掩码)小 → 大&#xff1b; 4.2 CIDR(无类域间路由)大 → 小&#xff1b; 5.…

Syntax Error: Error: Cannot find module ‘node-sass‘报错解决

1.将项目中的node_modules删除掉 2.npm install重新运行安装命令 3.再npm run serve&#xff08;项目启动命令&#xff09;启动项目即可

LeetCode第二题: 两数相加

文章目录 题目描述示例 解题思路 - 迭代法Go语言实现 - 迭代法算法分析 解题思路 - 模拟法Go语言实现 - 模拟法算法分析 解题思路 - 优化模拟法主要方法其他方法的考虑 ‍ 题目描述 给出两个非空的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照逆序的方…

DALL·E 3:Improving Image Generation with Better Captions

论文链接&#xff1a;https://cdn.openai.com/papers/dall-e-3.pdf DALLE3 API&#xff1a;https://github.com/Agora-X/Dalle3 官网链接&#xff1a;添加链接描述 DALLE3讲解视频&#xff1a;B站视频 推荐DALLE2的讲解视频&#xff1a;B站&#xff1a;跟李沐学AI 之前精讲的DA…

【Leetcode】235. 二叉搜索树的最近公共祖先

文章目录 题目思路代码结果 题目 题目链接 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度…

Linux的文件操作,重拳出击( ̄︶ ̄)

Linux的文件操作 学习Linux的文件操作&#xff0c;一般需要知道一个文件如果你想要操作他&#xff0c;必须知道你对这个文件有什么操作的权限或者修改你自己对文件操作的权限。必须要知道文件有三种权限 r&#xff1a;可读 w&#xff1a;可写 x&#xff1a;可执行 在打开Linux…

【cmu15445c++入门】(10)C++锁mutex

一、锁 lock和unlock 二、 代码 // This program shows a small example of the usage of std::mutex. The // std::mutex class provides the mutex synchronization primitive. // std::mutex 类提供互斥同步原语。// Includes std::cout (printing) for demo purposes. #i…

超详细的MyCat安装部署

MyCat概述 介绍 Mycat是开源的、活跃的、基于Java语言编写的MySQL数据库中间件。可以像使用mysql一样来使用 mycat&#xff0c;对于开发人员来说根本感觉不到mycat的存在。 开发人员只需要连接MyCat即可&#xff0c;而具体底层用到几台数据库&#xff0c;每一台数据库服务器里…

预测性维修系统的功能分析和建设建议

随着工业领域的不断发展&#xff0c;设备状态监测、健康管理和智能诊断变得愈发重要。预测性维修系统通过先进的技术和可靠性评估&#xff0c;帮助企业判断设备状态&#xff0c;识别故障早期征兆&#xff0c;并生成故障预判&#xff0c;从而提出检维修建议。在这一背景下&#…

【前端素材】推荐优质后台管理系统Be admin平台模板(附源码)

一、需求分析 后台管理系统&#xff08;或称作管理后台、管理系统、后台管理平台&#xff09;是一种专门用于管理网站、应用程序或系统后台运营的软件系统。它通常由一系列功能模块组成&#xff0c;为管理员提供了管理、监控和控制网站或应用程序的各个方面的工具和界面。以下…

前端面试篇-JS篇2

37、事件模型(事件代理)(重要) 是指从事件发生开始,到所有处理函数执行完,所经历的过程。大概包括: 3个阶段 1)捕获阶段: 首先 Window 捕获事件,之后往目标传递,在到达目标节点之前的过程,就是捕获阶段(Capture Phase) 2)目标阶段: 真正触发点击的元素,事件会触发…

天哪!还有这些逆天的fofa​语句?(二)

接上文 天哪&#xff01;还有这些逆天的fofa语句&#xff1f; 再分享几条&#xff0c;个人觉得比较有意思的fofa语句。 情侣飞行器 之前写过文章的&#xff0c;有兴趣的师傅可以试着翻翻以前的文章去破解密码 fofa语句&#xff1a;"static/js/index.d2dcdf5b.js"…

88. 合并两个有序数组——javascript实现

给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff1a;最终&#xff0c;合并后数组…

Spring Bean 相关注解

目录 Autowired Component,Repository,Service, Controller RestController Scope Configuration Autowired 自动导入对象到类中&#xff0c;被注入进的类同样要被 Spring 容器管理比如&#xff1a;Service 类注入到 Controller 类中。 Service public class UserService …

vite搭配vue2创建工程

一、安装vite npm init vite2.8.0 vite默认支持的是vue3&#xff0c; 这里选择框架和版本vanilla&#xff0c; 方便以后自己安装vue2. 二、修改package.json 默认生成的pacakage.json文件 {"name": "vite-project","private": true,"v…

lv20 QT入门与基础控件 1

1 QT简介 QT是挪威Trolltech开发的多平台C图形用户界面应用程序框架 典型应用 2 工程搭建 2.1 新建ui工程 不要写中文路径 2.1 不勾选UI&#xff08;主讲&#xff09; 3 QT信号与槽机制 语法&#xff1a;Connect&#xff08;A, SIGNLA(aaa()), B, SLOT(bbb())&#xff09;…

操作系统--零拷贝

一、直接内存访问&#xff08;DMA&#xff09;技术 什么是 DMA 技术&#xff1f;简单理解就是&#xff0c;在进行 I/O 设备和内存的数据传输的时候&#xff0c;数据搬运的工作全部交给 DMA 控制器&#xff0c;而 CPU 不再参与任何与数据搬运相关的事情&#xff0c;这样 CPU 就…

【数据结构】栈OJ题《用栈实现队列》(题库+解析+代码)

1. 前言 通过前面栈的实现和详解大家对队列应该有一定熟悉了&#xff0c;现在上强度开始做题吧 栈详解&#xff1a;http://t.csdnimg.cn/9Fsbs 本体的做题思路也可以参考上一篇文章&#xff0c;就是有一点点不同。 用队列实现栈&#xff1a;http://t.csdnimg.cn/V2qjW 2. …