[STM32F4] 【F446RE开发板试用】硬件IIC驱动ADXL345,并使用LCD绘制三个轴...

[复制链接]
3972|3
 楼主| wgsxsm 发表于 2015-10-20 17:47 | 显示全部楼层 |阅读模式
本帖最后由 wgsxsm 于 2015-10-20 17:51 编辑
接上篇:https://bbs.21ic.com/icview-1130438-1-1.html
驱动成功LCD之后,使用LCD来画个什么参数呢?
刚好手头有个自己DIY的NUCLEO+ADXL345模块板
之前是采集三个轴上的值发送到串口,通过串口来绘制的图像,下图为串口接收后数据的绘制的曲线 QQ截图20151020173850.jpg
而现在想把采集的值直接显示到LCD上来
~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~
ADXL345的通讯选择的是IIC模式,虽然都说STM32的硬件IIC有问题,用起来可能会有问题,但是还是想试一下。
结合stm32cubef4压缩包里提供的例子I2C_TwoBoards_ComPolling:STM32Cube_FW_F4_V1.8.0\Projects\STM32446E-Nucleo\Examples\I2C\I2C_TwoBoards_ComPolling
由于该例程使用的硬件IIC的PIN分别是SCL-PB6和SDA-PB9,而我想采用的是PB8和PB9,
为了保险起见,还是使用了STM32CubeMX生成的工程,将生成的代码重新来配置工程中的IIC
QQ截图20151020170015.jpg
QQ截图20151020170926.jpg
硬件部分的图纸如下(BOTTOM层隐藏了一些其他模块的元器件):
QQ截图20151020171255.jpg
QQ截图20151020171646.jpg
模块实物图如下:
1445334345111.jpg

