关于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配置类型通过数据手册判断:

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

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


浙公网安备 33010602011771号