这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » (NRF24L01驱动成功)hanshuyujifen2的 ARM DIY进程贴

共191条 8/20 |‹ 6 7 8 9 10 11 ›| 跳转至
高工
2012-04-18 00:15:32     打赏
71楼
LCD的FSMC配置:
亮出来供参考,深奥的我也搞不明白,不可把玩

void LCD_FSMCConfig(void)
{
  FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
  FSMC_NORSRAMTimingInitTypeDef  p;
/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 4 ----------------------------------------*/
  /* FSMC_Bank1_NORSRAM4 configuration */
  p.FSMC_AddressSetupTime = 1;//地址建立时间
  p.FSMC_AddressHoldTime = 0;//地址保持时间
  p.FSMC_DataSetupTime = 2;//数据建立时间
  p.FSMC_BusTurnAroundDuration = 0;//1;//0;
  p.FSMC_CLKDivision = 0;//0;
  p.FSMC_DataLatency = 0;//0;
  p.FSMC_AccessMode = FSMC_AccessMode_A;
  /* Color LCD configuration ------------------------------------
     LCD configured as follow:
        - Data/Address MUX = Disable
        - Memory Type = SRAM
        - Data Width = 16bit
        - Write Operation = Enable
        - Extended Mode = Enable
        - Asynchronous Wait = Disable */
  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;     //BANK1 的 NE4
  FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;     //关掉地址复用
  FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;                 //GRAM  当成MCU的SRAM处理
  FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;     //16位总线
  FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;  //突发模式访问,不是PSRAM所以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 = &p;
  FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
  FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure); 
  /* BANK 4 (of NOR/SRAM Bank) is enabled */
  FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
}

高工
2012-04-18 00:17:06     打赏
72楼
LCD的控制线配置:
void LCD_CtrlLinesConfig(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* 使能 FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO 时钟 */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |
                         RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG |
                         RCC_APB2Periph_AFIO, ENABLE);

  /* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.08(D13), PD.09(D14),
     PD.10(D15), PD.14(D0), PD.15(D1) as alternate function push pull */
  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_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

  /* Set 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) as alternate function push pull */
  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);
 
  /* Set PF.00(A0 (RS)) as alternate function push pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_Init(GPIOF, &GPIO_InitStructure);
 
  /* Set PG.12(NE4 (LCD/CS)) as alternate function push pull */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
  GPIO_Init(GPIOG, &GPIO_InitStructure);
}

高工
2012-04-18 00:20:16     打赏
73楼
上边两条配置好之后,就可以读取LCD的ID了:
LCD_ReadReg(0x00);  //读取LCD的ID。SSD1289的ID是0x8989

读出LCD的ID  说明你的控制线弄好了,可以进行下一步了。
ID读出来之后再进行LCD的初始化。

高工
2012-04-18 21:15:25     打赏
74楼
LCD 显示英文字符成功,有图有真相:
第一种相当难看的字体:
整体效果



局部特写


换个字体




高工
2012-04-18 22:09:25     打赏
75楼
不错

工程师
2012-04-19 11:32:54     打赏
76楼

速度很快啊


助工
2012-04-19 15:39:57     打赏
77楼

楼主的液晶在哪里买的,能给一个地址不?


高工
2012-04-19 18:29:29     打赏
78楼
置顶贴follow me里边有介绍

菜鸟
2012-04-20 16:38:09     打赏
79楼
[url=http://www.51zxw.net/study.asp?vip=2366214]51自学网-专业培训老师录制的视频教程,让学习变得很轻松[/url]

高工
2012-04-20 21:24:45     打赏
80楼
学了一下天串口接收数据,以前因为串口芯片的问题一直没有实现。现在串口片子好了,弄了下还还挺难的。

晚上实现串口控制流水灯。
因为弄了比较长的时间,通过这个实验我稍微掌握那么一点串口接收数据的出力方式了。
但有些东西比如接收到数据之后,要不要清除中断标志还不太明白
查看DataSheet后发现这样一段话:
在单缓冲器模式里,由软件读USART_DR寄存器完成对RXNE位清除。RXNE标志也可以通
过对它写0来清除。RXNE位必须在下一字符接收结束前被清零,以避免溢出错误。

即:只要从接收寄存器中读出数据,即自动清出RXNE标志位。读出数据后不需要手动清零的

我用的是是串口中断接收。首先要写串口终端函数:
在startup_stm32f10x_hd_vl.s中可以看见,串口1的中断函数是USART1_IRQHandler().
于是在文件 tm32f10x_it.c中添加了这个函数的原型:
void USART1_IRQHandler()
{
    uint8_t Res;
   
    if(USART_GetITStatus(USART1,USART_IT_RXNE)!= RESET)    //检查串口1是否接收到数据
    {
        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
        Res = USART_ReceiveData(USART1);
        switch(Res)
        {
            case '1':
                STM_EVAL_LEDToggle(LED1);
                break;
            case '2':
                STM_EVAL_LEDToggle(LED2);
                break;
            case '3':
                STM_EVAL_LEDToggle(LED3);
                break;
            case '4':
                STM_EVAL_LEDToggle(LED4);
                break;
            default:
                STM_EVAL_LEDToggle(LED1);
                STM_EVAL_LEDToggle(LED2);
                STM_EVAL_LEDToggle(LED3);
                STM_EVAL_LEDToggle(LED4);
                break;       
        }
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
    }
}
这里我实现的功能,控制LED灯反转。发送1、2、3、4分别控制相应的LED。
刚开始使用串口助手,发现每次发数据串口等就全部反转了。
后来检查发现,串口助手里边有个选项叫:发送新行。串口每次发完数据之后,要加入回车换行两个字符。把这个取消掉之后,发送数据能正确控制LED。
串口终端配置代码如下,没什么难度的不解释:
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

    /* Configure the NVIC Preemption Priority Bits */ 
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);    //设置优先级分组:先占优先级0位,从优先级4位
   
    //设置向量表的位置和偏移
    #ifdef  VECT_TAB_RAM 
        /* Set the Vector Table base location at 0x20000000 */
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);         //向量表位于RAM
    #else  /* VECT_TAB_FLASH  */
        /* Set the Vector Table base location at 0x08000000 */
        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   //向量表位于FLASH
    #endif

    /* Enable the USARTy Interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;        //USART1中断
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;        //
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器USART1
}

最后在在主函数中调用USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); 初始化串口1的接收中断,每当接收到数据之后,即可进入中断函数。

共191条 8/20 |‹ 6 7 8 9 10 11 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]