STM32学习记录(1)

学习记录

下面是本人的学习记录,有错误的地方欢迎大家评论区提出来。


1.同时控制同个端口的多个LED,在初始化的时候,使用或运算符"|",就不用再cv一份代码进行初始化了。

2.LED,发光二极管
二极管:压降,经过自己的时侯电压会自动降低额定的伏数,0.3V或0.7v,
电流不能大于10mA,
限流电阻最小值=( 3300-300)/10 = 300欧姆。

3.引脚悬空
答:那么电阻约等于无限大,且静电积累会造成影响,导致引脚损坏。

4.按键设计的时候,为什么要加一个上拉电阻呢?而且电阻阻值设置为10K?
答:给单片机输入一个确定的电平,不加上拉电阻,单片机的输入电压没有一个参考对象,无法准确地判断为高电平还是低电平。接地,地为参考对象,则为低电平,接VCC,有个上拉电阻,上拉电阻为参考对象,为高电平。同时,也增加了抗干扰能力。

5.推挽输出作用
答:提高驱动电流。

6.上拉电阻设置为多大合适呢?
答:其实330/470/510/1K/2K /3K3/4KT/10K都是没有问题的。
但是电阻值越小,其功耗会增加,例如330欧,通过的电流则是10mA,如果是电池进行供电,那么其损耗就太大了,影响续航能力。但是电阻也不是越大越好,否则识别不了电流,所以选择一个折衷的方案,也可以说是一个经验值。
设置为10K,3.3V/10K=0.33mA。
弱上拉用10K,强一些用4.7K的。
5V一般用10K,3.3用4.7多一点。

总结:上拉电阻的选择,上拉电阻选择越大,功耗越低,但是要保证通过的电流能驱动外设和IO口,上拉电阻选择越小,功耗越大,但是要保证当为低电平时,io口端的电压要在低电平的电压值的范围之内, 经验值为4.7k到10k之间。

7.TTL识别电平如下图所示
在这里插入图片描述

8.芯片外部晶振大小
32.768KHz:看时钟树的框图可知,是提供给芯片内部RTC时钟的,32768刚好被256和128分频,得到1HZ,2的15次幂,即1S的定时。
8MHz:连接到芯片内部的锁相环回路,进行倍频,提供给CPU。

需要注意使得是:挂载在不同总线的最高频率是不一样的,例如STM32F407,CPU最高168MHz。
APB1,高性能外围设备总线1,最高42Mhz;
APB2,高性能外围设备总线2,最高84Mhz;
中间有个分频器,用来降低频率,具体数值从时钟树进行查看。

扫描二维码关注公众号,回复: 12923513 查看本文章

9.如何查看外设挂载在哪条总线上面
答:具体从stm32f4xx_rcc.h头文件进行查看外设是哪条总线的。

10.MCO1和MCO2是什么?
答:控制时钟输出,即也可以提供给外部输出时钟。

11.main函数之前,还有其他函数需要先运行吗?
答:系统初始化函数,在启动文件中可以看到,SystemInit。
里面主要是配置PLL,有个SetSysClock()函数。

12.关于配置PLL
答:在数据手册的RCC——PLL内容,有计算公式,使用外部时钟的时候,如果使用外部晶振,那么要注意好参数因子M/N/P/Q的取值,例如在STM32F407的头文件stm32f4xx.h中,所设置的HSE为25M,而开发板提供的一般是8M,此时就要进行修改了,ctrl+f查找到25000000的,修改为8000000,想要输出想要的数值具体得看参数因子的设置 是否正确,只要涉及到倍频,就会有计算公式。

分割线

继续
13.volatile关键字
volatile关键字分析,往往应用在三种场合
1)多线程编程共享全局变量的时候,该全局变量要加上volatile进行修饰,让编译器不要优化该变量
2)裸机编程的时候,某函数与中断服务函数共享全局变量的时候,该全局变量要加上volatile进行修饰,让编译器不要优化该变量。
3)ARM定义寄存器的时候,寄存器是指向一个地址,要加上volatile进行修饰,让编译器不要优化该变量。

编译器不要优化该变量也就是不对该资源进行保护,让任何程序随时都可以对它修改。

例如,我们在全局变量定义了一个变量a,在main函数中赋值为10,a=10;
又在一个中断服务函数中,设置a=11;那么当执行完中断服务后,a的值还是没有改变,
因为默认对a进行了资源保护,要想在中断服务函数修改a变量的值,必须在声明a变量的时候在前面加上关键字volatile,让变量a可读可写,可以被修改。

14.STM32任何一个GPIO引脚都能够实现外部中断,但是例如如下图所示,PA0~PI0只能选择一个,STM32总共有16条GPIO外部中断线,即可以设置16个GPIO外部中断。所以在初始化GPIO外部中断的时候,还需要配置外部中断线,
EXTI_InitTypeDef EXTI_InitStructure。
在这里插入图片描述
部分图示如下,其中中断优先级分组只设置一次,防止出现混乱的现象。
只要修改中断优先级分组,发现硬件的抢占优先级和响应优先级都是发生变化,导致中断管理紊乱。

在这里插入图片描述
在这里插入图片描述

中断服务函数一般写在stm32f4xx_it.c中,中断向量名称在启动文件中可以找到在这里插入图片描述
最容易忘记的就是在去驱动开头开启系统时钟!!!
在这里插入图片描述

16.抢占优先级与响应优先级区别
1)高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的。
2)抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断。
3)抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行。
4)无论是抢占优先级还是响应优先级,优先级数值越小,就代表优先级越高。

17.调整堆栈的大小
答:在启动文件里面设置,如果栈大小不足,会导致栈溢出,堆比较少使用。
0x4000 也就是16384字节,16384÷1024=16,即16KB, STM32的数据RAM通常是满足需求的。

18.值得一提是的,国外在写底层相关函数的时候,例如sFLASH_LowLevel_Init(void),采用lowlevel来描述。

猜你喜欢

转载自blog.csdn.net/ABCisCOOL/article/details/114984434