【嵌入式学习笔记】嵌入式基础11——STM32常用轮子(SYSTEM)

news2024/11/16 21:35:07

1.deley文件夹介绍

1.1.delay文件夹介绍

函数名函数功能OS
delay_osschedlockus级延时时,关闭任务调度(防止打断us级延迟)OS
delay_osschedunlockus级延时时,恢复任务调度OS
delay_ostimedlyus级延时时,恢复任务调度OS
SysTick_Handlersystick中断服务函数OS
delay_init初始化延迟函数OS/no OS
delay_us延时nusOS/no OS
delay_ms延时musOS/no OS

1.2.SysTick工作原理

SysTick,即系统滴答定时器,包含在M3/4/7内核里面,核心是一个24位的递减计数器

每次VAL到0时,VAL自动从LOAD重载!开始新一轮递减计数。
在这里插入图片描述

1.3.SysTick寄存器介绍

  • SysTick控制及状态寄存器(CTRL)
    在这里插入图片描述

  • SysTick重装载数值寄存器(LOAD)
    在这里插入图片描述

  • SysTick当前数值寄存器(VAL)
    在这里插入图片描述

1.4.关键程序

SysTick的时钟源自HCLK,假设配置系统时钟为72MHZ,经过分频器8分频后,那么SysTick 的时钟即为9Mhz,也就是SysTick 的计数器VAL每减1,就代表时间过了1/9us 。

此外,HAL库也提供了HAL_Delay()函数,但是误差较大,不建议使用。在HAL_Init()函数虽然做了SysTick的初始化,但是在delay_init()函数中又做了初始化,覆盖了之前的初始化。

  • delay_init()函数
void delay_init(uint16_t sysclk) 
{ 
	SysTick->CTRL = 0; 
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8); 
	g_fac_us = sysclk / 8; 
}
  • delay_us()函数
void delay_us(uint32_t nus) 
{ 
	uint32_t temp; 
	SysTick->LOAD = nus * g_fac_us; 	/* 时间加载 */ 
	SysTick->VAL = 0x00; 				/* 清空计数器 */ 
	SysTick->CTRL |= 1 << 0 ; 			/* 开始倒数 */ 
	do 
	{ 
		temp = SysTick->CTRL; 
	} while ((temp & 0x01) && !(temp & (1 << 16))); /* CTRL.ENABLE位必须为1, 并等待时间到达 */

 
	SysTick->CTRL &= ~(1 << 0) ; 		/* 关闭SYSTICK */ 
	SysTick->VAL = 0X00; 				/* 清空计数器 */ 
}
  • delay_ms()函数
void delay_ms(uint16_t nms) 
{ 
	uint32_t repeat = nms / 1000;		/* 这里用1000,是考虑到可能有超频应用, 
							    	 	* 比如128Mhz的时候, delay_us最大只能延时1048576us
								 		*/ 
	uint32_t remain = nms % 1000; 
	while (repeat) 
	{ 
		delay_us(1000 * 1000); 			/* 利用delay_us 实现 1000ms 延时 */ 
		repeat--; 
	} 
	if (remain) 
	{ 
		delay_us(remain * 1000); 		/* 利用delay_us, 把尾数延时(remain ms)给做了 */ 
	} 
}

2.sys文件夹介绍

在这里插入图片描述

3.usart文件夹介绍

3.1.printf函数输出流程

在这里插入图片描述

3.2.printf的使用

  1. printf(“字符串\r\n”)
printf("Hello World!\r\n");
  1. printf(“输出控制符”,输出参数)
uint32_t  temp = 10;
printf("%d\r\n", temp);          /* %d是输出控制符,temp是输出参数 */
  1. printf(“输出控制符1输出控制符2…”,输出参数1,输出参数2,…)
uint32_t  temp1 = 5;   
uint32_t  temp2 = 10;
printf("%d%x \r \n", temp1,temp2); 
  1. printf(“非输出控制符 输出控制符 非输出控制符”,输出参数);
uint32_t  temp = 10;   
printf("temp=  %d  收到over\r\n", temp);  
  1. 如何输出%、\和双引号
printf("%% \r\n");
printf("\\\r\n");
printf("\"\"\r\n");

