SRAM驱动开发实例

一 我写博客的原因,应该说是有两点吧
(1)一点是对阶段性工作的总结,虽说技术创新,技术创新,但在创新之前有一个技术积累的过程,写博客,便于总结,回忆。
(2)另一点是受到带我的师傅的影响,他是公司的技术主管,他提到一个词让我感触很大,“开源”。他教我学会了很多东西,所以我写的文章,上传的资源都是免费的,希望能够对有兴趣者,及同行有所帮助。

二 驱动开发流程
新来一个项目,有了新的需求,上司给你分配了新的任务,给了你一块板子,告诉了你需求,然后让你完成驱动程序的部分。
(1)接到一块新的板子,不要立刻上手去研究写程序。先研究板子再说,和硬件工程师同事沟通,看动手之前需要查看哪些资料,电路原理图等等。
(2)看原理图时要看的仔细,因为一旦出现了问题,最后排查问题的时候会很麻烦。
(3)开发板的驱动开发,不可避免的会要进行连线,电源线,通信线,而这些在开发板的一端是以32 * 3个引脚的形似存在的。(我用到的开发板是这样的)连线要认真,连接好后,做一个简单的测试,观察接线是否正确,如用ping指令检测网线是否连接正确。
(4)这里用到的是STM32F407处理器,以SRAM,FLASH为模板,进行叙述。
(5)查看电路原理图,注意SRAM,FLASH与处理器的接线方式。驱动开发过程中会经常用到,处理器的技术开发手册,它是程序正常运行的理论依据。我刚进公司时直接让我看了两个星期的技术开发手册。它很大,不需要全看完,先看2,6,7就行了,其他的等需要的时候再看就行了。当然这个在没事的时候也可以看一下,越熟练越好。
在这里插入图片描述
(6)然后,对引脚进行配置,配置需要的参数,函数名,需要注意的事项,网上一般都能够找到例程,然后根据自己的需要进行更改就可以了。例程:

   /* Enable all the clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);

    /* Enable GPIOD clock */
    GPIO_InitTypeDef GPIO_InitStructure_D;
    GPIO_InitStructure_D.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
                                GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | 
                                GPIO_Pin_14 | GPIO_Pin_15;

    GPIO_InitStructure_D.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure_D.GPIO_Speed = GPIO_Speed_100MHz;
    GPIO_InitStructure_D.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure_D.GPIO_PuPd  = GPIO_PuPd_UP;
    GPIO_Init(GPIOD, &GPIO_InitStructure_D);

需要注意的是时钟的开启只需要一次就可以了,一个程序里不需要重复开启。还有,时钟的开启是可以同时开启多个的,用法如上。
(7)当编写程序遇到瓶颈时,不要慌乱,不要瞎想,查看技术手册,查看技术手册,查看技术手册。
(8)查看技术手册发现外部存储器的正常使用还需要对FSMC进行配置,(一个总线协议)。配置需要的参数,函数先从网上查,看是否有例程,然后在看技术手册,这样简单些。

static void fn_FsmcBank1Sram1Config(void)
{
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    FSMC_NORSRAMTimingInitTypeDef st_SRAMTiming;
    FSMC_NORSRAMTimingInitTypeDef st_WriteTiming;

    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);

    st_SRAMTiming.FSMC_AddressSetupTime = 3; //14;
    st_SRAMTiming.FSMC_AddressHoldTime = 0;  //14;
    st_SRAMTiming.FSMC_DataSetupTime = 8;    //200;
    st_SRAMTiming.FSMC_BusTurnAroundDuration = 1;//14;
    st_SRAMTiming.FSMC_CLKDivision = 0;
    st_SRAMTiming.FSMC_DataLatency = 0;
    st_SRAMTiming.FSMC_AccessMode = FSMC_AccessMode_A;

    st_WriteTiming.FSMC_AddressSetupTime = 3;
	st_WriteTiming.FSMC_AddressHoldTime = 0x00;
	st_WriteTiming.FSMC_DataSetupTime = 8;
	st_WriteTiming.FSMC_BusTurnAroundDuration = 0x01;
	st_WriteTiming.FSMC_CLKDivision = 0x00;
	st_WriteTiming.FSMC_DataLatency = 0x00;
	st_WriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;
    
    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
    FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
    FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &st_SRAMTiming;
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &st_WriteTiming;

    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

    /* Enable FSMC Bank1_SRAM1 Bank */
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}

这里需要注意的是,空间地址的位置,数据的宽度(不对的话会造成数据丢失)。
(9)所有的程序写完之后,看编译能否通过,通过之后,写测试程序。这里的测试思路是,向片外存储器中写入数据,然后再读出来,如果则前后一致,则恭喜了,驱动开发完成。
(10)如果不正确,那就麻烦了,再次查看原理图,看原理图一定要有耐心,仔细的看,检查一遍程序编写是否有哪里出错,开发板的接线是否正确。
(11)如果以上都没错误,就相信自己,给自己一个定论,我写的程序没错,错的是开发板,这时就要用到示波器了。
(12)开发板外接一根接地线,与示波器相连,通过示波器检测外设的通信,电源,连线是否正确。
(13)如果板子有问题,简单的话就自己动手,(电烙铁我也是玩的很溜的)麻烦的话,就交给搞硬件的同事。
(14)最后再进行测试,输入输出正确,则驱动开发完成。

三 结尾
(1)突然涨了好多粉丝,有点慌,想了想啊,不要忘记初心就好,总结,开源。
(2)想要生活,总是要工作的嘛,所以文章也不会停啊,因为有工作,就会遇到问题,然后解决问题,最后,就想总结问题,不让同样的问题出现第二次

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值