OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4227|回复: 12

菜鸟开贴,学习STM32F4

[复制链接]

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
发表于 2016-6-29 01:09:59 | 显示全部楼层 |阅读模式
本帖最后由 mingjie2015 于 2016-6-29 07:29 编辑

学习板 探索者STM32F4
起始时间:2016年06月29日
更新时间:尽量做到每天更新
目标:完成开发板大部分内容(时间因情况而定)

相关参考:
(1)正点原子STM32F4相关资料
(2)安福莱V5开发板相关资料
(3)网友龙之谷 《菜鸟开帖,持续更新90天,顺序学习开发板大部分实验,以此帖作为一个坚持的动力》

谨以此贴作为学习STM32F4的资料,方面自己以后查找。





正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
 楼主| 发表于 2016-6-29 07:29:41 | 显示全部楼层
2016年06月29日  周三    例程:跑马灯实验
(1)    管脚
LED0     : PF9        (低电平点亮,高电平熄灭)
LED1     : PF10        (低电平点亮,高电平熄灭)
(2)      相关代码

[mw_shl_code=c,true]led.h文件
#define RCC_ALL_LED         (RCC_AHB1Periph_GPIOF)

#define GPIO_PORT_LED0  GPIOF
#define GPIO_PIN_LED0        GPIO_Pin_9

#define GPIO_PORT_LED1  GPIOF
#define GPIO_PIN_LED1        GPIO_Pin_10

void bsp_InitLed(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
      
        RCC_AHB1PeriphClockCmd(RCC_ALL_LED, ENABLE);
      
        bsp_LedOff(1);
        bsp_LedOff(2);
      
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;               
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;               
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;      
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;      

        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED0;               
        GPIO_Init(GPIO_PORT_LED0, &GPIO_InitStructure);
      
        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_LED1;               
        GPIO_Init(GPIO_PORT_LED1, &GPIO_InitStructure);
}

void bsp_LedOn(uint8_t _no)
{
        if (_no == 0)
        {
                GPIO_PORT_LED0->BSRRH = GPIO_PIN_LED0;
        }
        else if(_no == 1)
        {
                GPIO_PORT_LED1->BSRRH = GPIO_PIN_LED1;
        }
}

void bsp_LedOff(uint8_t _no)
{
        if (_no == 0)
        {
                GPIO_PORT_LED0->BSRRL = GPIO_PIN_LED0;
        }
        else if (_no == 1)
        {
                GPIO_PORT_LED1->BSRRL = GPIO_PIN_LED1;
        }
}

void bsp_LedToggle(uint8_t _no)
{
        if (_no == 0)
        {
                GPIO_PORT_LED0->ODR ^= GPIO_PIN_LED0;
        }
        else if (_no == 1)
        {
                GPIO_PORT_LED1->ODR ^= GPIO_PIN_LED1;
        }
}

uint8_t bsp_IsLedOn(uint8_t _no)
{
        if (_no == 0)
        {
                if (((GPIO_PORT_LED0->ODR) & GPIO_PIN_LED0) == 0)
                {
                        return 1;
                }
                return 0;
        }
        else if (_no == 1)
        {
                if (((GPIO_PORT_LED1->ODR) & GPIO_PIN_LED1) == 0)
                {
                        return 1;
                }
                return 0;
        }
        return 0;
}
main.c文件
        bsp_Init();               

        bsp_StartAutoTimer(0, 100);      

        while (1)
        {

                if (bsp_CheckTimer(0))
                {
                        bsp_LedToggle(0);      
                        bsp_LedToggle(1);
                }

        }[/mw_shl_code]

(3)      总结

跑马灯实验主要知识点在于GPIO口配置,以及相关函数的代码实现,代码关于定时器相关内容以后详细介绍
代码中使用寄存器
GPIOx->BSRRH = GPIO_Pin
     GPIOx->BSRRL = GPIO_Pin
     GPIOx->ODR ^= GPIO_PIN_LED
     (GPIOx->ODR & GPIO_PIN_LED0)
为库函数stm32F4xx_gpio.c中内容

