STM32F407
error
- GPIO设置以最后一次为准
- 如果中断标志位不清除,中断服务函数会循环运行
- 文件路径中尽量不要有中文,否则代码提示或者代码自动补全功能不可用
- FlagStatus返回值是中断标志位状态(读SR寄存器),该函数用于检测串口中断标志位的状态。在没有使能相应的中断函数时,通常使用该函数来判断标志位是否置位。
ITStatus 返回值是中断发生与否的判断(读CR寄存器),除了可以判断中断标志位外,还能判断是否 发生了中断。 - 修改函数名或者变量时,相应的头文件声明也要更改
- TIM_GetCapture1和TIM_SetCompare1都是设置CCR1寄存器,可以实现自加1,如TIM_SetCompare1(TIM14,TIM_GetCapture1(TIM14)+1)
RTC_Set_WakeUp(RTC_WakeUpClock_CK_SPRE_16bits,0); //设置WAKE UP中断,1秒中断一次
RTC_Set_WakeUp函数操作的是RTC_WUTR寄存器,当使能唤醒定时器时(WUTE 置 1),每 (WUT[15:0] + 1) 个 ck_wut 周期将 WUTF 标志置 1一次。
attention
- FSMC和LCD地址对应问题
8位宽度的时候,每个地址代表1个字节, [25:0] 为 64M地址空间;16位宽度的时候,每个地址代表2个字节, [24:0] 为 32M地址空间,但是可以表示64M的字节
外部存储器不都是按字节访问的(如上图所述),也就是说当你找到某个地址之后,你可以读出一个字节的数据(8位宽度)或者两个字节的数据(16位宽度)或者更多字节的数据(其他宽度),而这,就是依靠你外部存储器的数据宽度是多少。而所谓16位数据宽度就是说一个地址对应两个字节,当然了8位的数据宽度就是一个地址对应一个字节。
16位宽的SRAM是按字编址的,需要25根地址线(FSMC_A[24:0]);8位宽的SRAM是按字节编址的,需要25根地址线(FSMC_A[24:0])。HADDR是STM32内部的地址总线,它是按照字节编址的,HADDR和FSMC_A是连接一起,指向同一存储空间,当FSMC按照字编址时,FSMC_A大小是HADDR对应地址大小的两倍,也就是HADDR向右移动一位(除以2),就跟FSMC_A相等,即HADDR[25:1]——→FSMC_A[24:0]
- FSMC与LCD连接后,向LCD输入命令和数据的过程
LCD没有地址线,实验中把LCD的RS信号接到了FSMC_A6,用地址信号的A6位来决定向LCD写入的是DATA还是命令。如以下代码:
typedef struct
{
u16 LCD_REG;
u16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=11 A6作为数据命令区分线
//注意设置时STM32内部会右移一位对其! 111 1110=0X7E
#define LCD_BASE ((u32)(0x6C000000 | 0x0000007E))
#define LCD ((LCD_TypeDef *) LCD_BASE)
void LCD_WR_REG(vu16 regval)
{
regval=regval; //使用-O2优化的时候,必须插入的延时
LCD->LCD_REG=regval;//写入要写的寄存器序号
}
其中,LCD是一种结构体指针,它所指向的首地址为0x6C00007E(HADDR[32:0]=0x6C00007E,对应着FSMC的Bank1.sector4),那么结构体中的LCD_REG地址为0x6C00007E,LCD_RAM地址位0x6C000080(LCD_REG寄存器大小是16位的,有两个字节,所以HADDR地址加2)。可以看到0x6C00007E的第7位是0,对应RS=0;0x6C000080的第8位是1,对应RS=1(HADDR第7位对应的是FSMC_A6)。以上代码意思是:向地址为0x6C00007E的空间存入数据regval,即当RS=0时,向LCD写入命令regval。
-
待机唤醒
STM32在正常模式下会运行中断服务函数,而待机模式下则不会运行中断服务函数,因为待机模式下MCU不工作,所以上升沿的作用也仅仅是唤醒,在这里提醒:唤醒只需要上升沿、、所以从待机模式切换到正常模式下从始至终都不会执行中断服务函数 -
IIC实验中的等待应答函数问题
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
}
函数中已把GPIO设置为输入模式,但还是对ODR寄存器进行了操作(IIC_SDA=1;)
GPIO在输入模式下,设置ODR寄存器的用意是开启芯片内部的上拉(置1)还是下拉(下拉)电阻,主要作用是在没有输入信号的时候确定管脚电平状态的。IIC等待应答函数是用来等待从机发出一个低电平信号,在从机没有发出信号时,我们默认把GPIO上拉。
- IIC写EEPROM