打印
[STM32F0]

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

[复制链接]
1581|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

曾购置过一块机智云的开发板,本期待是STM32F103为核心的底板,不曾想却是基于ATMEGA328核心的底板。  
为了能使之与手中的ST开发板相配合使用,故决定在STM32F030的开发板上实现对该机智云功能板的驱动开发,从而避免它被闲置在一旁的**。
就机智云功能板来说,它共RGB_LED、小电机、红外感应器、小按键、温湿度传感器、WIFI模块及OLED接口等,如图1所示。限于时间的关系,这里仅对RGB_LED、小电机、红外感应、小按键及OLED接口的使用加以介绍。
1 机智云功能板
1.OLED接口
功能板上提供了OLED接口,该接口如图2所示。由于手头并没有SPI接口的OLED屏,而只有一块LCD5110屏,故决定用该接口来支持LCD5110屏显示。由于两者的接口并不一致,所以需进行稍许改造,具体的做法是将GNDNC引脚短接,这样就使LCD5110SCE引脚有了所需的控制信号。其它的只需修改引脚的定义即可。
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的引脚配置函数如下:
void GPIO_Configuration(void) 
{
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
       
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);  
  GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
       
  SetLCD_LED_High();
}
其它驱动LCD110屏显示的函数基本无需变化,运行后的显示效果如图3所示。
3  LCD5110屏显示效果
2.小电机
功能板上提供了一个小电机以供测试,其接口电路如图4所示,是通过L9110进行功率驱动,在IAIB两端施加相异的电平即可控制电机的正反转。
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  RGB_LED接口电路
RGB_LED的控制函数如下:
void RGB_Write_Data(uint8_t R,uint8_t G,uint8_t B)
{
  uint32_t RGB_Data = 0;
  uint8_t i;
  RGB_Data |= 0xC0000000;
  RGB_Data |= ((uint32_t)((~B) & 0xc0)) << 22;
  RGB_Data |= ((uint32_t)((~G) & 0xc0)) << 20;
  RGB_Data |= ((uint32_t)((~R) & 0xc0)) << 18;
  RGB_Data |= ((uint32_t)B) << 16;            
  RGB_Data |= ((uint32_t)G) << 8;
  RGB_Data |= R;
  for (i=0;i<32;i++)
  {
                 if((RGB_Data & 0x80000000) != 0)
                 {
                 SDA_1;
                 }
                 else
                 {
                 SDA_0;
                 }
        RGB_Data <<= 1;
            SCL_0;
            SCL_1;
   }
   SDA_0;        
   for (i=0;i<32;i++)
   {
            SCL_0;
            SCL_1;
   }       
}
RGB_LED的显示效果如图6所示。
6  RGB_LED显示效果
4.小按键
利用板载的小按键,可进行相应功能的控制,其电路如图6所示。
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所示。
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所示。
9  未遮挡状态

10  遮挡状态



沙发
mmuuss586| | 2017-6-5 12:24 | 只看该作者
不错;

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2017-6-6 08:32 | 只看该作者

感谢支持!!!

使用特权

评论回复
地板
dongnanxibei| | 2017-6-6 15:58 | 只看该作者
给力,我也有个机智云的板子。

使用特权

评论回复
5
玛尼玛尼哄| | 2017-6-6 17:20 | 只看该作者
GoKit2应该是基于STM32103的。

使用特权

评论回复
6
jinglixixi|  楼主 | 2017-6-7 08:20 | 只看该作者
玛尼玛尼哄 发表于 2017-6-6 17:20
GoKit2应该是基于STM32103的。

的确,但我的是ATMEGA328,只能自己来改造把它用起来。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

463

主题

2774

帖子

38

粉丝