[STM32F0] ST学习季+基于STM32F030的机智云功能板驱动

[复制链接]
 楼主| jinglixixi 发表于 2017-6-5 11:12 | 显示全部楼层 |阅读模式

曾购置过一块机智云的开发板,本期待是STM32F103为核心的底板,不曾想却是基于ATMEGA328核心的底板。  
为了能使之与手中的ST开发板相配合使用,故决定在STM32F030的开发板上实现对该机智云功能板的驱动开发,从而避免它被闲置在一旁的**。
就机智云功能板来说,它共RGB_LED、小电机、红外感应器、小按键、温湿度传感器、WIFI模块及OLED接口等,如图1所示。限于时间的关系,这里仅对RGB_LED、小电机、红外感应、小按键及OLED接口的使用加以介绍。
图片1.png
1 机智云功能板
1.OLED接口
功能板上提供了OLED接口,该接口如图2所示。由于手头并没有SPI接口的OLED屏,而只有一块LCD5110屏,故决定用该接口来支持LCD5110屏显示。由于两者的接口并不一致,所以需进行稍许改造,具体的做法是将GNDNC引脚短接,这样就使LCD5110SCE引脚有了所需的控制信号。其它的只需修改引脚的定义即可。
图片2.png
2 OLED接口
LCD5110各引脚输出高低电平的定义语句如下:
#define SetLCD_RST_High()           GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_SET);
#define SetLCD_RST_Low()           GPIO_WriteBit(GPIOA, GPIO_Pin_7, Bit_RESET);
#define SetLCD_DC_High()           GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_SET);
#define SetLCD_DC_Low()             GPIO_WriteBit(GPIOA, GPIO_Pin_5, Bit_RESET);
#define SetLCD_SDIN_High()   GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_SET);
#define SetLCD_SDIN_Low()           GPIO_WriteBit(GPIOB, GPIO_Pin_6, Bit_RESET);
#define SetLCD_SCLK_High()   GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_SET);
#define SetLCD_SCLK_Low()           GPIO_WriteBit(GPIOC, GPIO_Pin_7, Bit_RESET);
#define SetLCD_LED_High()    GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_SET);
#define SetLCD_LED_Low()           GPIO_WriteBit(GPIOA, GPIO_Pin_9, Bit_RESET);
LCD5110的引脚配置函数如下:
  1. void GPIO_Configuration(void)
  2. {
  3.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  
  4.   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_9;
  5.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  6.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  7.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  8.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  9.        
  10.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);  
  11.   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
  12.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  13.        
  14.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);  
  15.   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
  16.   GPIO_Init(GPIOC, &GPIO_InitStructure);
  17.        
  18.   SetLCD_LED_High();
  19. }
其它驱动LCD110屏显示的函数基本无需变化,运行后的显示效果如图3所示。
图片3.png
3  LCD5110屏显示效果
2.小电机
功能板上提供了一个小电机以供测试,其接口电路如图4所示,是通过L9110进行功率驱动,在IAIB两端施加相异的电平即可控制电机的正反转。
图片4.png
4  小电机电路
       
  控制电机的引脚配置如下:
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);  
  // MOTOR: IA-PB4  IB-PB5
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  使用如下高低电平输出语句即可是电机转动,呼唤高低电平即可反向转动。       
  GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);     //输出高电平
  GPIO_WriteBit(GPIOB, GPIO_Pin_4, Bit_RESET);   //输出低电平
3.RGB_LED
本来RGB_LED的控制十分简单,只需输出高低电平即可,然而在机智云的功能板上却是以P9813来驱动控制RGB_LED,其接口电路如图5所示。
图片5.png
图片6.png
5  RGB_LED接口电路
RGB_LED的控制函数如下:
  1. void RGB_Write_Data(uint8_t R,uint8_t G,uint8_t B)
  2. {
  3.   uint32_t RGB_Data = 0;
  4.   uint8_t i;
  5.   RGB_Data |= 0xC0000000;
  6.   RGB_Data |= ((uint32_t)((~B) & 0xc0)) << 22;
  7.   RGB_Data |= ((uint32_t)((~G) & 0xc0)) << 20;
  8.   RGB_Data |= ((uint32_t)((~R) & 0xc0)) << 18;
  9.   RGB_Data |= ((uint32_t)B) << 16;            
  10.   RGB_Data |= ((uint32_t)G) << 8;
  11.   RGB_Data |= R;
  12.   for (i=0;i<32;i++)
  13.   {
  14.                  if((RGB_Data & 0x80000000) != 0)
  15.                  {
  16.                  SDA_1;
  17.                  }
  18.                  else
  19.                  {
  20.                  SDA_0;
  21.                  }
  22.         RGB_Data <<= 1;
  23.             SCL_0;
  24.             SCL_1;
  25.    }
  26.    SDA_0;        
  27.    for (i=0;i<32;i++)
  28.    {
  29.             SCL_0;
  30.             SCL_1;
  31.    }       
  32. }
RGB_LED的显示效果如图6所示。
图片7.png
6  RGB_LED显示效果
4.小按键
利用板载的小按键,可进行相应功能的控制,其电路如图6所示。
图片8.png
7  RGB_LED接口电路
小按键的引脚配置如下:
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
  // K1-PB10
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  // K2-PA8
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
K1键控制电机转动的语句如下:
GPIO_WriteBit(GPIOB, GPIO_Pin_4, Bit_RESET);
if(GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)==RESET) //  K1
{
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);   //  MODOR
}
else
{
                GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
}
5.红外感应
板载的红外感应器是用于避障控制的,其电路如图8所示。
图片9.png
图片10.png
8  红外感应电路
  IR_OUT引脚的配置语句如下:
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
使用红外感应器能够作为感应提示器来使用,其实现的语句如下:
if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_10)==RESET) // IR
{
                RGB_Write_Data(0x00,0x00,0xff);  //  蓝色
}
else
{
            RGB_Write_Data(0x00,0xff,0x00);   //  绿色
}
实现感应提示的效果如图9和图10所示。
图片11.png
9  未遮挡状态

图片12.png
10  遮挡状态



mmuuss586 发表于 2017-6-5 12:24 | 显示全部楼层
不错;
 楼主| jinglixixi 发表于 2017-6-6 08:32 | 显示全部楼层

感谢支持!!!
dongnanxibei 发表于 2017-6-6 15:58 | 显示全部楼层
给力,我也有个机智云的板子。
玛尼玛尼哄 发表于 2017-6-6 17:20 | 显示全部楼层
GoKit2应该是基于STM32103的。
 楼主| jinglixixi 发表于 2017-6-7 08:20 | 显示全部楼层
玛尼玛尼哄 发表于 2017-6-6 17:20
GoKit2应该是基于STM32103的。

的确,但我的是ATMEGA328,只能自己来改造把它用起来。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2934

帖子

39

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