oled,flash,下位机模块测试
这周主要进行了三个模块的测试,依托学长给的代码,加上自己补充的一部分,基本完成了三个测试,本来有打算测试摄像头,但因为时间原因没有完成摄像头模块测试,挺遗憾的,算是拖后腿了吧,在这里向队友道一个歉。
1.oled模块
这个模块不算太难,oled购买时都会有字库,配置好引脚后即可使用。这里就不贴代码了。
2.flash 模块
flash.h
#ifndef _FLASH_H_
#define _FLASH_H_
#include "common.h"
//定义写入的数据类型
typedef float FlashDataType;
#define FLASH_TEST_SECTOR (255)//写Flash的最后一个扇区
#define FLASH_TEST_ADDR (FLASH_TEST_SECTOR*(2048))
#define FLASH_BUFFER_SIZE 50//写入Flash的数据缓冲区的大小,FLASH_BUFFER_SIZE*(sizeof(FlashData))<2048
//初始化
void FLASH_Init(void);
//读数据
void FlashReadData(void);
//写数据
void FlashWriteData(void);
#endif
flash.c
#include "flash.h"
FlashDataType g_flashDataBuffer[FLASH_BUFFER_SIZE];
//初始化
void FLASH_Init(void)
{
LPLD_Flash_Init();
}
//读数据
void FlashReadData(void)
{
FlashDataType * pTemp = NULL;
uint8 len = 0;
pTemp = (FlashDataType *)FLASH_TEST_ADDR;
for (len=0 ; len<FLASH_BUFFER_SIZE ; len++)
{
g_flashDataBuffer[len] = *(pTemp + len);
}
}
//写数据
void FlashWriteData(void)
{
//先擦除
LPLD_Flash_SectorErase(FLASH_TEST_ADDR);
if (result==FLASH_OK)
{
printf("success: ease flash success!\r\n");
}
else
{
printf("error: ease flash error! error num:%X\r\n", result);
return;
}
//再写入
LPLD_Flash_ByteProgram((uint32)FLASH_TEST_ADDR, (uint32*)g_flashDataBuffer, FLASH_BUFFER_SIZE*sizeof(FlashDataType) );
if (result==FLASH_OK)
{
printf("success: write flash success!\r\n");
}
else
{
printf("error: write flash error! error num:%X。\r\n", result);
return;
}
}
总结:关于flash模块,想说的也不多吧,这里主要是用来LPLD的底层库来完成相应的操作,这里先提出自己的一个疑问吧:关于扇区的读写,怎样获取扇区的编号,为什么要进行整段的写,不会造成数据不安全吗?
3.下位机
slave_computer.h
#ifndef _SLAVE_COMPUTER_H
#define _SLAVE_COMPUTER_H
#include "common.h"
//#define NULL (void *) 0
//参数结构体
typedef struct
{
//dir control parameter
int16 dir_kp;
int16 dir_kd;
//camera threshold
int16 cam_cnst;
//speed control parameter
int16 speed_kp;
int16 speed_ki;
int16 speed_max;
int16 speed_min;
//null
int16 sd_able;
int16 null_3_0;
int16 null_3_1;
int16 null_3_2;
int16 null_3_3;
int16 null_4_0;
int16 null_4_1;
int16 null_4_2;
int16 null_4_3;
int16 null_5_0;
int16 null_5_1;
int16 null_5_2;
int16 null_5_3;
int16 param_flag;
int16 param_enable;
}PARAM;
//按键引脚定义
//左
#define BT_LE_PORT (PTC)
#define BT_LE_PIN (GPIO_Pin9)
#define BT_LE_NUM (9)
//右
#define BT_RI_PORT (PTC)
#define BT_RI_PIN (GPIO_Pin10)
#define BT_RI_NUM (10)
//下
#define BT_DN_PORT (PTC)
#define BT_DN_PIN (GPIO_Pin8)
#define BT_DN_NUM (8)
//上
#define BT_UP_PORT (PTC)
#define BT_UP_PIN (GPIO_Pin10)
#define BT_UP_NUM (10)
//确定
#define BT_OK_PORT (PTC)
#define BT_OK_PIN (GPIO_Pin6)
#define BT_OK_NUM (6)
//按键状态读取
#define BT_UP_STATE (!LPLD_GPIO_Input_b(BT_UP_PORT, BT_UP_NUM))
#define BT_DN_STATE (!LPLD_GPIO_Input_b(BT_DN_PORT, BT_DN_NUM))
#define BT_LE_STATE (!LPLD_GPIO_Input_b(BT_LE_PORT, BT_LE_NUM))
#define BT_RI_STATE (!LPLD_GPIO_Input_b(BT_RI_PORT, BT_RI_NUM))
#define BT_OK_STATE (!LPLD_GPIO_Input_b(BT_OK_PORT, BT_OK_NUM))
//按键ID定义
#define BT_UP_PRESS (1)
#define BT_DN_PRESS (2)
#define BT_LE_PRESS (3)
#define BT_RI_PRESS (4)
#define BT_OK_PRESS (5)
//调试页数
#define PAGE_MIN (1)
#define PAGE_MAX (9)
#define EXIT_SET (0)
//参数初始化
#define PARAM_INIT_DIR_KP (10)
#define PARAM_INIT_DIR_KD (5)
#define PARAM_INIT_CAM_CNST (200)
#define PARAM_INIT_SPE_KP (5)
#define PARAM_INIT_SPE_KI (40)
#define PARAM_INIT_SPE_MAX (6000)
#define PARAM_INIT_SPE_MIN (-6000)
#define PARAM_INIT_SD_ABLE (0)
#define PARAM_INIT_NULL_3_0 (3600)
#define PARAM_INIT_NULL_3_1 (59)
#define PARAM_INIT_NULL_3_2 (50)
#define PARAM_INIT_NULL_3_3 (30)
#define PARAM_INIT_NULL_4_0 (255)
#define PARAM_INIT_NULL_4_1 (0)
#define PARAM_INIT_NULL_4_2 (255)
#define PARAM_INIT_NULL_4_3 (0)
#define PARAM_INIT_NULL_5_0 (500)
#define PARAM_INIT_NULL_5_1 (950)
#define PARAM_INIT_NULL_5_2 (255)
#define PARAM_INIT_NULL_5_3 (0)
#define PARAM_INIT_FLAG (123)
#define PARAM_INIT_ENBALE (PARAM_ENABLE)
//参数是否应用到代码
#define PARAM_ENABLE (123)
#define PARAM_DISABLE (-123)
void param_load(PARAM * p_param);
void init_button();
uint8 button_scan();
void param_set();
void read_param(PARAM *p_param);
uint8 read_param_able();
void param_init(PARAM * p_param);
#endif
slave_computer.c
#include "common.h"
#include "slave_computer.h"
#include "flash.h"
PARAM s_parameter;
extern FlashDataType g_flashDataBuffer[FLASH_BUFFER_SIZE];
//字符串复制函数
GPIO_InitTypeDef BT_LE,BT_RI,BT_DN,BT_UP,BT_OK;
/*
int8 * strcpy (char *dest, const char *src)
{
char *dp = (char *)dest;
char *sp = (char *)src;
if ((dest != NULL) && (src != NULL))
{
while (*sp != '\0')
{
*dp++ = *sp++;
}
*dp = '\0';
}
return dest;
}
*/
void init_button()
{
BT_LE.GPIO_PTx=PTC;
BT_LE.GPIO_Pins=GPIO_Pin9;
BT_LE.GPIO_Dir=DIR_INPUT;
BT_LE.GPIO_Output=OUTPUT_H;
BT_RI.GPIO_PTx=PTC;
BT_RI.GPIO_Pins=GPIO_Pin7;
BT_RI.GPIO_Dir=DIR_INPUT;
BT_RI.GPIO_Output=OUTPUT_H;
BT_DN.GPIO_PTx=PTC;
BT_DN.GPIO_Pins=GPIO_Pin8;
BT_RI.GPIO_Dir=DIR_INPUT;
BT_DN.GPIO_Output=OUTPUT_H;
BT_UP.GPIO_PTx=PTC;
BT_UP.GPIO_Pins=GPIO_Pin10;
BT_RI.GPIO_Dir=DIR_INPUT;
BT_UP.GPIO_Output=OUTPUT_H;
BT_OK.GPIO_PTx=PTC;
BT_OK.GPIO_Pins=GPIO_Pin6;
BT_OK.GPIO_Dir=DIR_INPUT;
BT_OK.GPIO_Output=OUTPUT_H;
LPLD_GPIO_Init(BT_LE);
LPLD_GPIO_Init(BT_RI);
LPLD_GPIO_Init(BT_DN);
LPLD_GPIO_Init(BT_UP);
LPLD_GPIO_Init(BT_OK);
}
uint8 button_scan()
{
uint8 up=LPLD_GPIO_Input_b(PTC,10);
uint8 down=LPLD_GPIO_Input_b(PTC,8);
uint8 left=LPLD_GPIO_Input_b(PTC,9);
uint8 right=LPLD_GPIO_Input_b(PTC,7);
uint8 ok=LPLD_GPIO_Input_b(PTC,6);
if(ok==1&&up==0&&left==0&&right==0&&down==0)
return 5;
if(ok==0&&up==0&&left==0&&right==1&&down==0)
return 4;
if(ok==0&&up==0&&left==1&&right==0&&down==0)
return 3;
if(ok==0&&up==1&&left==0&&right==0&&down==0)
return 1;
if(ok==0&&up==0&&left==0&&right==0&&down==1)
return 2;
}
//按键消抖延时函数,因为flash需要屏蔽中断,所以用空指令延时
void param_set_delay()
{
unsigned int i, j;
for ( i=0; i<500; i++ )
{
for ( j=0; j<2000; j++ )
{
asm("nop");
}
}
}
void param_set()
{
uint8 button_value;
uint8 page_num = 1;
//PARAM parameter;
param_load(&s_parameter);
param_init(&s_parameter);
//GPIO_Init(PORT_DD,3,1,0);
button_value = button_scan();
if(button_value == BT_DN_PRESS)
{
while(page_num != EXIT_SET)
{
switch(page_num)
{
case 1: page_num = set_page_1();左减页,右加页
//GPIO_Init(PORT_DD,3,1,0);
break;
case 2: page_num = set_page_2(&s_parameter);
break;
case 3: page_num = set_page_3(&s_parameter);
break;
case 4: page_num = set_page_4(&s_parameter);
break;
case 5: page_num = set_page_5(&s_parameter);
break;
case 6: page_num = set_page_6(&s_parameter);
break;
case 7: page_num = set_page_7(&s_parameter);
break;
case 8: page_num = set_page_8(&s_parameter);
break;
case 9: page_num = set_page_9();
break;
default:break;
}
}
while(1)
{
button_value = button_scan();
switch(button_value)
{
case BT_UP_PRESS: page_num = set_page_1();//page_num = set_page_1();左减页,右加页
GPIO_Init(PORT_DD,1,1,0);
break;
case BT_DN_PRESS:// page_num = set_page_2(¶meter);
GPIO_Init(PORT_DD,2,1,0);
break;
case BT_LE_PRESS :// page_num = set_page_3(¶meter);
GPIO_Init(PORT_DD,1,1,0);
break;
case BT_RI_PRESS:
GPIO_Init(PORT_DD,1,1,0);
break;
default:
break;
}
}
//s_parameter = parameter;
}
//
void read_param(PARAM *p_param)
{
*p_param = s_parameter;
}
总结:下位机模块遇到了特别多的问题,解决了一些,遗留了一些(关于上面的程序,前两个是因为源代码中漏掉了函数定义自己重新写的初始化函数和scan函数,这段程序主要是为了通过五向按键控制oled显示的内容)
1.关于#include "include.h"看了博客说是include的一个叫include.h的模块,另一种说法是#include的是一个模块集合,我认为应该是后一种,通过将模块的头文件封装在一个交include.h的文件里,然后通过调用它实现很多模块的调用。
2.关于五向按键,还是有很多地方不是很懂,首先,他需要配置pin_control实现中断捕获吗?不是直接读取位就可以了吗。再者就是许多例程使用ADC模块来初始化五向按键,这个不太了解。
总的来说这周还是挺多感受的,有点愧疚,没能完成测试任务,还有就是失约了一次,万分抱歉。最后是想对一个队友想说的一些话。对自己上周说的那些话感到抱歉吧,自己压根也没想到这番话会对你产生一些影响。我也知道大家都不是那种人,都能彼此谅解吧。这里还是正式的道一个歉。@WYT