3.3.printf函数支持

  • 半主机模式:用于 ARM 目标的一种机制,可将来自应用程序代码的输入/输出请求传送至运行调试器的主机,就是通过仿真器实现开发板在电脑上的输入和输出,一般我们不使用半主机模式。

  • 避免半主机模式方法1:微库法
    在魔术棒->Target选项卡,勾选:Use Micro LIB,即可避免半主机模式。
    在这里插入图片描述

  • 避免半主机模式方法2:代码法(详见usatr.c)
    1,#pragma import(__use_no_semihosting),确保不从C库中使用半主机函数
    2,定义:__FILE结构体,避免HAL库某些情况下报错
    3,定义: FILE __stdout,避免编译报错
    4,实现:_ttywrch、_sys_exit和_sys_command_string等三个函数
    AC5和AC6不使用半主机模式稍有差异,详见源码。

在这里插入图片描述

3.4.实现fputc函数的重定向

代码如下:

#define USART_UX                            USART1
/* MDK下需要重定义fputc函数, printf函数最终会通过调用fputc输出字符串到串口 */
int fputc(int ch, FILE *f)
{
    while ((USART_UX->SR & 0X40) == 0);     /* 等待上一个字符发送完成 */

    USART_UX->DR = (uint8_t)ch;             /* 将要发送的字符 ch 写入到DR寄存器 */
    return ch;
}

注意:while语句不可以屏蔽,否则会出现乱码的情况。

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

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

相关文章

MySQL服务无法启动,服务没有报告任何错误

MySQL服务无法启动&#xff0c;服务没有报告任何错误 昨天mysql服务还好好的&#xff0c;今天怎么都打不开。my.ini配置和端口都没有问题&#xff0c;只能备份一下data的数据&#xff0c;删除data文件夹&#xff0c;初始化mysqld。 一定要备份data数据&#xff01;&#xff01;…

【算法和数据结构】257、LeetCode二叉树的所有路径

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;首先看这道题的输出结果&#xff0c;是前序遍历。然后需要找到从根节点到叶子节点的所有路径&#xff…

苍穹外卖-day06

苍穹外卖-day06 本项目学自黑马程序员的《苍穹外卖》项目&#xff0c;是瑞吉外卖的Plus版本 功能更多&#xff0c;更加丰富。 结合资料&#xff0c;和自己对学习过程中的一些看法和问题解决情况上传课件笔记 视频&#xff1a;https://www.bilibili.com/video/BV1TP411v7v6/?sp…

什么是 HTTP 长轮询?

什么是 HTTP 长轮询&#xff1f; Web 应用程序最初是围绕客户端/服务器模型开发的&#xff0c;其中 Web 客户端始终是事务的发起者&#xff0c;向服务器请求数据。因此&#xff0c;没有任何机制可以让服务器在没有客户端先发出请求的情况下独立地向客户端发送或推送数据。 为…

【java的类型数据】——八大类型数据

文章目录 前言字面常量字面常量的分类: 数据类型和变量变量的包装类和范围范围整型变量byteintshortlong 浮点型变量双精度浮点型double单精度浮点型float 字符型变量char布尔型变量 boolean 类型转换自动类型转换&#xff08;隐式&#xff09;强制类型转换&#xff08;显式&am…

tinkerCAD案例:20. Simple Button 简单按钮和骰子

文章目录 tinkerCAD案例&#xff1a;20. Simple Button 简单按钮Make a Trick Die tinkerCAD案例&#xff1a;20. Simple Button 简单按钮 Project Overview: 项目概况&#xff1a; This is a series of fun beginner level lessons to hone your awesome Tinkercad skills a…

8.docker仓库

文章目录 Docker仓库本地私有仓库Docker HarborDocker harbor部署访问页面创建用户下载私有仓库镜像harbor同步 Docker仓库 本地私有仓库 ##先下载 registry 镜像docker pull registry##修改配置文件&#xff0c;在 daemon.json 文件中添加私有镜像仓库地址vim /etc/dock…

第三节 C++ 运算符

