这星期因工作比较繁忙,每天都很晚下班,剩余的时间少之又少。但这个星期过的非常充实,把自己的想要在不需要改动任何代码的情况下检测并自动适配底层驱动的设计思路得到验证,从而实现一套系统兼容多种不同的硬件设备,让客户在硬件上有多种组合选择的余地。虽然还只是比较粗糙的框架,倘若继续深入完善该设计,一定会让我们公司的系统更加智能化,从而减轻软件方面的负担,提高工作效率,蛮有成就感的。说的好像好高大上,哈哈。其实也就是一堆的函数指针指来指去的。越来越喜欢C了,喜欢这种不受束缚的实现自己想法的感觉。这次的实现,感觉仍有很多地方考虑的不够周全,仍有很多瑕疵。不过重要的是得到了锻炼,总体来说,收获蛮大的,
之前都是跳着学STM32,这次打算重新系统的去学,以下为学STM32时,看视频、看书时,觉得比较好的部分,摘录下来的内容。方便查询复习使用。 STM32F103ZET6: 1、一共有7组IO口 -> GPIOA ~ GPIOG 2、每组IO口有16个IO 3、一个16*7=112个IO口 STM32的大部分引脚除了当GPIO使用外,还可以复用为外设功能引脚(如串口). STM32共有8种模式: 4种输入模式: 浮空输入模式(GPIO_Mode_IN_FLOATING) 上拉输入模式(GPIO_Mode_IPU) 下拉输入模式(GPIO_Mode_IPD) 模拟输入模式(GPIO_Mode_AIN) 4种输出模式(反转速度 2MHz、10MHz、50MHz): 普通推挽输出模式(GPIO_Mode_Out_PP) 普通开漏输出模式(GPIO_Mode_Out_OD) 复用推挽输出模式(GPIO_Mode_AF_PP) 复用开漏输出模式(GPIO_Mode_AF_OD) 输入模式: 浮空输入模式: IO口的电平状态经过TTL施密特触发器(开),再到输入数据寄存器,CPU即可从数据寄存器读取到该电平状态。内部的上拉下拉的开关是关闭的。当此IO口悬空,其电平状态是不确定的,由外部输入决定,这个模式直接用电压表测量其引脚电压为1点几伏。由于其输入阻抗比较大,一般这种输入模式用于标准的通讯协议如I2C、USART的接收端。 上拉输入模式: 和浮空很相似,唯一不同地方在于,上拉的开关被打开(该上拉电阻大约在30~50K),若IO口处于悬空状态,会有上拉电阻拉高。即默认电平为高电平。 下拉输入模式: 和上拉输入模式很相似,唯一不同的地方在于下拉的开关被打开,IO口悬空时默认电平为低电平。 模拟输入模式: 接入到IO口的不是电平状态,而是电压,3V、2V这些,上下拉被关闭、TTL施密特触发器被关闭,加在IO口的电压直接到模拟输入。当IO口被用作ADC采样时就是这种解构,当使用ADC外设时,必须设置为模拟输入模式。
输出模式: 普通推挽输出模式: 往寄存器写 1 ,通过输出控制电路,P-MOS管导通,N-MOS管关闭,IO口即为高电平。往寄存器写 0 ,通过输出控制电路,P-MOS管关闭,N-MOS管导通,IO口即为低电平。两个管子轮流导通,一个负责灌电流、一个负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提升,推挽输出的低电平为0V,高电平为 3.3 V。 无论何时,CPU 都可以通过输入驱动器读取该IO口的实际电平值。 普通开漏输出模式 该模式下,P-MOS管不起作用,往寄存器写0,通过输出控制电路,则使N-MOS管导通,使输出接地,IO口即为低电平。往寄存器写1,N-MOS管截至,此时IO口即不是高电平也不是低电平,为高阻态,即无法直接输出高电平,使用时必须在外部接上一个上拉电阻,当输出为高阻态时由上拉将该IO口拉高,一般用于电平不匹配的情况下,如需要输出5V高电平,就需要加上拉电阻,电源为5V,当输出为高阻态时,由上拉电阻和电源向外输出5V电平。 注意,此模式具有“线与”特性,即很多个开漏模式引脚连在一起时,只有当所有引脚都输出高阻态(即1),才会被外部上拉电阻拉高提供电平,此时电平的电压为外部上拉电阻所接电源的电压,若其中一个引脚为低电平,那线路就相当于短接到地,使得整条线路为低电平(0V)。 上拉电阻的阻值决定了逻辑电平转换的沿的速度,阻值越大,速度越低功耗越小。 只有在写1时,才可以通过输入驱动器读取该IO口的实际电平值,利用此原理,适合模拟I2C,接上拉电阻,就能够正确输出0和1,读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0) 拉高,然后使用GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)读IO的值。 复用推挽输出模式 复用推挽输出模式和普通推挽输出模式基本是一样,只是一个是由片上外设控制,一个是由CPU控制。 无论何时,CPU 都可以通过输入驱动器读取该IO口的实际电平值。 复用开漏输出模式 复用开漏输出模式和普通开漏输出模式基本是一样,只是一个是由片上外设控制,一个是由CPU控制。 无论何时,CPU 都可以通过输入驱动器读取该IO口的实际电平值。 复用模式是根据GPIO的复用功能来选择的,如GPIO的引脚作用串口TX,则采用复用推挽输出模式,如果是I2C、SMBUS这些线与功能的复用场合则采用复用开漏输出模式。 在使用任何一种开漏模式时,一般都是接上拉电阻。 通常有 5 种方式使用某个引脚功能,它们的配置方式如下:
1)作为普通 GPIO 输入:根据需要配置该引脚为浮空输入、 带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
2)作为普通 GPIO 输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
3)作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
4)作为内置外设的输入:根据需要配置该引脚为浮空输入、 带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
5)作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。
如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。 stm32 复位后,IO 端口处于输入浮空状态。 复位后, JTAG引脚被置于输入上拉或下拉模式:
─ PA15: JTDI置于上拉模式
─ PA14: JTCK置于下拉模式
─ PA13: JTMS置于上拉模式
─ PB4: JNTRST置于上拉模式 所有 IO 端口都具有外部中断能力,端口必须配置成输入模式,才能使用外部中断功能. IO 端口复用功能配置:
1、对于复用功能输入,端口可以配置成任意输入模式或者复用功能输出模式.
2、对于复用功能输出,端口必须配置成复用功能输出
3、对于双向复用功能,端口必须配置成复用功能输出
4、stm32 的部分 IO 端口的复用功能可以重新映射成另外的复用功能.
5、stm32 具有 GPIO 锁定机制,即锁定 GPIO 配置,下次复位前不能再修改.
6、当 LSE 振荡器关闭时,OSC32_IN 和 OSC32_OUT 可以用作通用 IO PC14 和 PC15.
7、当进入待机模式或者备份域由 Vbat 供电,PC14,PC15 功能丢失,该两个 IO 口线设置为模拟输入功能.
8、OSC_IN 和 OSC_OUT 可以重新映射为 GPIO PD0,PD1. 注意 PD0,PD1 用于输出地时候仅能用于 50MHz 输出模式.
注意:PC13,PC14,PC15 只能用于 2MHz 的输出模式,,最多只能带 30pf 的负载,并且同时只能使用一个引脚。 外设的GPIO配置可以在STM32中文参考手册——V10 第110页可以查询。
|