Stm32学习之路

更新中......

GPIO口模式理解

输出有推挽输出和开漏输出两种模式,推挽输出可以输出高低电平,开漏输出可以输出低电平和浮空(高阻态),推挽什么意思,当Q1断开Q2接通,电流从外部流到Q2,外部mos管放电,是为挽。当Q2断开Q1接通,电流从VCC流到Q1到外部mos管,外部mos栅极充电,是为推,电流推出去。

开漏模式呢,可以输出低电平和浮空,开漏输出通常配合上拉电阻。

 如上图,如果用推挽,输出5V,可能会烧毁外部被控制的芯片,怎么办呢,用开口输出配上拉电阻即可,如下图。

 当Q2连通,即GPIO输出低电平,EN就是低电平,当Q2断开,即GPIO浮空,则EN被上拉电阻拉至3.3v,不会烧坏芯片。

上拉电阻是啥

电阻一端接电源,就是上拉电阻,电阻不是会消耗电压吗,其实不然,如果上拉电阻阻值足够大,电流就足够小,上拉电阻就几乎不分压,EN就依然是接近3.3V。

漏电流

当mos管接通,如果上拉电阻太小,就会有较大的电流被浪费。

 所以,考虑到分压和漏电流,上拉电阻都是越大越好,但是上拉电阻太大则电流太小,驱动能力就太弱。

驱动能力是啥

一般会有个寄生电容在这里,当EN由低电平向高电平转换,中间并不是跳变,而是爬升,这个爬升就是VCC对寄生电容充电。上拉电阻越大,电流越小,爬升就越慢。将PWM波形或者通信波形放大看,会发现也有个爬升过程,所以,如果是只控制开和关,上拉电阻可以很大(10-100k),如果要快速转换电平比如PWM和通信,上拉电阻就不能太大(1k-10k),否则电平变化就很慢,会导致更大失真。

经常使用的uint_8_t,uint16_t等等是什么意思?

        其实u是代表无符号,无符号,则最高位不表示符号。int表示整形,后面数字表示所占位数。打开stdint.h文件,可以看到,这些uint_t类型都是通过typedef取得别名,为了我们用起来更直观。而且不同平台可能同一个变量类型所占的字节数不同,通过typedef取别名后就1方便多了

每次头文件的#idndef,#define,#endif什么意思

        其实是为了避免重复包含头文件导致的错误,define什么意思呢,宏定义,c语言知识,宏定义作用很多,在stm32里作用主要是使寄存器配置更直观,否则就全是0x0F000000这种,很难明白对应的意思。

 0x0800 0000这种类似格式是什么意思

        由于c语言不支持直接表示二进制,所以一般都用16进制,0x表示16进制。这种格式是为了更方便,比如0x0F080000,二进制表示就是0000 1111 0000 1000 0000 0000 0000 0000,总共32位,为什么是32呢。根据stm32名字就能知道,32表示cpu有32根数据总线,最多可以同时处理32位字符。

        注意,虽然stm32寄存器都是32位,但并不代表每次操作外设寄存器就一定要手动写入32位。有些高位保留或者自动补0.。比如每组GPIO下的部分寄存器,高16位就是保留的,在设置的时候只需要写入低16,剩余的自动补0

字节,字,半字

        字节byte不用多说,等于8个bit位。这是统一标准。字是什么呢,Stm32,寄存器都是32位,所以一个字就是32bit位。半字就是16bit位,比如uint16_t,所占空间就是半字,也是两字节。

逻辑,移位运算

        A | =B。表示A=A | B。C&1=C  C&0=0  C|0=C  C|1=1。D<<3表示D左移3位。

        0x01<<0x02=0x04,表示0x01左移两位,注意,是转为二进制后移动2位,可以看到左移两位结果并不是*16的平方,而是*2的平方。如果直接移为0x0100,就不只是移动了两位,而是移动了2*4=8位

字符集与编码

        这是不一样的,很多的字符编码方案,一个字符集只有唯一一个编码实现,两者是一一对应的。比如 GB2312,这种情况,无论你怎么去称呼它们,比如“GB2312编码”,“GB2312字符集”,说来说去其实都是一个东西,可能它本身就没有特意去做什么区分,所以无论怎么说都不会错。事情到了 Unicode 这里,变得不一样了,唯一的 Unicode 字符集对应了三种编码:UTF-8,UTF-16,UTF-32。如果还是这么笼统地去称呼,就很容易搞混了。

        EXTI_InitTypeDef这种格式一般都是用typedef取别名的结构体类型,里面的变量类型很可能有用typedef取别名的枚举类型(enum),枚举类型不是结构体这样的复合类型。枚举类型就是这种类型的变量取值只能在内部给定值之间选择,不能随意赋值。枚举值默认从 0 开始,往后逐个加 1(递增)