文章目录 掌握知识点1. 运算符概述1.1 算术运算符1.1.1 加&#xff0c;减&#xff0c;乘&#xff0c;除1.1.2 自增&#xff0c;自减1.1.3 取模运算 % 1.2 赋值运算符1.3 比较运算符1.4 逻辑运算符 2. 编程题&#xff1a;运算符使用2.1 计算器2.2 位数分离2.3 鸡兔同笼问题 掌握…

重学C++系列之智能指针简单介绍

一、什么是智能指针 在使用堆内存时&#xff0c;就像使用栈内存空间一样&#xff0c;可以实现自释放的功能&#xff0c;智能指针在C库中也是类模板之一。 二、智能指针有几种 有四种。auto_ptr, unique_ptr, shared_ptr, weak_ptr 其中后三个是C11支持&#xff0c;第一个已经被…

递归:一个图教学会递归原理

递归的特点 实际上&#xff0c;递归有两个显著的特征,终止条件和自身调用: 自身调用&#xff1a;原问题可以分解为子问题&#xff0c;子问题和原问题的求解方法是一致的&#xff0c;即都是调用自身的同一个函数。终止条件&#xff1a;递归必须有一个终止的条件&#xff0c;即不…

软考A计划-系统集成项目管理工程师-项目人力资源管理-上

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

百度与AI:历史、投资和监管

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 百度的人工智能在中国具有先发优势 随着ChatGPT的爆火&#xff0c;人工智能重新引起了投资者的注意&#xff0c;然而人工智能并不是突然爆火的&#xff0c;而是全球众多公司在人工智能技术上进行数十年如一日的研发和积累&a…

Vite创建Vue+TS项目引入文件路径报错

使用vite搭建vue3脚手架的时候&#xff0c;发现main.ts中引入App.vue编辑器会报错&#xff0c;但是不影响代码运行。 报错信息&#xff1a;TS2307: Cannot find module ‘./App.vue’ or its corresponding type declarations. 翻译过来是找不到模块或者相关的声明类型&#…

发现问题:edge浏览器的效率模式会导致setTimeout/setInterval变慢

问题描述 当edge浏览器启用效率模式后&#xff0c;setTimeout/setInterval运行一段时间后&#xff0c;执行间隔会变慢。 开启后&#xff1a; 关闭效率模式&#xff1a;

pspice导入元件Orcad spice模型

想要使用英飞凌一款驱动芯片&#xff0c;型号&#xff1a;1EDN7550U&#xff0c;在贸泽等各大网站上都没有找到改元件的spice仿真模型&#xff0c;经过一番摸索&#xff0c;终于找到了。 1、首先去芯片官网上查找该元件&#xff1b;找到该元件的spice模型 2、下载下来&#xff…

第十一章:deque类

系列文章目录 文章目录 系列文章目录前言deque的介绍deque的使用deque的缺陷deque的应用总结 前言 deque是一种双开口的“连续空间”的容器。 deque的介绍 deque(双端队列)&#xff1a;是一种双开口的"连续"空间的数据结构&#xff0c;双开口的含义是&#xff1a;可…

消息中间件RabbitMQ——学习笔记

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

前端文件上传实践与后端处理——文件分块上传

文件上传是现代Web应用程序中常见的功能之一。在这篇博客中&#xff0c;我们将探讨一个简单但完整的前端文件上传实践&#xff0c;同时提供一个后端示例&#xff0c;演示如何处理上传的文件。我们将使用JavaScript作为前端语言&#xff0c;并结合Node.js作为后端环境。让我们开…

Jekins权限管理,给不同用户分配不同项目的权限【一些小细节真要注意】

首先进入jekins的系统管理界面&#xff1a; 一、插件安装 如果没有安装权限管理的插件&#xff0c;需要安装一个插件&#xff0c;插件的名字叫Role-based Authorization Strategy&#xff0c;进入插件管理中&#xff0c;选中这个插件&#xff0c;点击下面的安装就好了&#x…

java-day01(基本常识,环境搭建,注释,HelloWorld)

一&#xff1a;基础常识 软件&#xff1a;按照特定顺序的计算机数据与指令的集合。可分为系统软件&#xff08;如操作系统&#xff09;和应用软件&#xff08;如QQ&#xff09; 人机交互方式&#xff1a;图形化界面&#xff08;GUI&#xff09;与命令行&#xff08;CLI&#…