这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » dawnjeanh的四轴飞行器进程

共14条 1/2 1 2 跳转至

dawnjeanh的四轴飞行器进程

菜鸟
2014-06-15 15:35:48     打赏

迟来的的开发进程贴。

5月28日下单,5月31日拿到套件。拖了半个月才开的进程贴是在抱歉了,实验室里给boss干活只能挤时间更了。

目录

开箱晒板及组装                                 http://forum.eepw.com.cn/thread/256902/1#2

开发环境及下载固件                           http://forum.eepw.com.cn/thread/256902/1#3

基础实验-STM32芯片开发环境的建立     http://forum.eepw.com.cn/thread/256902/1#4

基础实验-LED指示灯实验                     http://forum.eepw.com.cn/thread/256902/2#12

关于时钟配置                                    http://forum.eepw.com.cn/thread/256902/2#13

基础实验-UART串口通讯实验               http://forum.eepw.com.cn/thread/256902/2#14

基础实验-PWM电机驱动实验                http://forum.eepw.com.cn/thread/256902/2#16


出现问题

【已解决】给四轴编程PB3/JTDO控制的led不亮        http://forum.eepw.com.cn/thread/256935/1





关键词: 开发进程    

菜鸟
2014-06-15 15:55:53     打赏
2楼
开箱晒板及组装

先上图。

开箱

收到的套件,贴片的芯片、电阻电容都已经焊好,只剩下直插的没焊,难度不大。

组装

将元件焊好。

之前看到说usb口不好焊,这里说一下我的经验:焊接这类的贴片封装的芯片要在焊接前在焊盘上涂上少量的助焊剂(也叫焊锡膏,个人感觉固态的比较好用,当然液态的也可以),然后在烙铁头上点上焊锡,芯片管脚与焊盘对齐,在管脚上拖动焊枪,焊锡会自动附在管脚与焊盘上,并且不会短路。若是短路了,再涂上焊锡膏,用没有焊锡的焊枪再加热一下,焊锡就会分开。

成品

组装完成。

改装

为了调试方便,在手柄上加装了一块液晶点阵屏,以后调试的时候显示传感器信息。


菜鸟
2014-06-15 16:25:45     打赏
3楼

开发环境及下载固件

飞行器及手柄都使用的是SWD的编程方式。我使用JLINK调试器(先开始用ULINK2但固件下载不成功,这个另开贴讨论)

jink2swd

标准JLINK是20针,SWD只需3.3V,GND,SWDIO,SWDCLK这四根就可以

jlink2swd

这是制作的JLINK转SWD的转换线。

jlink

JLINK与转换线实物图。

固件下载

PC上安装好驱动(好像高版本会识别盗版JLINK),打开SEGGER J-FLASH ARM,首先进行设置,Options->Project settings,CPU选择成STM32F103CB

setting

Target Interface 选择SWD

File->Open data file打开要下载的固件,将JLINK连接好,打开目标板的电源开关,Target->Program&Verify即可,最终显示下载成功


菜鸟
2014-06-15 16:55:36     打赏
4楼

基础实验-STM32芯片开发环境的建立

先给出ST官方的外设库

STM32F103CB:http://www.st.com/web/catalog/mmc/FM141/SC1169/SS1031/LN1565/PF189782

STM32F10x standard peripheral library:http://www.st.com/web/en/catalog/tools/PF257890#

下载外设库后解压得到STM32F10x_StdPeriph_Lib_V3.5.0,内部Libraries文件夹就是我们要用的外设库。

KEIL工程搭建。

1.新建一个文件夹,我一FLY为例,之后工程所有文件都在此文件夹中。在文件夹中再新建LIB、List、Obj、SRC四个文件夹。

2.将解压好的外设库..\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries中的两个文件夹CMSIS和STM32F10x_StdPeriph_Driver拷贝到..\FLY\LIB文件夹下。

3.打开KEIL,新建工程。Project->New uVision Project,工程名以FLY为例,保存到..\FLY。弹出对话框询问是否添加启动代码,选择是。

4.项目配置。

单击Target Options,Output选项卡单击Select Folder for Objects,选择..\FLY\Obj文件夹

Listing选项卡中单击Select Folder for Listings,选择..\FLY\List文件夹


C/C++选项卡中Define中填写STM32F10X_MD,USE_STDPERIPH_DRIVER,在Include Paths中编辑包含路径



Debug选项卡中选择下载器,我已JLINK为例


Utilities选项卡同样选择JLINK


在下载器设置中,设置为SW方式,并设置Programming Algorithm,







菜鸟
2014-06-15 18:07:41     打赏
5楼

配置完成后,就开始添加代码了,为了结构明了,在KEIL的Project视图中添加分组。方法是在FLY上右键Add Group,并且可以更改名称。

在CMSIS中添加了..\FLY\LIB\CMSIS\CM3\DeviceSupport\ST\STM32F10x文件夹中的system_stm32f10x.c

