1. 软复位
*((u32 *)0xE000ED0C) = 0x05fa0004; //实现系统复位
NVIC_SystemReset();
2.关中断和开中断(3.0库)
STM32F10x_StdPeriph_Lib_V3.1.2\Libraries\CMSIS\Core\CM3\core_cm3.h
__enable_irq();
__disable_irq();
__set_PRIMASK(1); // 关除了EMI和FAULT中断
__set_FAULTMASK(1); //关除了EMI中断
3.网口芯片复位时间可能需要调整
/* PHY Reset delay */
#define PHY_RESET_DELAY ((uint32_t)0x000FFFFF)
4.system_stm32f2xx.c的重要地方
#define VECT_TAB_OFFSET 0x00000
#define PLL_M 25
#define PLL_N 200
GPIOMode_TypeDef GPIO_Mode;
//GPIO_Mode_IN(输入),GPIO_Mode_OUT(输出),GPIO_Mode_AF(备用),GPIO_Mode_AN(模拟)
GPIOSpeed_TypeDef GPIO_Speed;
// GPIO_Speed_2MHz,GPIO_Speed_25MHz,GPIO_Speed_50MHz,GPIO_Speed_100MHz
GPIOOType_TypeDef GPIO_OType;
// GPIO_OType_PP(推挽输出),GPIO_OType_OD(开漏输出)
GPIOPuPd_TypeDef GPIO_PuPd;
//GPIO_PuPd_NOPULL(无),GPIO_PuPd_UP(上拉输入),GPIO_PuPd_DOWN(下拉输入)
对于模拟i2c采用开漏输出
4. FLASH擦写时间和供电大小有关,供电电压越大,擦写时间越小,空间前4X16K,1X64K ,NX128
#define VoltageRange_1 ((uint8_t)0x00) /*!< Device operating range: 1.8V to 2.1V */ ----FLASH_PSIZE_BYTE (PSIZE 8)
#define VoltageRange_2 ((uint8_t)0x01) /*!<Device operating range: 2.1V to 2.7V */ -----FLASH_PSIZE_HALF_WORD (PSIZE 16)
#define VoltageRange_3 ((uint8_t)0x02) /*!<Device operating range: 2.7V to 3.6V */------FLASH_PSIZE_WORD(PSIZE 32)
5. STM32 字节对齐关键字 __packed , 存储模式--小端
6.STM32的HardFault_Handler的问题
调式后发现进入了HardFault_Handler里死循环了。请问这个问题可能由啥原因引起的?
一般都是非法访问对应地址的数据出错,检查是否堆栈溢出,数组越界等等 |
HardFault_Handler的调试 最简单的办法:
在进入HardFault_Handler之后,根据堆栈指针查看堆栈,找到堆栈中最新的函数返回地址,到这个地址上去加断点,一步步根据汇编执行代码。很快就能找到出错原因,大多数是数组溢出,或者是指针初始化的问题。
7. ISP升级,串口引脚是固定(PA9,PA10--UART1),不能随意更换
8. 采用串口总线方式,需将GPIO配置漏极开路,硬件外部必须上拉。