STM32F4 MEMOS
emmmmm,虽然说STM32的东西很基本很基本了但是如果不做点记录的话好多坑都会忘记,所以还是弄个踩坑记录吧。
踩的StdPeriphLib的坑
USART_IT_IDLE
USART的中断类型除了RXNE/TXE之外还有一个经常用到的是IDLE,但是st的官方库函数在中断处理函数中处理IDLE时有个bug:进IDLE后,必须要读取SR,DR寄存器后再执行功能代码,不然会一直进IRQHandler(死循环)。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
extern "C"
{
void USART2_IRQHandler()
{
uint8_t tsr;
uint8_t tdr;
if(USART_GetITStatus(USART2,USART_IT_IDLE)==SET)
{
tsr=USART2->SR;
tdr=USART2->DR;
//TODO:Meow
USART_ClearFlag(USART2,USART_IT_IDLE);
}
}
}
USART_Parity
要用串口跟一个设备通信,这个设备串口开了偶校验,于是发现STM32F4的官方库函数关于ParityBit有个说明,就是ParityBit会覆盖数据位的MSB,也就是说USART_InitTypeDef结构体里的USART_WordLength应该要+1,不然你还是按8bits来的话,就你懂的。
RTC
- 早期的F1系列的芯片对于RTC晶振的要求过于严苛,几乎没法用,只能用epson的晶振,算是一个bug吧,现在版本的基本都改良了,没有那么严格的要求,基本都能用。
- LSE跟LSI切换的时候要注意需要完全断电:VCC断电,VBAT也要断电(抠出电池)