Keil修改工程名
假设原来的工程文件名是first,要改成second
1.在工程文件目录中,将first.uvopt和first.uvproj名字改成second.uvopt和second.uvproj。
2.其他first文件统统删除。
3.打开second.uvproj,
4.点击品字形图标,在弹出的界面上,双击“Project Itemts”下面的工程名,修改成second
5.点击project》Options for..》Output,将Name of Executeable中的名称改为second即可
6.从新编译,若编译后还有带first名的文件,删除后重新编译即可。
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-6-29 08:56:41 | 显示全部楼层
一勤天下无难事,功夫不负有心人。
与君共勉,加油~~~~~
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

6

主题

201

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1149
金钱
1149
注册时间
2015-11-13
在线时间
267 小时
发表于 2016-6-29 09:35:18 | 显示全部楼层
前排支持!

加油!
回复 支持 反对

使用道具 举报

4

主题

49

帖子

0

精华

高级会员

Rank: 4

积分
622
金钱
622
注册时间
2016-5-11
在线时间
40 小时
发表于 2016-6-29 10:02:20 | 显示全部楼层
完事开头难...
加油...
回复 支持 反对

使用道具 举报

12

主题

44

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
372
金钱
372
注册时间
2015-12-2
在线时间
58 小时
发表于 2016-6-29 11:17:48 | 显示全部楼层
支持一下!加油
回复 支持 反对

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
 楼主| 发表于 2016-6-30 07:58:18 | 显示全部楼层
本帖最后由 mingjie2015 于 2016-6-30 07:59 编辑

2016年06月30日  周四    例程:外部中断实验

(1) 管脚
        按键口线分配:
                        K0 键      : PE4  (低电平表示按下)
                        K1 键      : PE3  (低电平表示按下)
                        K2 键      : PE2  (低电平表示按下)
                        WK_UP  :PA0  (高电平表示按下)
(2)相关知识点
A.  
同时复用PA0,PB0…..等引脚到EXTI_Line0,那么这时只有一个引脚上面的外部中断是有效的,也就是说我们只能设置一个引脚到外部中断0有效的,也就是说我们只能设置一个引脚到外部中断0
其他管脚类似
B.需要用到的库函数文件
stm32f4xx_exti.c
stm32f4xx_syscfg.c
stm32f4xx_gpio.c
C.外部中断对应的中断函数
EXTI0_IRQHandler                  ; EXTI Line0                                             
EXTI1_IRQHandler                  ; EXTI Line1                                             
EXTI2_IRQHandler                  ; EXTI Line2                                             
EXTI3_IRQHandler                  ; EXTI Line3                                             
EXTI4_IRQHandler                  ; EXTI Line4   
EXTI9_5_IRQHandler                ; External Line[9:5]s
EXTI15_10_IRQHandler              ; External Line[15:10]s      
其中5~9在一个中断函数里面处理,其中10~15在一个中断函数里面处理
(3)相关代码
[mw_shl_code=c,true]初始化相应管脚
        GPIO_InitTypeDef GPIO_InitStructure;
        
        RCC_AHB1PeriphClockCmd(RCC_ALL_KEY,ENABLE);
        
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;                /* 设为输入口 */
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        /* IO口最大速度 */
        
        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K0;        
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                /* 设置上下拉电阻 */        
        GPIO_Init(GPIO_PORT_K0, &GPIO_InitStructure);                /* GPIO_PORT_K0 */
        
        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K1;                        
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                /* 设置上下拉电阻 */
        GPIO_Init(GPIO_PORT_K1, &GPIO_InitStructure);                /* GPIO_PORT_K1 */

        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_K2;               
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                /* 设置上下拉电阻 */        
        GPIO_Init(GPIO_PORT_K2, &GPIO_InitStructure);                /* GPIO_PORT_K2 */

        GPIO_InitStructure.GPIO_Pin = GPIO_PIN_UP;        
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;                /* 设置上下拉电阻 */        
        GPIO_Init(GPIO_PORT_UP, &GPIO_InitStructure);                /* GPIO_PORT_UP */}
