stm32之初学

  本人学习机电的,在控制方面基础薄弱,刚接触ARM就背安排学习STM32,刚点亮一个灯,过程是曲径通幽啊

  刚接手时一看言发直心跳加速,完全不懂,呵呵呵,火牛,安富莱,镇南挨个仔细看了下,最后还是回归到CortexM3权威指南,仔细看了一遍才敢下手,给新手推荐个入门教材:一牛人的DX32—顶级学习手册;芯达stm32教程。

建议初学者先把权威指南和固件库简介看一下。

一、 STM32的输入输出管脚有下面8种(4输入+2输出+2复用输出)可能的配置:

    ① 浮空输入_IN_FLOATING

    ② 带上拉输入_IPU  

    ③ 带下拉输入_IPD           

    ④ 模拟输入_AIN

    ⑤ 开漏输出_OUT_OD     

    ⑥ 推挽输出_OUT_PP

    ⑦ 复用功能的推挽输出_AF_PP

    ⑧ 复用功能的开漏输出_AF_OD

在STM32中选用IO模式
(1) 浮空输
入_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
(2)带上拉输入_IPU——IO内部上拉电阻输入
(3)带下拉输入_IPD—— IO内部下拉电阻输入
(4) 模拟输入_AIN ——应用ADC模拟输入,或者低功耗下省电
(5)开漏输出_OUT_OD ——IO输出0接GN
D,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能
(6)推挽输出_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
(7)复用功能的推挽输出_AF_PP ——片内外设功能(I2C的SCL,SDA)
(8)复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)

具体情况:http://www.360doc.com/content/11/0902/16/7620531_145279674.shtml

双向IO的使用方法:

      输出模式下输入寄存器依然有效,在开漏配置模式下实现真正的双向I/O功能。
这个功能的实现是,当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。

      即具体做法为: 初始化配置为Out_OD输出,当需要输入数据的时候,先输出1,然后在进行读操作.

STM32设置实例:

(1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,能够正确输出0和1;读值时先GPIO_SetBits(GPIOB, GPIO_Pin_0);拉高,然后可以读IO的值;使用GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0);

(2)如果是无上拉电阻,IO默认是高电平;需要读取IO的值,可以使用带上拉输入_IPU和浮空输入_IN_FLOATING和开漏输出_OUT_OD;


二、USART波特率算法

官方库的USART的USART_BRR的设置会损失踪精度。
/******************************************************************/
     integerdivider = ((25 * apbclock) / (4 * (USART_InitStruct->USART_BaudRate)));   
     tmpreg = (integerdivider / 100) << 4;
     fractionaldivider = integerdivider - (100 * (tmpreg >> 4));
     tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);
     USARTx->BRR = (uint16_t)tmpreg;
/******************************************************************/
官方库的思绪是
(1)将算出的USARTDIV扩年夜100倍保留整数部门。
(2)百位以上的送入BRR[15:4],百位以下的换算成16进制值送入[3:0]

  tmpreg |= ((((fractionaldivider * 16) + 50) / 100)) & ((uint8_t)0x0F);这里的50是为了提高精度!!

也即对于USARTDIV小数部门,只有小数点后两位保留,两位往后的全数舍去,好比理论计较获得USARTDIV = 234.28125 被措置为 USARTDIV = 234.28,这样就损失踪了精度,造成了最终送入BRR的现收屑堍不是理论值的四舍五入(5以上的有可能也被舍去)

具体情况:http://www.mvpdz.com/thread-6012-1-1.html


呵呵,来源于网络,贡献与网络


你可能感兴趣的:(学习日志,io,网络,算法,c,360)