日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

FSMC(STM32)

發(fā)布時(shí)間:2025/4/16 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FSMC(STM32) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


(一個(gè))FSMC:Flexible Static Memory Controller,變量(靈活)靜態(tài)存儲(chǔ)控制器

小容量產(chǎn)品是指閃存存儲(chǔ)器容量在1 6K32K字節(jié)之間的STM32F101xxSTM32F102xx

STM32F103xx微控制器。?

中容量產(chǎn)品是指閃存存儲(chǔ)器容量在64K128K字節(jié)之間的STM32F101xxSTM32F102xx

STM32F103xx微控制器。?

大容量產(chǎn)品是指閃存存儲(chǔ)器容量在256K512K字節(jié)之間的STM32F101xxSTM32F103xx微控

制器。?

互聯(lián)型產(chǎn)品是指STM32F105xxSTM32F107xx微控制器。

?

?

對(duì)于M3來(lái)說(shuō)

?

?然后將這1.0GB的外存分為4個(gè)大塊

?

1。為什么每一塊中每一片是64M?

答:我們知道地址線26跟,2的26次方等于64M,所以每一個(gè)塊是64M,

2。為什么每一塊中是4片?

答:它這里有一個(gè)非常巧妙的方法每個(gè)塊有4個(gè)片選。以方便我們使用那一片;

?

故:1.0GB =? (4*64)*4

?

下面例程我們的液晶是接在Bank1中的第4片;

先看下接口圖(野火板子)

1,為什么是片4?

答:

?

我們的LCD_CS接在了FSMC_NE4的片選4端(說(shuō)白了是:液晶的內(nèi)存與FSMC要相互相應(yīng))

2,為什么是塊1?

答:由于液晶里面的RAM相當(dāng)于NOR FLASH,或者PSRAM,所以最好用塊1

3,為什么低電平電量點(diǎn)亮屏幕呢?

答:看下圖

?

?對(duì)于38,39管腳的控制使用一個(gè)PNP三極管,當(dāng)LIGHT低電平時(shí) 導(dǎo)通。

為什么接PB1?

答:PB1通過(guò)有PWM調(diào)制功能

4,對(duì)于讀寫控制可參考圖中注解,但主要對(duì)于不同的液晶控制芯片讀寫控制可能有所差異。

如圖9341

?

RS 我們接的是FSMC_A23,那么我們控制FSMC的地址線23就能夠控制發(fā)送命令還是數(shù)據(jù)了

?

程序解說(shuō):

1,載入ili9341驅(qū)動(dòng)文件

2,打開(kāi)

/* #include "stm32f10x_flash.h" */ #include "stm32f10x_fsmc.h"

?3,port配置

?4。工作模式配置(參考ili9341手冊(cè))