初始化外部中断
void bsp_InitKeyEXTI(void)
{
        EXTI_InitTypeDef   EXTI_InitStructure;
        NVIC_InitTypeDef   NVIC_InitStructure;
        
        /* 使能SYSCFG时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
        
        /* 连接 EXTI Line2 到 PE2 引脚 */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
        /* 连接 EXTI Line3 到 PE3 引脚 */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource3);
        /* 连接 EXTI Line4 到 PE4 引脚 */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource4);
        /* 连接 EXTI Line0 到 PA0 引脚 */
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
        
        EXTI_InitStructure.EXTI_Line = EXTI_Line2 | EXTI_Line3 | EXTI_Line4;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        
        EXTI_InitStructure.EXTI_Line = EXTI_Line0;
        EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
        
        NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}
未完待续[/mw_shl_code]
(4)        总结
待添加

回复 支持 反对

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
 楼主| 发表于 2016-7-12 22:24:14 | 显示全部楼层
本帖最后由 mingjie2015 于 2016-7-14 15:18 编辑

2016年07月12日 lcd液晶显示(一)在开发过程中使用液晶或者串口来显示调试信息比较直观的显示需要显示的信息,lcd采用的芯片为ILI9341,3.2寸液晶屏分辨率为320*240
一.引脚定义
[mw_shl_code=c,true](1)16根数据线:
PD0/FSMC_D2
PD1/FSMC_D3
PD8/FSMC_D13
PD9/FSMC_D14
PD10/FSMC_D15
PD14/FSMC_D0
PD15/FSMC_D1

