没有合适的资源?快使用搜索试试~ 我知道了~
首页如何编写keil的flash下载算法
资源详情
资源评论
资源推荐

制作 keil 的 flash 下载算法
By Wendell.li
最近在使用 NXP 的 RT1052 进行一些工作的开发,这个 MCU 是没有 Flash 的,需要用
户自己选定 flash,开始使用 NXP 退出的官方 demo 板进行调试,使用官方提供的历程下载到
flash 中,但是查了一下板载 flash 的价格果断放弃,大家可以查查价格,结合自己的情况选则
了华邦的 W25Q64JV 这颗 norflash。然后悲催的事情就开始了,不知道如何通过 keil 下载进
去,经过摸索终于实现了这个功能。下面记录一下具体的操作步骤。很少这样写东西也得不好
大家多包涵;
一、 实现 flash 的基本操做
实现 flash 的基本功能,包含获取 ID,擦除整片 flash、读操作、写操作、擦除扇
区操作等,此部分的内容可以参考正点原子或者野火的 STM32 的历程中有相关的说
明,下面按照步骤写一下实现过程。
1. SPI 以及 GPIO 的初始化,以及发送函数
2. void FingerTech_Spigpioinit(void)
3. {
4. gpio_pin_config_t fingertech_led = {kGPIO_DigitalOutput,0,kGPIO_NoIntmode};
5. IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_06_LPSPI2_PCS0,0U);
6. IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_07_LPSPI2_SCK,0U);
7. IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_08_LPSPI2_SD0,0U);
8. IOMUXC_SetPinMux(IOMUXC_GPIO_SD_B1_09_LPSPI2_SDI,0U);
9. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_06_LPSPI2_PCS0,0x10B0u);
10. IOMUXC_SetPinConfig( IOMUXC_GPIO_SD_B1_07_LPSPI2_SCK,0x10B0u);
11. IOMUXC_SetPinConfig( IOMUXC_GPIO_SD_B1_08_LPSPI2_SD0,0x10B0u);
12. IOMUXC_SetPinConfig( IOMUXC_GPIO_SD_B1_09_LPSPI2_SDI,0x10B0u);

13.
14. IOMUXC_SetPinMux( IOMUXC_GPIO_SD_B1_10_GPIO3_IO10,0U);
15. IOMUXC_SetPinMux( IOMUXC_GPIO_SD_B1_11_GPIO3_IO11, 0U);
16. IOMUXC_SetPinConfig( IOMUXC_GPIO_SD_B1_10_GPIO3_IO10,0x10B0u);
17.
18. IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_11_GPIO3_IO11,0x10B0u);
19. GPIO_PinInit(GPIO3,10u,&fingertech_led);
20. GPIO_PinInit(GPIO3,11u,&fingertech_led);
21. GPIO_PinWrite(GPIO3,10u,1);
22. GPIO_PinWrite(GPIO3,11u,1);
23. }
24. void FingerTech_SpiConfigInit(void)
25. {
26. lpspi_master_config_t masterConfig;
27. uint32_t srcClock_Hz;
28. /*Set clock source for LPSPI*/
29. CLOCK_SetMux(kCLOCK_LpspiMux, EXAMPLE_LPSPI_CLOCK_SOURCE_SELECT);
30. CLOCK_SetDiv(kCLOCK_LpspiDiv, EXAMPLE_LPSPI_CLOCK_SOURCE_DIVIDER);
31.
32. masterConfig.baudRate = (18000000U);
33. masterConfig.bitsPerFrame = 8;
34. masterConfig.cpol = kLPSPI_ClockPolarityActiveHigh;
35. masterConfig.cpha = kLPSPI_ClockPhaseFirstEdge;
36. masterConfig.direction = kLPSPI_MsbFirst;
37.
38. masterConfig.pcsToSckDelayInNanoSec = 1000000000 / masterConfig.baudRate;
39. masterConfig.lastSckToPcsDelayInNanoSec = 1000000000 / masterConfig.baudRate;
40. masterConfig.betweenTransferDelayInNanoSec = 1000000000 / masterConfig.baudRate;
41.
42. masterConfig.whichPcs = kLPSPI_Pcs0; //ʹÓÃÆ¬Ñ¡0
43. masterConfig.pcsActiveHighOrLow = kLPSPI_PcsActiveLow;//0±íʾѡÖÐ
44.
45. masterConfig.pinCfg = kLPSPI_SdiInSdoOut;
46. masterConfig.dataOutConfig = kLpspiDataOutTristate;//È¡ÏûÑ¡Öк󱣳ָß×è̬
47.
48. srcClock_Hz = LPSPI_MASTER_CLK_FREQ;
49. LPSPI_MasterInit(LPSPI2, &masterConfig, srcClock_Hz);
50. LPSPI_Enable(LPSPI2,true);
51. }
52.
53. //spi 读写函数

54. void FingerTech_SpiWRDate(uint8_t* wdata,uint8_t* rdata,size_t size)
55. {
56. lpspi_transfer_t fingertechmasterXfer;
57. fingertechmasterXfer.txData = wdata;
58. fingertechmasterXfer.rxData = rdata;
59. fingertechmasterXfer.dataSize = size;
60. fingertechmasterXfer.configFlags = kLPSPI_MasterPcs0 | kLPSPI_MasterPcsContinuous | kLP
SPI_SlaveByteSwap;
61. LPSPI_MasterTransferBlocking(LPSPI2, &fingertechmasterXfer);
62. }
63.
2. flash 相关操作函数
1. //写允许函数
2. void FingerTech_W25Q64JV_EnableWrite(void)
3. {
4. uint8_t WriteEnableCmd = W25Q64_WRITEENABLE_CMD;
5. uint8_t ReadEnableCmd = 0x00;
6. FingerTech_SpiWRDate(&WriteEnableCmd,&ReadEnableCmd,1);
7. }
8.
9. //写禁止函数
10. void FingerTech_W25Q64JV_DisableWrite(void)
11. {
12. uint8_t WriteEnableCmd = W25Q64_WRITEDISABLE_CMD;
13. uint8_t ReadEnableCmd = 0x00;
14. FingerTech_SpiWRDate(&WriteEnableCmd,&ReadEnableCmd,1);
15. }
16. //读 ID
17. uint32_t FingerTech_ReadW25Q64JVID(void)
18. {
19. uint32_t flashid=0;
20. uint8_t readidcmd[6]={0x90,0x00,0x00,0x00,0xff,0xff};
21. uint8_t readidrxbuf[6];
22. FingerTech_SpiWRDate(readidcmd,readidrxbuf,6);
23. flashid |= ((readidrxbuf[4]<<8)|(readidrxbuf[5]));
24. return flashid;
25. }
26.
27. //等待忙
28. void FingerTech_W25Q64JV_WAITBUSY(void)
29. {
30. uint8_t isbusy = 0;
剩余10页未读,继续阅读




















dsters
- 粉丝: 8
- 资源: 81
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- ARM Cortex-A(armV7)编程手册V4.0.pdf
- ABB机器人保养总结解析.ppt
- 【超详细图解】菜鸡如何理解双向链表的python代码实现
- 常用网络命令的使用 ipconfig ping ARP FTP Netstat Route Tftp Tracert Telnet nslookup
- 基于单片机控制的DC-DC变换电路
- RS-232接口电路的ESD保护.pdf
- linux下用time(NULL)函数和localtime()获取当前时间的方法
- Openstack用户使用手册.docx
- KUKA KR 30 hA,KR 60 hA机器人产品手册.pdf
- Java programming with JNI
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0