STM32杂项

news2024/11/19 18:32:07

STM32杂项

  • 1.启动过程
  • 2.中断
  • 3.GPIO
  • 4.Systick
  • 5.串口printf
  • 6.独立看门狗

记录单片机在工作中遇到的问题和特殊情况。

1.启动过程

M3/M4/M7内核复位后,做的第一件事:
1.从地址0x0000 0000处取出堆栈指针MSP的初始值,该值就是栈顶地址
2.从地址0x0000 0004处取出程序计数器PC的初始值,该值是复位向量
在这里插入图片描述
在系统复位后,SYSCLK的第4个上升沿,BOOT引脚的值将被锁存。
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0efe7cdbc8fa485aa1195fb8272fa5a5.png

2.中断

NVIC-管理中断;
EXTI-外部中断控制器;
中断:打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行。
中断向量表:
定义一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址。
中断向量表定义在启动文件,当发生中断,CPU会自动执行对应的中断服务函数。
NVIC相关寄存器:
在这里插入图片描述
抢占优先级(pre):高优先级可以打断正在执行的低抢占优先级中断。
响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但不能相互打断。
抢占和响应都相同的情况下,自然优先级越高的,先执行。
自然优先级:中断向量表中的优先级。
数字越小,表示优先级越高。
分组:

优先级分组分配结果
00位抢占优先级,4位响应优先级
11位抢占优先级,3位响应优先级
22位抢占优先级,2位响应优先级
33位抢占优先级,1位响应优先级
44位抢占优先级,0位响应优先级

一个工程中,一般只设置一次中断优先级分组。多次的话,以最后一次为准。

3.GPIO

工作电压范围:2V<VDD<3.6V。
识别电压范围:
低电压:-0.3V<V<1.164V。
高电压:1.833V<V<3.6V。
输出电流:单个IO,最大25MA。
类型:电源引脚,晶振引脚,复位引脚,下载引脚,BOOT引脚,GPIO引脚。

4.Systick

systick:系统滴答定时器,包含在M3/M4/M7内核里面,核心是一个24位的递减计数器。
在这里插入图片描述72mhz经过分频器(CLKSOURCE),每来一个时钟,VAL自动减1,当VAL减到0时,COUNTFLAG变成1(可以判断这位是否为1,来判断是否到达延时时间,退出等待),并且LOAD的值自动赋给VAL重新开始计时。
其中VAL和LOAD的值为2的24次方(0~16777215)。
delay_init() 初始化系统滴答定时器
以下是不同的几种延时函数的写法:

/*
第一种写法:不需要进行延时初始化,每执行一遍Delay_us()
相当于配置一遍滴答定时器,等待COUNTFLAG变成1。当不在调
用延时函数时停止滴答定时器。
*/
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值 2的24次方 16777216
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
}
/*第二种写法:需要进行延时的初始化,在初始化的时候配置滴答定时器
过多长时间进行一次中断(通常为1ms),此后不在配置。定义一个系统时间,
在定时器中断里进行加一。需要进行延时处理的时候,在延时函数里定义一
个新的变量,并将系统时间和需要延时的时间相加赋给这个变量,然后等待
系统时间等于这个变量。
*/

vu32 System_Time = 0;//系统时间
void SysTick_Handler(void)
{
	System_Time++;//1ms自加一次
}

void delay_ms(uint32_t time)
{
	uint32_t tick = System_Time + time;
	while(System_Time < tick)  //等待系统时间等于tick
	{}
}

//系统定时器的初始化
//想要1ms来一次中断
//参数:重装载值
void SysTick_Init(uint32_t reload)
{
	if(SysTick_Config(reload))
	{
		while(1);
	}
}
void delay_us(uint32_t time)
{
	while(time--)
		delay_1us();
}

while(1)
{
//延时初始化 1ms
	SysTick_Init(72000); 
}
/*
由于这个延时时间是以ms为单位的,需要us延时时可以加入汇编中
的——NOP()命令进行空等待。
*/
#define delay_1us()	{\
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\
__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();\
__NOP();__NOP();\
}
/*延迟初始化函数,实际是调用了SysTick_Config()函数,
这个函数为标准库中函数库 */
static __INLINE uint32_t SysTick_Config(uint32_t ticks)
{ 
//判断自动重装值是否超过界限。
  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            
//设置自动重装值                                                            
  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;     
//设置滴答定时器中断
  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  
//将VAL清零
  SysTick->VAL   = 0;                                        
//配置CTRL 1分频,打开中断,开滴答定时器
  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
                   SysTick_CTRL_TICKINT_Msk   | 
                   SysTick_CTRL_ENABLE_Msk;                    
  return (0);                                                  
}