PE7/FSMC_D4
PE8/FSMC_D5
PE9/FSMC_D6
PE10/FSMC_D7
PE11/FSMC_D8
PE12/FSMC_D9
PE13/FSMC_D10
PE14/FSMC_D11
PE15/FSMC_D12
(2)1根地址线:
PF12/FSMC_ A6
(3)控制线:
PD4/FSMC_NOE               
PD5/FSMC_NWE        
PG12/FSMC_NE4               
PB15/LCD_BL
RESET   直接连接在单片机RESET脚上二.IO口初始化
static void LCD_CtrlLinesConfig(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;

        /* 使能FSMC时钟 */
        RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);

        /* 使能 GPIO时钟 */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);

        /* 设置 PD.00(D2), PD.01(D3), PD.08(D13), PD.09(D14),
         PD.10(D15), PD.14(D0), PD.15(D1), PD.04(NOE), PD.05(NWE), 为复用推挽输出 */

        GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |
                                    GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |
                                    GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
        GPIO_Init(GPIOD, &GPIO_InitStructure);

        /* 设置 PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
         PE.14(D11), PE.15(D12) 为复用推挽输出 */

        GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | 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_Init(GPIOE, &GPIO_InitStructure);

        /* 设置 PF.12(A6 (RS))  为复用推挽输出 */
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource6, GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
        GPIO_Init(GPIOF, &GPIO_InitStructure);

        /* 设置 PG12 (LCD/CS)) 为复用推挽输出 */
        GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
        GPIO_Init(GPIOG, &GPIO_InitStructure);
}
static void LCD_FSMCConfig(void)
{
        FSMC_NORSRAMInitTypeDef  init;
        FSMC_NORSRAMTimingInitTypeDef  timingWrite;
        FSMC_NORSRAMTimingInitTypeDef  timingRead;

        /*-- FSMC Configuration ------------------------------------------------------*/
        /*----------------------- SRAM Bank 4 ----------------------------------------*/
        /* FSMC_Bank1_NORSRAM4 configuration */
        
        timingRead.FSMC_AddressSetupTime = 0XF;         //地址建立时间(ADDSET)为16个HCLK 1/168M=6ns*16=96ns        
        timingRead.FSMC_AddressHoldTime = 0x00;         //地址保持时间(ADDHLD)模式A未用到        
        timingRead.FSMC_DataSetupTime = 60;                        //数据保存时间为60个HCLK        =6*60=360ns
        timingRead.FSMC_BusTurnAroundDuration = 0x00;
        timingRead.FSMC_CLKDivision = 0x00;
        timingRead.FSMC_DataLatency = 0x00;
        timingRead.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A


        timingWrite.FSMC_AddressSetupTime =9;              //地址建立时间(ADDSET)为9个HCLK =54ns
        timingWrite.FSMC_AddressHoldTime = 0x00;         //地址保持时间(A               
        timingWrite.FSMC_DataSetupTime = 8;                 //数据保存时间为6ns*9个HCLK=54ns
        timingWrite.FSMC_BusTurnAroundDuration = 0x00;
        timingWrite.FSMC_CLKDivision = 0x00;
        timingWrite.FSMC_DataLatency = 0x00;
        timingWrite.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A

        /*
         LCD configured as follow:
            - Data/Address MUX = Disable
            - Memory Type = SRAM
            - Data Width = 16bit
            - Write Operation = Enable
            - Extended Mode = Enable
            - Asynchronous Wait = Disable
        */
                                                                                                                                /* - BANK 1 (of NOR/SRAM Bank 1~4) is enabled */
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
        
        init.FSMC_Bank = FSMC_Bank1_NORSRAM4;                                                /* 这里我们使用NE4 ,也就对应BTCR[6],[7] */
        init.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;         /* 不复用数据地址 */
        init.FSMC_MemoryType =FSMC_MemoryType_SRAM;                                  /* FSMC_MemoryType_SRAM;SRAM */  
        init.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;                /* 存储器数据宽度为16bit */
        init.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;        /*  FSMC_BurstAccessMode_Disable; */
        init.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        init.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
        init.FSMC_WrapMode = FSMC_WrapMode_Disable;   
        init.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
        init.FSMC_WriteOperation = FSMC_WriteOperation_Enable;                /* 存储器写使能 */  
        init.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   
        init.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;                         /* 读写使用不同的时序 */
        init.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
        init.FSMC_ReadWriteTimingStruct = &timingRead;                 /* 读写时序 */
        init.FSMC_WriteTimingStruct = &timingWrite;                                  /* 写时序 */

        FSMC_NORSRAMInit(&init);                                                                          /* 初始化FSMC配置 */

        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);                                /* 使能BANK1 */
}
因RESER引脚直接连接在单片机引脚上,故不需要配置RESET管脚读芯片ID
uint16_t ILI9341_ReadID(void)
{                        
        uint8_t buf[4];

        ILI9341_REG = 0xD3;
        buf[0] = ILI9341_RAM;
        buf[1] = ILI9341_RAM;
        buf[2] = ILI9341_RAM;
        buf[3] = ILI9341_RAM;

        return (buf[1] << 16) + (buf[2] << 8) + buf[3];
}驱动ILI9341
void Init_ILI9341(void)
{
                ILI9341_WriteCmd(0xCF);  
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0xC1);
                ILI9341_WriteParam(0X30);
        
                ILI9341_WriteCmd(0xED);  
                ILI9341_WriteParam(0x64);
                ILI9341_WriteParam(0x03);
                ILI9341_WriteParam(0X12);
                ILI9341_WriteParam(0X81);
        
                ILI9341_WriteCmd(0xE8);  
                ILI9341_WriteParam(0x85);
                ILI9341_WriteParam(0x10);
                ILI9341_WriteParam(0x7A);
                ILI9341_WriteCmd(0xCB);  
                ILI9341_WriteParam(0x39);
                ILI9341_WriteParam(0x2C);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x34);
                ILI9341_WriteParam(0x02);
                ILI9341_WriteCmd(0xF7);  
                ILI9341_WriteParam(0x20);
                ILI9341_WriteCmd(0xEA);  
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteCmd(0xC0);    //Power control
                ILI9341_WriteParam(0x1B);   //VRH[5:0]
                ILI9341_WriteCmd(0xC1);    //Power control
                ILI9341_WriteParam(0x01);   //SAP[2:0];BT[3:0]
                ILI9341_WriteCmd(0xC5);    //VCM control
                ILI9341_WriteParam(0x30);          //3F
                ILI9341_WriteParam(0x30);          //3C
                ILI9341_WriteCmd(0xC7);    //VCM control2
                ILI9341_WriteParam(0XB7);
                ILI9341_WriteCmd(0x36);    // Memory Access Control
                ILI9341_WriteParam(0x48);
                ILI9341_WriteCmd(0x3A);   
                ILI9341_WriteParam(0x55);
                ILI9341_WriteCmd(0xB1);   
                ILI9341_WriteParam(0x00);   
                ILI9341_WriteParam(0x1A);
                ILI9341_WriteCmd(0xB6);    // Display Function Control
                ILI9341_WriteParam(0x0A);
                ILI9341_WriteParam(0xA2);
                ILI9341_WriteCmd(0xF2);    // 3Gamma Function Disable
                ILI9341_WriteParam(0x00);
                ILI9341_WriteCmd(0x26);    //Gamma curve selected
                ILI9341_WriteParam(0x01);
                ILI9341_WriteCmd(0xE0);    //Set Gamma
                ILI9341_WriteParam(0x0F);
                ILI9341_WriteParam(0x2A);
                ILI9341_WriteParam(0x28);
                ILI9341_WriteParam(0x08);
                ILI9341_WriteParam(0x0E);
                ILI9341_WriteParam(0x08);
                ILI9341_WriteParam(0x54);
                ILI9341_WriteParam(0XA9);
                ILI9341_WriteParam(0x43);
                ILI9341_WriteParam(0x0A);
                ILI9341_WriteParam(0x0F);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x00);                  
                ILI9341_WriteCmd(0XE1);    //Set Gamma
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x15);
                ILI9341_WriteParam(0x17);
                ILI9341_WriteParam(0x07);
                ILI9341_WriteParam(0x11);
                ILI9341_WriteParam(0x06);
                ILI9341_WriteParam(0x2B);
                ILI9341_WriteParam(0x56);
                ILI9341_WriteParam(0x3C);
                ILI9341_WriteParam(0x05);
                ILI9341_WriteParam(0x10);
                ILI9341_WriteParam(0x0F);
                ILI9341_WriteParam(0x3F);
                ILI9341_WriteParam(0x3F);
                ILI9341_WriteParam(0x0F);
                ILI9341_WriteCmd(0x2B);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x01);
                ILI9341_WriteParam(0x3f);
                ILI9341_WriteCmd(0x2A);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0x00);
                ILI9341_WriteParam(0xef);         
                ILI9341_WriteCmd(0x11); //Exit Sleep
                bsp_DelayMS(120);
                ILI9341_WriteCmd(0x29); //display on        
                ILI9341_SetDirection(0);                         //默认为竖屏
                bsp_LedOff(1);                                //点亮背光
}
void ILI9341_SetDirection(uint8_t _ucDir)
{
        ILI9341_WriteCmd(0x36);
        /* 0 表示竖屏(排线在下),1表示竖屏(排线在上), 2表示横屏(排线在左边)  3表示横屏 (排线在右边) */
        if (_ucDir == 0)
        {
                ILI9341_WriteParam(0xA8);        /* 横屏(排线在左边) */
                g_LcdHeight = 240;
                g_LcdWidth = 320;
        }
        else if (_ucDir == 1)
        {
                ILI9341_WriteParam(0x68);        /* 横屏 (排线在右边) */
                g_LcdHeight = 240;
                g_LcdWidth = 320;
        }
        else if (_ucDir == 2)
        {
                ILI9341_WriteParam(0xC8);        /* 竖屏(排线在上) */
                g_LcdHeight = 240;
                g_LcdWidth = 320;
        }
        else if (_ucDir == 3)
        {
                ILI9341_WriteParam(0x08);        /* 竖屏(排线在下) */
                g_LcdHeight = 240;
                g_LcdWidth = 320;
        }
}

