以前没整过STM32,没玩过四轴,感谢谷哥,感谢度娘。
大哥传帮带,新人同进步!
以前没整过STM32,没玩过四轴,感谢谷哥,感谢度娘。
大哥传帮带,新人同进步!
下单:
快递:
收件:
全家福:
First Blood:
果然如前人所述,USB的管脚太密,一不小心就连起来了,后来多上了点锡,用吸锡枪一吸就好了。
第三只手:
遥控器完工(USB接口看着实在脆弱,后来又用哥俩好粘了一圈):
四轴开关:
此处BOOT脚为2.0的,没找着相应排针,换个圆的能凑合插进去:
点灯测试:
背面:
完工:
遥控器:
完工之后首飞成功,固件已经下载好了的。
STM32开发环境的搭建
以前从没有整过STM32,没用过开发环境,所以一边google,一边做。
1、Keil MDK_510
下载地址:
http://www.keil.com/arm/mdk.asp
文件地址:
http://www.keil.com/fid/sj223zwtdy9j1wytrp11z4atj93ocqd1u9yxd1/files/eval/mdk_510.exe
2、注册机
下载地址:
3、Keil.STM32F1xx_DFP.1.0.5.pack
下载地址:
文件地址:
http://www.keil.com/pack/Keil.STM32F1xx_DFP.1.0.5.pack
安装方法见下面的网页:
http://www.ucortex.com/forum.php?mod=viewthread&tid=116
不再赘述。
Tips:
对于国外的地址,可能下载的比较慢,我的解决方法是,利用百度网盘的离线下载功能,一般要下载的文件已经存放在百度的服务器上了,基本上是秒传,然后再从百度云上下载该文件,速度不错。
Alientek STM32 《不完全手册V2.0》+37个实验源码+原理图(申请置酷)
http://www.amobbs.com/thread-4517523-1-1.html
网上看到的,先Mark,学习一下
晚上新建了project,并编译通过,以后可以在此基础上修改代码了。全部参考网上的内容,仅Mark一下自己参考。
还有好多stsw-stm32前缀的文件不知道是干嘛的,新版?不去管。
下载地址:Google输入stsw-stm32054.zip,回车就有了
备用,得到:
_htmresc:ST的logo完全无用,不用理会。
Libraries:比较重要的文件包含STM32的系统文件和大量头文件,也就是库文件了。
Project:包含大量外设的例程,和各个软件版本的评估板工程模板。KEIL对应的就是MDK-ARM文件下的工程模板。你可以利用这个工程模板来修改,得到你自己的工程模块,本文不用此法。
Utilities:就是评估板的相关文件,引脚定义等。
新建文件夹stm32-demo,在里面新建Lib,List,Output,User四个文件夹,并新建工程:
选择CPU: 103C8
将解压出来的外设库中Libraries目录下两个文件夹拷至工程Lib目录,选择一个库里提供的Example,我选的GPIO目录下的IOToggle,将该目录下文件全都拷至工程User目录下
添加工程Item:
如上图所示,修改工程名,建立四个Group,点击Groups 一栏右上角图标,依次新建User、CMSIS、Lib、StartUp四个组,点击对应的组再点击右下方Add Files添加相应的文件到对应的组中。
User组中添加USER文件夹下的c文件。
CMSIS组中添加\LIB\CMSIS\CM3\CoreSupport文件夹下core_cm3.c文件。
LIB组下添加\LIB\STM32F10x_StdPeriph_Driver\src下的所有文件,这个组的文件也可以根据后面的程序功能添加对应的功能文件。
StartUp组下添加 \LIB\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 文件夹下startup_stm32f10x_md.s文件,此文件根据芯片的所属类型来选择,STM32F103C8为中等容量器件所以选择md结尾的启动文件。
至此,已经将对应的文件全部加入工程。
添加完成后工程主界面左侧会显示已添加内容:
1、修改目标时钟,选中Use MicroLIB
2、选择输出目录Output,此处要双击工程内Output文件夹才可选中该目录,选中Create HEX File。
3、选择Listing目录List,方法同上。
4、C/C++ :
C/C++选项卡中的设置比较重要,如图 所示,选项卡中主要有两个地方需要注意,首先是整个工程的宏定义,在前面标准外设库部分已经有过介绍,标准外设库中很多功能都是通过宏定义来实现的,由于标准外设库针对STM32一系列芯片,因此需要通过宏定义来进行针对性的选择。这种选择有两种方式,有的人是直接改动宏定义部分的库文件,缺点是需要更改一些功能时不是很方便,而且笔者建议在尽量不更改库文件的方式下实现功能的配置和使用,另一种方式就是在工程的设置中添加宏定义,这儿添加了两个宏定义, USE_STDPERIPH_DRIVER表示使用标准外设库进行程序开发, STM32F10X_MD表示使用的是STM32F10X系列中等容量器件,本例中中使用的是STM32F103C8T6故填写此项。接下来一个重要的设置就是设置工程所包含的头文件目录,点击Include Paths一栏右侧图标,弹出如上所示的对话框。点击对话框右上角图标,添加工程所包括的头文件路径,添加头文件路径的时候要把当前工程目录中包含头文件的路径都添加进去。
此时编译报错,main.c中包含了stm32_eval.h我们没有添加到工程中。将外设库中Utilities目录下STM32_EVAL目录拷贝至User目录,添加至include目录,重新编译仍报错:
由于没有选择EVAL的类型,在C/C++选项中添加宏USE_STM3210C_EVAL,再编译,顺利通过:
上面的例程只是一个工程流程,算是学习一下工程创建和编译的步骤。
下载与调试:
1、借来同事的Jlink,连上电脑,安装Jlink的驱动程序,
2、认识SWD接口:
SWD 和传统的调试方式区别
SWD 模式比 JTAG 在高速模式下面更加可靠。 在大数据量的情况下面 JTAG 下载程序会失败, 但是 SWD 发生的几率会小很多。基本使用 JTAG 仿真模式的情况下是可以直接使用 SWD 模式的, 只要你的仿真器支持。 所以推荐大家使用这个模式。
在大家 GPIO 刚好缺一个的时候, 可以使用 SWD 仿真, 这种模式支持更少的引脚。
在大家板子的体积有限的时候推荐使用 SWD 模式, 它需要的引脚少, 当然需要的 PCB 空间就小啦! 比如你可以选择一个很小的 2.54 间距的 5 芯端子做仿真接口
J-Link指定的标准接口
市面上的常用仿真器对 SWD 模式支持情况
(1) JLINKV6 支持 SWD 仿真模式, 速度较慢。
(2) JLINKV7 比较好的支持 SWD 仿真模式, 速度有了明显的提高,速度是 JLINKV6 的 6 倍。
(3) JLINKV8 非常好的支持 SWD 仿真模式, 速度可以到 10M。
(4) ULINK1 不支持 SWD 模式。
(5) 盗版 ULINK2 非常好的支持 SWD 模式, 速度可以达到 10M。
(6) 正版 ULINK2 非常好的支持 SWD 模式, 速度可以达到 10M。
SWD 硬件接口上的不同
(1) JLINKV6 需要的硬件接口为: GND, RST, SWDIO, SWDCLK
(2) JLINKV7 需要的硬件接口为: GND, RST, SWDIO, SWDCLK
(3) JLINKV8 需要的硬件接口为: VCC, GND, RST, SWDIO, SWDCLK
(4) ULINK1 不支持 SWD 模式
(5) 盗版 ULINK2 需要的硬件接口为: GND, RST, SWDIO, SWDCLK
(6) 正版 ULINK2 需要的硬件接口为: GND, RST, SWDIO, SWDCLK
3、使用Jlink下载固件:
打开J-Flash ARM程序,打开将要下载的固件,并修改 Option 下 Project settings 项。
选择USB设备,目标接口选SWD,设置CPU型号等。
设置完成后,工程参数显示在左侧栏内,如下图:
板子加电后,依次选择 Target 菜单下 Unsecure Chip,Erase Chip,Program & Verify,Secure Chip即可。
4、Keil MDK打开一个工程,选项中Debug页设置如下:
LED指示灯实验
该实验考察GPIO的使用, STM32中GPIO有8种工作模式,资料见 http://blog.csdn.net/it1988888/article/details/7944314。
从飞行器原理图.pdf文件中可以看到,飞行器臂上12个LED灯共同由PC13 接口控制。
int main(void) { /* GPIOD Periph clock enable */ int i = 0; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* Configure PC13 in output pushpull mode */ 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); while (1) { GPIO_SetBits(GPIOC,GPIO_Pin_13); for(i=0;i<10000000;i++); GPIO_ResetBits(GPIOC,GPIO_Pin_13); for(i=0;i<10000000;i++); } }
刚开始 i 值设置的太小,看不出结果,调试中能看到效果,后来改大就OK了
擦,发现自己的电脑没有串口,明儿找个USB转串口线了,看看资料先!
UART,是通用异步收发传输器(Universal Asynchronous Receiver / Transmitter),既然是“器”,显然,它就是个设备而已,要完成一个特定的功能的硬件,它本身并不是协议。那么它要完成什么功能呢?它的最基本功能,是串行数据和并行数据之间的转换。我们知道,计算机中的数据以Byte为基本单位,对一个Byte的存取是并行的,即,同时取得/写入8个bit。而串行通信,需要把这个Byte“打碎”,按照时间顺序来收发以实现串行。
UART作为一种软件协议来看,是异步串口通信协议的英文缩写,它包括了RS232、RS499、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。而RS232、RS499、RS423、RS422和RS485等,是对应各种异步串行通信口的接口标准和总线标准,它规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容。实际上是属于通信网络中的物理层(最底层)的概念,与通信协议没有直接关系。而通信协议,是属于通信网络中的数据链路层(上一层)的概念。
程序修改的crazyflie的uart.c的程序,改一下端口定义即可,留证据:
今天阅读Crazyflie的程序,发现他们的代码中移植了freeRTOS,遂想在自己的四轴中使用同样的方法。参考网上相关的成功案例( http://www.amobbs.com/thread-5255622-1-1.html , http://www.****.com/auzxj/blog/11-11/235480_4fb3b.html ),移植成功了,总结一下。
一、下载FreeRTOS的源码
FreeRTOS项目地址: http://www.freertos.org/ ,好像被墙了,自己想办法。网站左上角有个带绿色图标的download 连接,然后。。。
二、解压FreeRTOS文件
我下载了一个FreeRTOSv8.0.1.exe 的文件,自解压文件,解压之。
打开在Source/portable目錄,保留RVDS和MemMang目錄,其餘可刪除。此文件夹根据不同的编译器进行配置,我的编译器是Keil,Keil中的文件与RVDS相同,因此保留RVDS。MemMang目录配置内存管理的文件。
三、FreeRTOS文件配置
1、复制下Source文件夹到工程下Lib文件夹,并重命名为FreeRTOS。
2、复制\Demo\CORTEX_STM32F103_Keil\FreeRTOSConfig.h文件到工程文件夹,我是放在main.c文件的同一个目录.\User\下。
3、复制 Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm\startup_stm32f10x_md.s
至.\user\並改檔名為STM32F10x.s,因为我是用STM32F103C8,若是其他容量请自行選對應的startup files。
在 __heap_limit 段后添加
IMPORT xPortPendSVHandler
IMPORT xPortSysTickHandler
IMPORT vPortSVCHandler
__Vectors区段中断向量表将SVCall Handler、PendSV_Handler、SysTick Handler改由RTOS管理,这样stm32f10x_it.c就不会影响到这三个OD要用到的中断程序。直接注释掉旧的,添加新的。
;DCD SVC_Handler ; SVCall Handler
DCD vPortSVCHandler ; SVCall Handler
;DCD PendSV_Handler ; PendSV Handler
;DCD SysTick_Handler ; SysTick Handler
DCD xPortPendSVHandler ; PendSV Handler
DCD xPortSysTickHandler ; SysTick Handler
4、修改Project Items,如下图
list.c,queue.c,task.c文件位于原Source目录,port.c文件位于\Source\portable\RVDS\ARM_CM3\目录,heap_2.c文件位于\Source\portable\MemMang目录。同时记得更新StartUp Group下的.s文件为刚才修改过后的.s文件。
五、配置头文件路径
添加刚才加入的FreeRTOS相关路径,
六、编译文件
根据报错信息相应修改,直到编译通过。
七、LED程序移植
在freeRTOS系统下重新加入 led 指示灯的实验程序,编译,下载,查看效果。
代码不多,贴上:
/** ****************************************************************************** * @file GPIO/IOToggle/main.c * @author MCD Application Team * @version V3.5.0 * @date 08-April-2011 * @brief Main program body. ****************************************************************************** * @attention * * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. * * © COPYRIGHT 2011 STMicroelectronics ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32f10x.h" /* Scheduler includes. */ #include "FreeRTOS.h" #include "task.h" #include "queue.h" #include "misc.h" #define LED0_ON() GPIO_ResetBits(GPIOC,GPIO_Pin_13); #define LED0_OFF() GPIO_SetBits(GPIOC,GPIO_Pin_13); static void prvSetupHardware( void ); /* Two demo Tasks*/ static void vLEDTask( void *pvParameters ); void Led_Init(void); int main(void) { /* GPIOD Periph clock enable */ prvSetupHardware(); xTaskCreate(vLEDTask,(signed portCHAR *)"LED", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+3, NULL ); vTaskStartScheduler(); return 0; } void vLEDTask( void *pvParameters ) { for( ;; ) { LED0_ON(); vTaskDelay(1000/portTICK_RATE_MS); LED0_OFF(); vTaskDelay(1000/portTICK_RATE_MS); } } static void prvSetupHardware( void ) { SystemInit(); Led_Init(); } /*-----------------------------------------------------------*/ void Led_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); /*LED0 @ PA8*/ 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 ); } /******************* (C) COPYRIGHT 2011 STMicroelectronics *****END OF FILE****/
效果不错,以后工作就在freeRTOS下做吧。
打赏帖 | |
---|---|
【Cortex-M】Systick Timer使用被打赏10分 | |
分享汽车防盗系统的组成与分类(一)被打赏5分 | |
VOFA+波形显示+JYD-31蓝牙发送和解析不定长数据被打赏10分 | |
【换取手持数字示波器】-STM32F4PWM控制LED灯管亮度被打赏22分 | |
【换取手持数字示波器】STM32F4驱动RPR-0521RS照度、接近一体型传感器被打赏23分 | |
宏定义和const关键字定义被打赏5分 | |
【分享开发笔记,赚取电动螺丝刀】几个单片机I2S外设的BLCK时钟对比被打赏20分 | |
【功率监测与控制系统DIY活动成果贴】DIY功率计与LabVIEW数据采集被打赏100分 | |
【分享开发笔记,赚取电动螺丝刀】使用ESP32S3调试I2S音频模块MAX98357被打赏22分 | |
【Freertos】任务管理被打赏10分 |