Cortex-K60自学笔记(三)

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(&parameter);
				    GPIO_Init(PORT_DD,2,1,0);
				        break;
				case BT_LE_PRESS :// page_num = set_page_3(&parameter);
				     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

mcc

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值