static void ILI9341_SetDispWin(uint16_t _usX, uint16_t _usY, uint16_t _usHeight, uint16_t _usWidth)
{
        ILI9341_WriteCmd(0X2A);                 /* 设置X坐标 */
        ILI9341_WriteParam(_usX >> 8);        /* 起始点 */
        ILI9341_WriteParam(_usX);
        ILI9341_WriteParam((_usX + _usWidth - 1) >> 8);        /* 结束点 */
        ILI9341_WriteParam(_usX + _usWidth - 1);

        ILI9341_WriteCmd(0X2B);                                   /* 设置Y坐标*/
        ILI9341_WriteParam(_usY >> 8);   /* 起始点 */
        ILI9341_WriteParam(_usY);
        ILI9341_WriteParam((_usY + _usHeight - 1) >>8);                /* 结束点 */
        ILI9341_WriteParam((_usY + _usHeight - 1));
}
void ILI9341_ClrScr(uint16_t _usColor)
{
        uint32_t i;
        uint32_t n;

        ILI9341_SetDispWin(0, 0, g_LcdHeight, g_LcdWidth);

        ILI9341_REG = 0x2C;                         /* 准备读写显存 */
        n = g_LcdHeight * g_LcdWidth;
        for (i = 0; i < n; i++)
        {
                ILI9341_RAM = _usColor;
        }

}
[/mw_shl_code]
基本上可以驱动ILI9341 3.2寸液晶屏了
这里有个关于液晶模块的例子看着不错 针对不同液晶   同样针对其他模块也可以按照这种方式处理,增加代码的兼容性,便于扩展有兴趣的可以参考一下
http://www.openedv.com/forum.php ... D%B5%E3%D4%AD%D7%D3