void LCD_FSMC_Config(void) {FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDef p; p.FSMC_AddressSetupTime = 0x02; //地址建立時(shí)間p.FSMC_AddressHoldTime = 0x00; //地址保持時(shí)間p.FSMC_DataSetupTime = 0x05; //數(shù)據(jù)建立時(shí)間p.FSMC_BusTurnAroundDuration = 0x00;p.FSMC_CLKDivision = 0x00;p.FSMC_DataLatency = 0x00;p.FSMC_AccessMode = FSMC_AccessMode_B; // 一般使用模式B來(lái)控制LCDFSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;//FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_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 = &p;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p; FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE); }

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//此處我們用到了bank1的第四片

FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//此處我們用到了bank1的第四片

?

5。液晶軟件復(fù)位(低電平復(fù)位,切記高電平要保持一下)

void LCD_Rst(void) { GPIO_ResetBits(GPIOG, GPIO_Pin_11); //低電平復(fù)位Lcd_Delay(0xAFFf<<2); GPIO_SetBits(GPIOG, GPIO_Pin_11); Lcd_Delay(0xAFFf<<2); }

?6。寫命令、數(shù)據(jù)

void LCD_REG_Config(void)

這里介紹一下寫命令與寫數(shù)據(jù)函數(shù)

LCD_ILI9341_CMD(0xCF);     //寫命令LCD_ILI9341_Parameter(0x00); //寫數(shù)據(jù)

?例如以下:

#define Bank1_LCD_C ((u32)0x6C000000) //Disp Reg ADDR #define Bank1_LCD_D ((u32)0x6D000000) //Disp Data ADDR // A23 PE2//選定LCD指定寄存器 #define LCD_WR_REG(index) ((*(__IO u16 *) (Bank1_LCD_C)) = ((u16)index)) //往LCD GRAM寫入數(shù)據(jù) #define LCD_WR_Data(val) ((*(__IO u16 *) (Bank1_LCD_D)) = ((u16)(val)))#define LCD_ILI9341_CMD(index) LCD_WR_REG(index) #define LCD_ILI9341_Parameter(val) LCD_WR_Data(val)

?解釋例如以下:

?當(dāng)主控對(duì)指針量(地址)0x6D000000操作,FSMC_A23為高電平,此時(shí)為寫數(shù)據(jù);

操作順序: CPU作用于FSMC外設(shè)。FSMC內(nèi)存塊作用于TFT的GRAM。

可理解CPU向0x6C000000。0x6D000000該地址寫入數(shù)據(jù),即使操作FSMC的塊1的片選4,后導(dǎo)致FSMC外設(shè)地址線和數(shù)據(jù)線管腳的變化。

?為什么2^23 還要*2 ?

答:

?

?在外部設(shè)備是16位時(shí)。連接到內(nèi)部地址總線 HADDR時(shí) 左移一位。0-1,,。,24-25;所以為了滿足相應(yīng)關(guān)系。我們要將指針量*2,才干找出正確的地址后與之相應(yīng);

若連接其它的地址線,那么計(jì)算方式一樣。

?7。掃描方式

DEBUG_DELAY();LCD_ILI9341_CMD(0x36); LCD_ILI9341_Parameter(0xC8); //豎屏 左上角(起點(diǎn))到右下角(終點(diǎn))掃描方式DEBUG_DELAY();

?向“36” 寄存器 寫相應(yīng)指令就成

/* column address control set */ X軸LCD_ILI9341_CMD(0X2A); LCD_ILI9341_Parameter(0x00); //低八位 0LCD_ILI9341_Parameter(0x00);   //高八位LCD_ILI9341_Parameter(0x00);  LCD_ILI9341_Parameter(0xEF);       0XEF = 239/* page address control set */   Y軸DEBUG_DELAY();LCD_ILI9341_CMD(0X2B); LCD_ILI9341_Parameter(0x00);        0LCD_ILI9341_Parameter(0x00);LCD_ILI9341_Parameter(0x01);LCD_ILI9341_Parameter(0x3F);       0X13F = 319  

?---------------------------------------------------------------------------

函數(shù)部分:

①清屏函數(shù)(源)

void LCD_Clear(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)

?如清掉整個(gè)屏幕

LCD_Clear(0, 0, 240, 320, BACKGROUND);

②設(shè)置坐標(biāo)點(diǎn)(源)

void LCD_SetCursor(uint16_t x, uint16_t y)

③?開(kāi)窗(源)

界限設(shè)置。不然就不會(huì)反過(guò)來(lái)寫(第一行寫完。然后從第二行寫),調(diào)整地址指針

void LCD_OpenWindow(uint16_t x, uint16_t y, uint16_t width, uint16_t height)

?④畫點(diǎn)(源)

一切一切的本源

void LCD_SetPoint(uint16_t x , uint16_t y , uint16_t color) { LCD_SetCursor(x, y);LCD_ILI9341_CMD(0x2c); LCD_WR_Data(color); }

?⑤顏色(源)

uint16_t LCD_RD_data(void) { uint16_t R=0, G=0, B=0 ;R = *(__IO uint16_t *)Bank1_LCD_D; /*FIRST READ OUT DUMMY DATA*/R = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT RED DATA */B = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT BLACK DATA*/G = *(__IO uint16_t *)Bank1_LCD_D; /*READ OUT GREEN DATA*///將地址轉(zhuǎn)換成指針,對(duì)指針進(jìn)行操作return (((R>>11)<<11) | ((G>>10)<<5) | (B>>11)); //轉(zhuǎn)換成16位寬度 }

?⑥顯示一個(gè)字符(源)

void LCD_DispChar(uint16_t x, uint16_t y, uint8_t ascii, uint16_t color)

如:LCD_DispChar(60, 60, 'A', RED); //相應(yīng)有效的地方寫該顏色,這個(gè)函數(shù)也是獨(dú)立的。

當(dāng)然在用之前要有自己相應(yīng)的的字庫(kù)

?⑦顯示一個(gè)字符串

void LCD_DispStr(uint16_t x, uint16_t y, uint8_t *pstr, uint16_t color)

?如:

?LCD_DispStr(10, 10, (uint8_t *)"This is a lcd demo to display ascii", RED);?

?

?⑧顯示數(shù)字

這個(gè)說(shuō)白還是用到LCD_DispChar

void LCD_DisNum(uint16_t x, uint16_t y, uint32_t num, uint16_t color)

?

?

?                                                            瘋子筆錄

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

?

版權(quán)聲明:本文博客原創(chuàng)文章。博客,未經(jīng)同意,不得轉(zhuǎn)載。

轉(zhuǎn)載于:https://www.cnblogs.com/gcczhongduan/p/4741900.html

總結(jié)

以上是生活随笔為你收集整理的FSMC(STM32)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。