在STM32F10x_StdPeriph_Driver中添加了..\FLY\LIB\STM32F10x_StdPeriph_Driver\src文件夹中的全部文件

把之前解压完的官方外设库..\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template文件夹中的stm32f10x_conf.h复制到..\FLY\SRC文件夹下,并在此文件夹内新建main.c、common.h,并把这三个文件添加到Project视图的System分组下。

common.h


#ifndef	__COMMON_H__
#define	__COMMON_H__

#include "stm32f10x_conf.h"
#include "stm32f10x.h"

#endif

 main.h


#include "common.h"

int main(void)
{
	while(1)
	{
	}
}

这样一个工程模板就建好了,就可以着手编写程序。编译后点击LOAD就可以下载。




菜鸟
2014-06-15 20:36:24     打赏
6楼
谢龙神夸奖!

菜鸟
2014-06-15 20:38:38     打赏
7楼
谢龙神夸奖

菜鸟
2014-06-16 11:43:51     打赏
8楼
3q

菜鸟
2014-06-16 11:49:36     打赏
9楼

基础实验-LED指示灯实验

本以为这个会很简单,分分钟解决的,但是没想到会遇到问题,而且困扰了一晚上,详见http://forum.eepw.com.cn/thread/256935/1

在之前工程模板的基础上再BSP分组中增加LED.c和LED.h,并将LED.h包含到common.h中

LED IO配置


/************************************************************************\
*	函数名:LED_Initialization
*	函数功能概述:LED初始化
*	参数说明:
*	返回值说明:
\************************************************************************/
void LED_Initialization(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);//使能时钟
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
	//PB3:D1
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	//PC13:Dx
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	LED_D1_OFF();
	LED_Dx_OFF();
}



添加宏定义


#define LED_D1_ON()    GPIO_ResetBits(GPIOB, GPIO_Pin_3)
#define LED_D1_OFF()   GPIO_SetBits(GPIOB, GPIO_Pin_3)

#define LED_Dx_OFF()   GPIO_ResetBits(GPIOC, GPIO_Pin_13)
#define LED_Dx_ON()    GPIO_SetBits(GPIOC, GPIO_Pin_13)



这样就可以控制LED了


菜鸟
2014-06-22 14:24:56     打赏
10楼

关于时钟

在串口之前,先说说时钟配置。时钟很重要,尤其对于通讯来说,比如串口的波特率。

在启动代码中(startup_stm32f10x_md.s)复位的程序入口Reset_Handler:

程序首先进入SystemInit函数,在跳转到main函数。右键SystemInit再选择goto definition可以看到跳转到system_stm32f10x.c中的SystemInit函数,这个函数就是进行时钟配置。但是库中默认外部晶振为8MHz,但是四轴外部晶振为16MHZ,所以我们最好还是自己重新配置时钟。

/************************************************************************\
*	函数名:RCC_Configuration
*	函数功能概述:时钟配置
*	参数说明:
*	返回值说明:
\************************************************************************/
void RCC_Configuration(void)//时钟配置
{
	ErrorStatus HSEStartUpStatus;//判断标志变量
	RCC_ClocksTypeDef RCC_ClocksStructure;
	RCC_DeInit();
	RCC_HSEConfig(RCC_HSE_ON);//使用外部时钟
	HSEStartUpStatus = RCC_WaitForHSEStartUp();//等待外部时钟稳定
	if(HSEStartUpStatus== SUCCESS)//如果外部晶振启动成功
	{
		RCC_HCLKConfig(RCC_SYSCLK_Div1);//HCLK(AHB时钟)值等于系统时钟
		RCC_PCLK1Config(RCC_HCLK_Div2);//PCLK1(APB1时钟)值等于HCLK的一半,最高不超过36MHz
		RCC_PCLK2Config(RCC_HCLK_Div1);//PCLK2(APB2时钟)值等于HCLK,最高可是72MHz
		FLASH_SetLatency(FLASH_Latency_2);//FLASH时序控制,SYSCLK0~24MHz Latency=0.SYSCLK25~48MHz Latency =1.SYSCLk 48~72MHz  Latency=2
		FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);//开启FLASH预取指功能
		RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);//HSE提供系统时钟,9倍频,也就是72MHz
		RCC_PLLCmd(ENABLE);//启动PLL
		while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//等待PLL稳定
		RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//系统时钟来自PLL输出
		while(RCC_GetSYSCLKSource()!=0x08);//等待系统时钟稳定
	}
	
	
	//检测
	RCC_GetClocksFreq(&RCC_ClocksStructure);
}


这是在网上找到的程序,使用外部时钟通过PLL到72MHz,也分享给大家。


但是还有一个问题,通过RCC_GetClocksFreq函数程序认为的系统时钟是36MHz,如果这样使用库函数配置波特率实际会与设定差一倍。这是因为在stm32f10x.h中宏定义了HSE_VALUE,这个值是8M,所以用我们要把这个宏定义改为16000000,这样就可以了。注意修改这个文件需要先将文件的只读属性去掉


共14条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]