回复 支持 反对

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
 楼主| 发表于 2016-7-14 07:49:22 | 显示全部楼层
本帖最后由 mingjie2015 于 2016-7-15 11:17 编辑

2016年07月14日 SRAM学习
在开发过程中由于CPU自带RAM不够用(比如emwin开发时),可以通过外扩SRAM来实现。
相关代码
[mw_shl_code=c,true]FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDef  readwritetiming;
        GPIO_InitTypeDef GPIO_InitStructure;

        /* 使能GPIO时钟 */
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF |
                     RCC_AHB1Periph_GPIOG, ENABLE);

        /* 使能 FSMC 时钟 */
        RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);

        /* SRAM 的 GPIO :
                PD0/FSMC_D2
                PD1/FSMC_D3
                PD4/FSMC_NOE
                PD5/FSMC_NWE
                PD8/FSMC_D13
                PD9/FSMC_D14
                PD10/FSMC_D15
                PD11/FSMC_A16
                PD12/FSMC_A17
                PD13/FSMC_A18
                PD14/FSMC_D0
                PD15/FSMC_D1

                PE0/FSMC_NBL0
                PE1/FSMC_NBL1
                PE7/FSMC_D4
                PE8/FSMC_D5
                PE9/FSMC_D6
                PE10/FSMC_D7
                PE11/FSMC_D8
                PE12/FSMC_D9
                PE13/FSMC_D10
                PE14/FSMC_D11
                PE15/FSMC_D12

                PF0/FSMC_A0
                PF1/FSMC_A1
                PF2/FSMC_A2
                PF3/FSMC_A3
                PF4/FSMC_A4
                PF5/FSMC_A5
                PF12/FSMC_A6
                PF13/FSMC_A7
                PF14/FSMC_A8
                PF15/FSMC_A9

                PG0/FSMC_A10
                PG1/FSMC_A11
                PG2/FSMC_A12
                PG3/FSMC_A13
                PG4/FSMC_A14
                PG5/FSMC_A15
                PG10/FSMC_NE3        --- 片选主信号
        */

        /* GPIOD configuration */
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource11, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource12, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource13, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_4  | GPIO_Pin_5  |
                            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.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

        GPIO_Init(GPIOD, &GPIO_InitStructure);


        /* GPIOE configuration */
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource0 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource1 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1 | GPIO_Pin_7 |
                            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_Init(GPIOE, &GPIO_InitStructure);


        /* GPIOF configuration */
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource1 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource2 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource3 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource4 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource5 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource12 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource13 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource14 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOF, GPIO_PinSource15 , GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_2  | GPIO_Pin_3  |
                            GPIO_Pin_4  | GPIO_Pin_5  | GPIO_Pin_12 | GPIO_Pin_13 |
                            GPIO_Pin_14 | GPIO_Pin_15;

        GPIO_Init(GPIOF, &GPIO_InitStructure);


        /* GPIOG configuration */
        GPIO_PinAFConfig(GPIOG, GPIO_PinSource0 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOG, GPIO_PinSource1 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOG, GPIO_PinSource2 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOG, GPIO_PinSource3 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOG, GPIO_PinSource4 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOG, GPIO_PinSource5 , GPIO_AF_FSMC);
        GPIO_PinAFConfig(GPIOG, GPIO_PinSource10 , GPIO_AF_FSMC);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_2  | GPIO_Pin_3 |
                            GPIO_Pin_4  | GPIO_Pin_5  |GPIO_Pin_10;

        GPIO_Init(GPIOG, &GPIO_InitStructure);

        /*-- FSMC Configuration ------------------------------------------------------*/
        readwritetiming.FSMC_AddressSetupTime = 0x00;         /*地址建立时间(ADDSET)为1个HCLK 1/36M=27ns*/
        readwritetiming.FSMC_AddressHoldTime = 0x00;         /*地址保持时间(ADDHLD)模式A未用到        */
        readwritetiming.FSMC_DataSetupTime = 0x08;                 /*数据保持时间(DATAST)为9个HCLK 6*9=54ns                 */
        readwritetiming.FSMC_BusTurnAroundDuration = 0x00;
        readwritetiming.FSMC_CLKDivision = 0x00;
        readwritetiming.FSMC_DataLatency = 0x00;
        readwritetiming.FSMC_AccessMode = FSMC_AccessMode_A;         //模式A


        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM3;/*这里我们使用NE3 ,也就对应BTCR[4],[5]。*/  
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;/*FSMC_MemoryType_SRAM;  SRAM */   
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;/*存储器数据宽度为16bit  */
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;/* FSMC_BurstAccessMode_Disable; */
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
        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 = &readwritetiming;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readwritetiming; /*读写同样时序*/

        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  /*初始化FSMC配置*/

        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM3, ENABLE);  /*使能BANK1区域3*/ [/mw_shl_code]