5.串口printf

printf函数输出流程:
在这里插入图片描述
我们通过需要输出的硬件来重新定义fputc()函数.

/*
	重定义fputc函数,使printf()函数在打印的过程中,
	也将数据通过串口进行输出
*/
int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);			//将printf的底层重定向到自己的发送字节函数
	return ch;
}

//	其他串口使用printf()
/*
	方法一: 定义一个数组,使用sprintf()函数进行中转一下
		   再用该串口发送字符串的函数进行发送。
*/
char string[100];
sprintf(string,"num=%d\r\n",555);
serial_sendstring(string);

/*
  方法二:封装sprintf()
*/
void Serial_Printf(char *format, ...)
{
	char String[100];				//定义字符数组
	va_list arg;					//定义可变参数列表数据类型的变量arg
	va_start(arg, format);			//从format开始,接收参数列表到arg变量
	vsprintf(String, format, arg);	//使用vsprintf打印格式化字符串和参数列表到字符数组中
	va_end(arg);					//结束变量arg
	Serial_SendString(String);		//其他串口发送字符数组(字符串)
}

6.独立看门狗

IWDG:独立看门狗
本质:可以产生系统复位信号的计数器。
特点:时钟为低速时钟LSI(40kHZ)由独立的RC振荡器提供(可在停止和待机模式下运行)
看门狗被激活后,当递减计数器计数到0x000时,产生系统复位。
喂狗:在计数器计数到0之前要进行喂狗,防止系统一直被复位。
在这里插入图片描述

	/*IWDG初始化*/
	//独立看门狗的时钟为40khz 低速时钟LSI驱动
void IWDG_init()	
{	
	//独立看门狗写使能
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);	
	//设置预分频为16
	IWDG_SetPrescaler(IWDG_Prescaler_16);
	/设置重装值为2499,独立看门狗的超时时间为1000ms 范围0~4095			
	IWDG_SetReload(2499);	
	//重装计数器,喂狗						
	IWDG_ReloadCounter();			
	//独立看门狗使能				
	IWDG_Enable();									
}

7.不定时跟新…

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

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

相关文章

2024必备中英互译利器全知道

现在英语目前还是学习最广泛的第二语言&#xff0c;所以很多资料都有英文的版本。如果外语不好&#xff0c;那中英互译翻译工具就能帮我们解决这个问题。今天我们一起来探讨下有哪些好用的翻译工具。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc 这个工具…

【linux】进度条

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;linux笔记仓 目录 01.屏幕缓冲区换行&#xff08;LF, \n&#xff09;和回车&#xff08;CR, \r&#xff09;换行回车在屏幕缓冲区中的作用代码块1&#xff1a;代码块2&#xff1a; 02.进度条优化版…

SpringBoot3+Swagger3(最新版springdoc-openapi教程)

第一步&#xff1a;引入springdoc-openapi依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version></dependency> 第二步&#xff1a; 配置…

打开ffmpeg编码器的时候报错:avcodec_open2()返回-22

[h264_v4l2m2m 0x555555617a00] Could not find a valid device [h264_v4l2m2m 0x555555617a00] cant configure encoder 前言&#xff1a;先做一个操作&#xff0c;查找编码器的时候&#xff0c;使用名字查找的方式&#xff1a; const AVCodec *avcodec_find_encoder_by_n…

ubuntu数据硬盘故障导致系统启动失败

背景&#xff1a; 系统盘损坏或者/etc/fatab误修改导致开机启动挂载失败系统无法启动 解决方法 重启

BFS 解决最短路径问题, 迷宫中离入口最近的出口,最小基因变化,单词接龙,为高尔夫比赛砍树

文章目录 1926. 迷宫中离入口最近的出口433. 最小基因变化127. 单词接龙675. 为高尔夫比赛砍树 1926. 迷宫中离入口最近的出口 边权为1的最短路径问题 我们要知道上下左右都是可以走的 &#xff08;用队列&#xff09;走过的地方不要在走了&#xff0c;这样会进入死循环&#x…

零信任内网安全访问

随着互联网的持续发展&#xff0c;便捷的共享方式极大地提高了企业的生产力和工作效率&#xff0c;但随之也给企业内网带来了极大的安全隐患。企业内网承载大量的核心资产和机密数据&#xff0c;一旦受到攻击可能会造成大量损失&#xff0c;因此&#xff0c;如何通过零信任内网…

快手一面:给定一棵二叉树,要求将其转换为其镜像?