全双工半双工

        全双工双方可以同时发送,一般要两根数据线,比如串口通讯。半双工同一时间只能一方发送,一般一根数据线。比如IIC通信(IIC有时钟线)。

同步和异步

        同步通信:一方发送,另一方应答,否则不进行下一次传输(带时钟同步信号传输)。IIC

        异步通信:一方发送,不考虑另一方是否收到,直接进行下一次传输(不带时钟同步信号)。

assert_param(IS_EXTI_LINE(EXTI_InitStruct->EXTI_Line))这种什么意思

        这是检查给定的参数正确与否,比如EXTI_InitTypeDef结构体内部的EXTI_Line变量的类型就是普通的uint32_t类型,但是我们知道,中短线是不能随意给定值的,这里又不是enum枚举类型,那要如何判断参数正确与否呢?就靠IS_EXTI_LINE,这是一个真假逻辑的宏定义。如果将参数代入计算后结果为真,表示输入参数合法。否则不合法。

 总之IS_A_B这种,就是一些判断参数合不合法的与或逻辑表达式的别名,只有真假,即0和1。

时钟源

众所周知STM32有5个时钟源HSI、HSE、LSI、LSE、PLL,其实他只有四个,因为从上图中可以看到PLL都是由HSI或HSE提供的。

其中,高速时钟(HSE和HSI)提供给芯片主体的主时钟.低速时钟(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及独立看门狗使用,图中可以看出高速时钟也可以提供给RTC。

  内部时钟是在芯片内部RC振荡器产生的,起振较快,所以时钟在芯片刚上电的时候,默认使用内部高速时钟。而外部时钟信号是由外部的晶振输入的,在精度和稳定性上都有很大优势,所以上电之后我们再通过软件配置,转而采用外部时钟信号.

  高速外部时钟(HSE):以外部晶振作时钟源,晶振频率可取范围为4~16MHz,我们一般采用8MHz的晶振。

高速内部时钟(HSI):由内部RC振荡器产生,频率为8MHz,但不稳定。

  低速外部时钟(LSE):以外部晶振作时钟源,主要提供给实时时钟模块,所以一般采用32.768KHz。

  低速内部时钟(LSI):由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz。

RTC时钟是实时时钟,系统备份区域,掉电继续运行,通常用来做日历。

SYSTICK是系统滴答定时器,用来比较精确的计时。比如为操作系统提供心跳(时间片)。

这里要明白一个关系,时钟源,时钟,定时器,之间的关系。系统主时钟SYSCLK的时钟源是两个高速时钟源,而实时时钟RTC的时钟源是两个低速时钟源。SysTick定时器(系统滴答定时器)是一个倒计时定时器,被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。

注意,为什么SYSCLK默认是72MHZ呢,每次我们写代码并没有设置,其实是因为st官方做了,在hd.s里,跳转到main前,先跳转到了SystemInit,就是这里面

 在SystemInit函数内,调用如下函数设置了系统时钟

 再跳转,发现是一些条件编译,根据是否存在宏定义做选择

 跳转宏定义,发现只有72MHZ定义了,其他的都注释掉了,这就是为什么SYSCLK默认72MHZ,其他地方我讲错了,并不是因为硬件默认72MHZ。

 

Systick 的信号来源于系统时钟经过AHB分频,不分频为 72MHz,8 分频为 9MHz,从下图的时钟树就可以看出来。

1、systick是一个24位的定时器,故重装值最大值为2的24次方 = 16 777 215,要注意不要超出这

     个值。

2、systick是cortex_m3的标配,在NVIC里,而NVIC在内核里,所以滴答定时器不是片上外设,是内核外设。不需要在RCC寄存器组打开它的时钟。

3、每次systick溢出后会置位计数标志位和中断标志位,计数标志位在计数器重装载后被清除,而

     中断标志位也会随着中断服务程序的响应被清除,所以这两个标志位都不需要手动清除。
 

注意说明,这些分频系数是在RCC的对应寄存器配置,默认配置为都为0000.....,对应分频系数为1,即不分频,以此类推,分频系数为2就对应3分频,这就是为什么每次配置分频系数都要减1。

定时器,时钟源有4种,内部时钟,内部定时器时钟,外部时钟源模式1,外部时钟源模式2

定时器功能

定时(一般结合中断),结合中断的话还要配置NVIC

输出比较,生成PWM波

输入捕获,比如测量输入引脚的电平变化时间

当然,这三种功能,时钟配置都是内部时钟,并且,配置内部时钟的代码不用写,默认就是。

注意,一个定时器可以生成多个PWM波,周期一样,但占空比可以不同,并且。一个定时器的定时中断和输出比较是独立的

在使用输入捕获时,还要设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值