建议:
将KEIL中编码格式设置为GB2312 格式方便代码拷贝,防止汉字注释乱码
Edit->Configuration->Editor->Encoding->Chinese GB2312(Simplified)
emwin中PNG图片转换成的32位带alpha通道的BMP图片
http://bbs.armfly.com/read.php?tid=12660






回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2016-7-11
在线时间
7 小时
发表于 2016-7-14 08:24:30 | 显示全部楼层
我也刚开始,一起加油
回复 支持 反对

使用道具 举报

7

主题

266

帖子

0

精华

高级会员

Rank: 4

积分
671
金钱
671
注册时间
2014-7-6
在线时间
105 小时
发表于 2016-7-14 08:44:24 | 显示全部楼层
什么叫尽量每天更新?应该是必须每天更新,要有决心
回复 支持 反对

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
 楼主| 发表于 2016-7-14 17:08:12 | 显示全部楼层
本帖最后由 mingjie2015 于 2016-7-16 14:41 编辑
木瓜 发表于 2016-7-14 08:44
什么叫尽量每天更新?应该是必须每天更新,要有决心

有些实验一时半会玩不成
回复 支持 反对

使用道具 举报

3

主题

126

帖子

0

精华

高级会员

Rank: 4

积分
776
金钱
776
注册时间
2015-2-28
在线时间
251 小时
 楼主| 发表于 2016-7-14 21:31:06 | 显示全部楼层
本帖最后由 mingjie2015 于 2016-7-18 19:34 编辑

2016年07月14 日  触摸屏学习
目前最常用的触摸屏有两种:电阻式触摸屏和电容式触摸屏。
电阻式触摸屏采用检测电阻来定位触摸位置。
电容式触摸屏利用人体感应进行触点控制,通过检测感应电流来定位触摸坐标。
使用的触摸屏为3.2寸电阻式触摸屏,控制芯片为XPT2046.
XPT2046是四线触摸控制器。XPT2046通过执行2次A/D转换查出被按的位置(1)管脚
T_MOSI     PF11
T_MISO     PB2
T_CS         PC13
T_CLK        PB0
T_PEN        PB1
以上都不是专用的SPI或者IIC接口,故采用模拟方式操作触摸屏(1)初始化管脚
[mw_shl_code=c,true]void XPT2046_Init(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;        
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOB,C,F时钟

        //GPIOB1,2初始化设置
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;//PB1/PB2 设置为上拉输入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//输入模式
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PB0设置为推挽输出
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
        GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;//PC13设置为推挽输出
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
        GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PF11设置推挽输出
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出模式
        GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化               
}[/mw_shl_code]

我这触摸屏还没弄完呢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-27 18:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表