软件部分主要是采用的中值滤波,为了能完全显示到320*240分辨率的LCD上,采集之后的数据比较大,进行了幅值缩小;
然后采用以画线的形式,将采集到的值画在了LCD屏幕上。其中,红色曲线为X轴,绿色曲线为Y轴,蓝色曲线为Z轴
  1. int16_t GetMedianNum(int16_t * bArray, int16_t iFilterLen)
  2. {
  3.     uint16_t i,j;// Ñ­»·±äÁ¿
  4.     int32_t bTemp;

  5.     // ÓÃðÅÝ·¨¶ÔÊý×é½øÐÐÅÅÐò
  6.     for (j = 0; j < iFilterLen - 1; j ++)
  7.     {
  8.         for (i = 0; i < iFilterLen - j - 1; i ++)
  9.         {
  10.             if (bArray[i] > bArray[i + 1])
  11.             {
  12.                 // »¥»»
  13.                 bTemp = bArray[i];
  14.                 bArray[i] = bArray[i + 1];
  15.                 bArray[i + 1] = bTemp;
  16.             }
  17.         }
  18.     }

  19.     // ¼ÆËãÖÐÖµ
  20.     if ((iFilterLen & 1) > 0)
  21.     {
  22.         // Êý×éÓÐÆæÊý¸öÔªËØ£¬·µ»ØÖмäÒ»¸öÔªËØ
  23.         bTemp = bArray[(iFilterLen + 1) / 2];
  24.     }
  25.     else
  26.     {
  27.         // Êý×éÓÐżÊý¸öÔªËØ£¬·µ»ØÖмäÁ½¸öÔªËØÆ½¾ùÖµ
  28.         bTemp = (bArray[iFilterLen / 2] + bArray[iFilterLen / 2 + 1]) / 2;
  29.     }

  30.     return (int16_t)bTemp;
  31. }

  32. /**
  33.   * [url=home.php?mod=space&uid=247401]@brief[/url]  Main program
  34.   * @param  None
  35.   * @retval None
  36.   */
  37. int main(void)
  38. {
  39.         
  40.     uint16_t i=0,j=0;
  41.     int16_t readingX[20],readingY[20],readingZ[20];
  42.     int16_t o_X0=0,o_Y0=0,o_Z0=0;
  43.                 int16_t o_X1,o_Y1,o_Z1;
  44.         
  45.   /* STM32F4xx HAL library initialization:
  46.        - Configure the Flash prefetch, instruction and Data caches
  47.        - Configure the Systick to generate an interrupt each 1 msec
  48.        - Set NVIC Group Priority to 4
  49.        - Global MSP (MCU Support Package) initialization
  50.      */
  51.   HAL_Init();
  52.   
  53.   /* Configure the system clock to 180 MHz */
  54.   SystemClock_Config();
  55.    
  56.   /* Configure LED2 */
  57.   BSP_LED_Init(LED2);        
  58.         
  59.         MX_I2C1_Init();

  60.   /* Output SYSCLK  on MCO2 pin(PC.09) */
  61.   HAL_RCC_MCOConfig(RCC_MCO2, RCC_MCO2SOURCE_SYSCLK, RCC_MCODIV_1);
  62.         
  63.         LCD_Init();
  64.         GetFontsWidth();        //fonts width get
  65.         
  66.         if(ADXL_getDevId() == 0xE5)        LCD_WriteString(0,0,(uint8_t *)"ADXL345 is OK!",&Font32x32,BLACK,WHITE,USEBACKCOLOR);
  67.         else                                                                                                return        1;
  68.         
  69.         //Go into standby mode to configure the device.
  70.         ADXL_setPowerControl(0x00);

  71.         //Full resolution, +/-16g, 4mg/LSB.
  72.         ADXL_setDataFormatControl(0x0B);

  73.         //3.2kHz data rate.
  74.         ADXL_setDataRate(ADXL345_3200HZ);

  75.         //Measurement mode.
  76.         ADXL_setPowerControl(0x08);        

  77.   /*##-3- Toggle PA05 IO in an infinite loop #################################*/  
  78.   while (1)
  79.   {
  80.                 readingX[j]=ADXL_getAx()/3;                //ËõСÕñ·ù
  81.                 readingY[j]=ADXL_getAy()/3;                //ËõСÕñ·ù
  82.                 readingZ[j]=ADXL_getAz()/3;                //ËõСÕñ·ù

  83.                 j++;
  84.                 if(j==20)   j=0;
  85.                
  86.                 LCD_DrawLine(i+2,40,i+2,239,WHITE);
  87.                 LCD_DrawLine(i+3,40,i+3,239,WHITE);
  88.                
  89.                 o_X1=GetMedianNum(readingX,20);
  90.                 LCD_DrawLine(i,o_X0+139,i+1,o_X1+139,RED);
  91.                 o_X0=o_X1;
  92.                
  93.                 o_Y1=GetMedianNum(readingY,20);
  94.                 LCD_DrawLine(i,o_Y0+139,i+1,o_Y1+139,GREEN);
  95.                 o_Y0=o_Y1;
  96.                
  97.                 o_Z1=GetMedianNum(readingZ,20);
  98.                 LCD_DrawLine(i,o_Z0+139,i+1,o_Z1+139,BLUE);
  99.                 o_Z0=o_Z1;
  100.                
  101.                 i++;
  102.                 if(i==320)        
  103.                 {
  104.                         i=0;               
  105.                         LCD_DrawLine(0,40,0,239,WHITE);
  106.                         LCD_DrawLine(1,40,1,239,WHITE);
  107.                 }

  108.                 BSP_LED_Toggle(LED2);
  109.                 HAL_Delay(50);

  110.   }
  111. }

  112. /**
  113.   * [url=home.php?mod=space&uid=247401]@brief[/url]  System Clock Configuration
  114.   *         The system Clock is configured as follow :
  115.   *            System Clock source            = PLL (HSE)
  116.   *            SYSCLK(Hz)                     = 180000000
  117.   *            HCLK(Hz)                       = 180000000
  118.   *            AHB Prescaler                  = 1
  119.   *            APB1 Prescaler                 = 4
  120.   *            APB2 Prescaler                 = 2
  121.   *            HSE Frequency(Hz)              = 8000000
  122.   *            PLL_M                          = 8
  123.   *            PLL_N                          = 360
  124.   *            PLL_P                          = 2
  125.   *            PLL_Q                          = 7
  126.   *            PLL_R                          = 2
  127.   *            VDD(V)                         = 3.3
  128.   *            Main regulator output voltage  = Scale1 mode
  129.   *            Flash Latency(WS)              = 5
  130.   * @param  None
  131.   * @retval None
  132.   */
  133. static void SystemClock_Config(void)
  134. {
  135.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  136.   RCC_OscInitTypeDef RCC_OscInitStruct;
  137.   HAL_StatusTypeDef ret = HAL_OK;

  138.   /* Enable Power Control clock */
  139.   __HAL_RCC_PWR_CLK_ENABLE();

  140.   /* The voltage scaling allows optimizing the power consumption when the device is
  141.      clocked below the maximum system frequency, to update the voltage scaling value
  142.      regarding system frequency refer to product datasheet.  */
  143.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);

  144.   /* Enable HSE Oscillator and activate PLL with HSE as source */
  145.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  146.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  147.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  148.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  149.   RCC_OscInitStruct.PLL.PLLM = 8;
  150.   RCC_OscInitStruct.PLL.PLLN = 360;
  151.   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  152.   RCC_OscInitStruct.PLL.PLLQ = 7;
  153.   RCC_OscInitStruct.PLL.PLLR = 2;
  154.   
  155.   ret = HAL_RCC_OscConfig(&RCC_OscInitStruct);
  156.   if(ret != HAL_OK)
  157.   {
  158.     while(1) { ; }
  159.   }
  160.   
  161.   /* Activate the OverDrive to reach the 180 MHz Frequency */  
  162.   ret = HAL_PWREx_EnableOverDrive();
  163.   if(ret != HAL_OK)
  164.   {
  165.     while(1) { ; }
  166.   }
  167.   
  168.   /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */
  169.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  170.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  171.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  172.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;  
  173.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;  
  174.   
  175.   ret = HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);
  176.   if(ret != HAL_OK)
  177.   {
  178.     while(1) { ; }
  179.   }
  180. }
采集的视频如下,由于LCD的坐标原点为左上角,所以显示的时候可能会有倒置的现象。

~~~~~~~~~~~~~~~~~~~~~~~~分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~
代码包如下:
压缩包解压到你的这个目录下面:
XX\XX\NUCLEO-STM32F446\STM32Cube_FW_F4_V1.8.0\Projects\STM32446E-Nucleo\Examples
GPIO-20151020.zip (279.24 KB, 下载次数: 136)






xizoukou 发表于 2016-12-26 10:34 | 显示全部楼层
工程不能编译啊,
冰河w 发表于 2016-12-27 21:26 | 显示全部楼层
楼主用的什么编译软件,能不能分享一下
wahahaheihei 发表于 2016-12-27 23:35 | 显示全部楼层
驱动程序还可以,弄到我的工程里试试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

652

帖子

4

粉丝
快速回复 在线客服 返回列表 返回顶部