STM32F429IGT6入门(一)
时间:2023-01-10 09:00:00
最后,比赛结束后,我收拾了学校的一切,终于有时间学习我喜欢的东西了!!(搓手)一开始,我要用开发板学习。我用的开发板是STM32F429挑战者V2和V1,所以我迫不及待地下载了keil 5 和装上了pack然后就遇到了小问题:
因为这个问题,我不能进入程序,我会犯以下错误:
Error: Flash Download failed - Target DLL has been cancelled
SWD/JTAG Communication Failure
...
终于花了半个晚上,找到了原因和解决办法:
File : D:\keil4\ARM\PACK\Keil\STM32F4xx_DFP\2.12.0\Keil.STM32F4xx_DFP.pdsc
Context : Item #1:
这是问题报错的句子,可能是因为keil版本的问题也可能是pack由于包版过低,其原意是STM32FXX_DEF文件中的Message函数不能正常识别,它也可以通过重新安装软件来解决,但这有点麻烦,所以我在网上找到了以下方法:
-
复制错误的文件路径,找到错误的文件路径pdsc文件。
-
更改pdsc右键单击此文件取消只读属性。
-
取消后,打开pdsc找到对应的文件message函数,将Message(2, "Not a genuine ST Device! Abort connection.");删除即可。
-
最后,将属性改为只读,即可编译下载程序!
在解决这个问题时,也有一些发现是芯片问题,所以我研究了它BOOT IO其启动方式如下:
STM32芯片上有两个管脚BOOT0和BOOT1.芯片复位时两个管脚的电平状态决定了芯片复位后从哪个区域执行程序。
BOOT1 = X BOOT0 = 0 从用户闪存(flash)启动,这是正常模式 BOOT1 = 0 BOOT0 = 1 从内置SRAM(内存)启动是调试模式 BOOT1 = 1 BOOT0 = 1 该模式也可用于从系统存储器开始的调试
然后解决基本问题,然后开始学习♀?首先是初识STM32。
STM32作为微控制器,内核为Cortex-M4,主频为180M,功能如下:
-
串口(USART)-- Usb转串口模块,ESP8266、WIFI、GPS、GSM、串口屏,指纹识别...
-
内部集成电路(IIC) -- EEPROM 、 电容屏 、 陀螺仪MPU6050、OLED...
-
串行通信借口(SPI) -- 串行FLASH 、 以太网 W5500 、 音频模块VS1053 ...
-
SDIO \ FMC \ I2S \ SAI \ ADC \GPIO ...
存储器映射:存储器本身没有地址信息,其地址由芯片制造商或用户分配,将地址分配给存储器的过程称为存储映射。
序号 | 用途 | 地址范围 |
---|---|---|
Block 0 | SRAM(FLASH) | 0x0000 0000 ~ 0x1FFF FFFF(512MB) |
Block 1 | SRAM | 0x2000 0000 ~ 0x3FFF FFFF(512MB) |
Block 2 | 片上外设 | 0x4000 0000 ~ 0x5FFF FFFF(512MB) |
Block 3 | FMC的bank1 ~ bank2 | 0x6000 0000 ~ 0x7FFF FFFF(512MB) |
Block 4 | FMC的bank3 ~ bank4 | 0x8000 0000 ~ 0x9FFF FFFF(512MB) |
Block 5 | FMC | 0xA000 0000 ~ 0xCFFF FFFF(512MB) |
Block 6 | FMC | 0xD000 0000 ~ 0xDFFF FFFF(512MB) |
Block 7 | Cortex-M4内部外设 | 0xE000 0000 ~ 0xFFFF FFFF(512MB) |
寄存器映射(我们最熟悉的):存储器Block在这个区域,设计了片上外设,它们是为了四个字节为一个单位,共32bit,当我们控制这些单元时,每个单元对应不同的功能来驱动外设工作。我们可以找到每个单元的起始地址,然后通过C语言指针访问这些单元的操作模式,如果每次通过这个地址访问,不仅难以记住,而且容易出错,那么我们可以根据每个单元的不同功能,以功能的名义给内存单元一个别名,这个别名是我们常说的寄存器。给具有特定功能的内存单元取别名的过程称为寄存器映射。
// GPIOH 所有端口输出 高电平
#define GPIOH_ODR (unsignedint*)(0x40021C14)
*GPIOH_ODR = 0xFF;
GPIO八种模式 typedef enum
{ GPIO_Mode_AIN = 0x0, /* 模拟输入 */ GPIO_Mode_IN_FLOATING = 0x04, /* 浮动输入,复位后的状态 */ GPIO_Mode_IPD = 0x28, /* 下拉输入 */ GPIO_Mode_IPU = 0x48, /* 上拉输入 */ GPIO_Mode_Out_OD = 0x14, /* 开漏输出 */ GPIO_Mode_Out_PP = 0x10, /* 推挽输出 */ GPIO_Mode_AF_OD = 0x1C, /* 复用开漏输出 */ GPIO_Mode_AF_PP = 0x18 /* 复用推挽输出 */
}GPIOMode_TypeDef;
端口配备低寄存器 (GPIOx_CRL)(x = A...E)
端口配有高寄存器(GPIOx_CRH)(x = A...E)
端口输入数据寄存器(GPIOx_IDR)(x = A...E):这些位置只读,只能以字(16位)的形式读读出的值是相应的I/O口的状态。
端口输出数据寄存器(GPIOx_ODR)(x = A...E):只能以字(16bit)的形式操作,复位值全是0。写0即输出0,写1即输出1。
端口设置/清除寄存器(GPIOx_BSRR)(x = A...E):高16bit写1用于清0,低16bit写1用于位置,写1用于低16bi有效。
清除端口位置的寄存器(GPIOx_BRR)(x = A...E):低16位写1用于位置。
端口配置锁定寄存器(GPIOx_LCKR)(x = A...E)