关于AT32部分芯片带有SPIM,如何开启外部flash和SPIM驱动的代码分享

1.以AT32F407,w25q128v举例子

⬇️点击查看代码
⬇️点击查看代码

点击查看代码
void FLASH_InitExtFlash(void)
{
   GPIO_InitType GPIO_InitStructure;

   /* Enable ext.flash GPIO clock */
   RCC_APB2PeriphClockCmd(RCC_APB2PERIPH_AFIO|RCC_APB2PERIPH_GPIOA|RCC_APB2PERIPH_GPIOB, ENABLE);

   /* Configure ext.flash pin */
   GPIO_InitStructure.GPIO_Pins = SPIM_SCK;//
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 推挽输出模式
   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;	// GPIO最大速度为50MHz
   GPIO_Init(SPIM_SCK_PORT, &GPIO_InitStructure); //

   GPIO_InitStructure.GPIO_Pins = SPIM_CS;//
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 推挽输出模式
   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;	// GPIO最大速度为50MHz
   GPIO_Init(SPIM_CS_PORT, &GPIO_InitStructure); //

   GPIO_InitStructure.GPIO_Pins = SPIM_IO0;//
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 推挽输出模式
   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;	// GPIO最大速度为50MHz
   GPIO_Init(SPIM_IO0_PORT, &GPIO_InitStructure); //

   GPIO_InitStructure.GPIO_Pins = SPIM_IO1;//
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 推挽输出模式
   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;	// GPIO最大速度为50MHz
   GPIO_Init(SPIM_IO1_PORT, &GPIO_InitStructure); //

   GPIO_InitStructure.GPIO_Pins = SPIM_IO2;//
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 推挽输出模式
   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;	// GPIO最大速度为50MHz
   GPIO_Init(SPIM_IO2_PORT, &GPIO_InitStructure); //

   GPIO_InitStructure.GPIO_Pins = SPIM_IO3;//
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;// 推挽输出模式
   GPIO_InitStructure.GPIO_MaxSpeed = GPIO_MaxSpeed_50MHz;	// GPIO最大速度为50MHz
   GPIO_Init(SPIM_IO3_PORT, &GPIO_InitStructure); //

   /* Select PB10, PB11 as SPIF_TX and SPIF_RX */
   GPIO_PinsRemapConfig(GPIO_Remap_EXT_FLASH, ENABLE);//使能选择使用外部 SPI Flash。
   /*
   选择 SPIM 接口的 IO 复用功能。
   000: SCK/PB1 CS/PA8 IO0/PA11 IO1/PA12
   IO2/PB7 IO3/PB6
   001: SCK/PB1 CS/PA8 IO0/PB10 IO1/PB11
   IO2/PB7 IO3/PB6
   */
	#if 1	//SCK/PB1 CS/PA8 IO0/PA11 IO1/PA12
    GPIO_PinsRemapConfig(AFIO_MAP7_SPIF_1000, ENABLE);
	#else	//SCK/PB1 CS/PA8 IO0/PB10 IO1/PB11
	GPIO_PinsRemapConfig(AFIO_MAP7_SPIF_1000, ENABLE);
	#endif
	
   /* In this example, use on-board EN25QH128A as ext.flash */
   FLASH->B3SEL = FLASH_SPIM_TYPE2;

   /* Unlock the ext.flash program erase controller */
   while (BIT_READ(FLASH->STS3, FLASH_STS_BSY));
   FLASH->FCKEY3 = FLASH_KEY1;
   FLASH->FCKEY3 = FLASH_KEY2;
   while (BIT_READ(FLASH->CTRL3, FLASH_CTRL_LCK));

   /* If the data written to ext.flash need to be scrambled, please specify the scrambled range */
   FLASH->DA = 0;

   return;
}
⬆️点击查看代码

⬆️点击查看代码

FLASH->B3SEL配置类型通过数据手册判断:

4e10b270a5d94e29ffa2b5a5e4d404eb

REMAP_0和REMAP_1是用来选择外设复用引脚配置。寄存器配置如下:

image

REMAP_0对应寄存器EXT_SPIF_GRMP[2:0]=000的硬件复用配置;REMAP_1对应对应寄存器EXT_SPIF_GRMP[2:0]=001的硬件复用配置

在使用Keil环境中配置SPIM的时候,需要选择Flash烧录算法文件,但是雅特力官方给了4个SPIM的配置文件,但是没有给出选择说明。选择Flash算法文件是要根据FLASH->B3SEL选择的类型type和REMAP来决定,通过上面我介绍的情况可以确定,我使用的是type1和remap_0

image

posted @ 2025-11-13 10:54  BUG_KING  阅读(14)  评论(0)    收藏  举报