目录标题 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09;问题描述示例解题思路代码实现详细分析复杂度分析优点注意事项&#x1f495; 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09; 问题描述 给定一棵二叉树&#xff…

探索AI新纪元:揭秘Mammoth库的神秘面纱

文章目录 探索AI新纪元&#xff1a;揭秘Mammoth库的神秘面纱背景&#xff1a;为何选择Mammoth&#xff1f;简介&#xff1a;Mammoth是什么&#xff1f;安装&#xff1a;如何获取Mammoth&#xff1f;使用&#xff1a;Mammoth的基本函数场景应用&#xff1a;Mammoth在实际中的运用…

基于Python大数据的B站热门视频的数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

宠物空气净化器和普通的空气净化器有区别吗?哪款能吸猫毛

这不是国庆节要来了吗&#xff0c;想着假期变多了可以多陪一下自家的小猫咪&#xff0c;但是也怕猫咪的毛发太多让我产生退缩的念头。 刚开始养的时候&#xff0c;我就知道猫咪是会掉毛的&#xff0c;毕竟猫咪的毛发这么旺盛&#xff0c;掉毛也是正常的&#xff0c;但是我似乎…

SpringCloud源码:客户端分析(二)- 客户端源码分析

背景 我们继续分析EurekaClient的两个自动化配置类&#xff1a; 自动化配置类功能职责EurekaClientAutoConfiguration配置EurekaClient确保了Eureka客户端能够正确地&#xff1a;- 注册到Eureka服务端- 周期性地发送心跳信息来更新服务租约- 下线时通知Eureka服务端- 获取服务实…

Qt网络编程——QUdpSocket

文章目录 Qt网络编程QUdpSocketUdp回显服务器Udp客户端 Qt网络编程 网络编程本质上是写应用层代码&#xff0c;需要传输层提供支持。 而传输层最核心的协议就是UDP和TCP&#xff0c;这两个协议有较大差别&#xff0c;所以Qt提供了两套API。 要是有Qt网络编程的API&#xff0…

9.23-9.25学习

前置知识 docker&#xff1a;Docker-CSDN博客 docker安装mysql和 redis&#xff1a;https://blog.csdn.net/weixin_73118927/article/details/142530243?fromshareblogdetail&sharetypeblogdetail&sharerId142530243&sharereferPC&sharesourceweixin_7311892…

从预测性维护到智能物流:ARM边缘计算控制器的工业实践

工业4.0时代的到来&#xff0c;边缘计算技术成为连接物理世界与数字世界的桥梁。ARM架构的边缘计算控制器凭借其低功耗、高能效和灵活性等特点&#xff0c;在工业自动化领域展现出巨大潜力。本文将通过几个实际应用案例来探讨ARM边缘计算控制器是如何提升生产线效率和安全性的&…

03DSP学习-利用syscfg配置IO

上一篇博客介绍了syscfg&#xff0c;对syscfg有了初步的了解&#xff0c;但是在真正使用上它之前&#xff0c;还不能理解他是一个神器。 (在写博客的时候&#xff0c;我是在从头到尾重新完成这个步骤&#xff0c;希望对初学者有点帮助) 找到Board Component 打开syscfg文件&…

【Tourism】Yuncheng(4)

文章目录 1、永乐宫&#xff08;AAAA&#xff09;2、寿圣寺3、城隍庙4、池神庙 1、永乐宫&#xff08;AAAA&#xff09; 永乐宫&#xff0c;原名大纯阳万寿宫&#xff0c;位于山西省运城市芮城县以北约三公里处的龙泉村东&#xff0c;是为纪念八仙之一吕洞宾而修建的一座道教宫…

VR虚拟展厅可以在手机上打开吗?

虚拟展厅是可以在手机上打开的。 随着数字技术和虚拟现实技术的不断发展&#xff0c;虚拟展厅已经实现了多平台无缝对接&#xff0c;包括手机、平板、电脑等多种电子设备。具体来说&#xff0c;虚拟展厅通常采用HTML5360全景架构&#xff0c;这种架构使得虚拟展厅不需要安装任…

Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版

CleanMyMac X 4.15.6 for mac中文版下载是一款功能更加强大的系统优化清理工具&#xff0c;软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。CleanMyMac X 4.15.6 for mac 软件与最新macOS系统更加兼容&#xff0c;流畅地…

2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU

1.配置时间2024/9/25 2.Anaconda-python版本3.7&#xff0c;yolox版本0.2.0 YOLOX网址: https://github.com/Megvii-BaseDetection/YOLOX 本人下载的这个版本 1.创建虚拟环境 conda create -n yolox37 python37 激活 conda activate yolox37 2.安装Pytorch cuda等&…