标签:STM32


STM32F767 Nucleo之RT-GUI实验


STM32F767 Nucleo是ST官方出的开发板,板子上引出了大量的管脚便于评估。板子上还有一个带串口功能的ST Link调试器,用于对767芯片进行调试,一些基础功能的评估在这一块板子上就能搞定,不需要额外的开发工具了。

我在这块板子上用rt-gui实现了一个计算器,屏幕数据通过USB摄像头来显示,鼠标和键盘数据通过自定义USB HID设备传送给开发板。PC端显示程序运行后效果如下:

   

PC端是一个简单的Qt程序,一边读取摄像头数据进行显示,一边将鼠标和键盘事件通过HID设备发送给开发板。这个程序的源代码在这里。如果有多个摄像头,可以用PageDown和PageUp按键进行切换。开发板上的程序在这里,采用rt-gui制作界面,用F767的jpeg硬核进行图片压缩,通过开发板的USB接口发送到PC端。

设计过程

Read More »


RTThread与CubeMX – (4)整合RTThread与CubeMX

2017-10-09

CubeMX, rtthread

RTThread与CubeMX – (4)整合RTThread与CubeMX已关闭评论


CubeMX生成的代码结构如下

CubeMX在生成代码的时候可以选择是否要把库复制到工程所在目录,为了减少外部依赖,我选择把库复制到工程中,这样在生成的工程目录中就包含了库相关的文件。Read More »


RTThread与CubeMX – (3)初识RTThread


说了那么多的CubeMX,现在终于轮到主角RT-Thread出场了。RT-Thread是一款开源的实时操作系统,代码完全开源,可以从官方网站下载,也可以从github上clone一个最新的版本。我选择从git上clone一个,这样能顺便追踪到我做的修改。

rtthread用了scons作为编译工具,这个工具是基于python做的。python算是比较奇葩的一个东西,2.x版本和3.x版本不兼容。这个工具是2.x版本的python做的,所以要用这个工具构建之前要先下载python2x,然后安装scons。用命令行切换到scons解压后的目录,运行python setup.py install,就能安装scons了。如果提示“python不是内部命令或可执行程序”,说明python没有添加PATH环境变量中,可以通过在“我的电脑”中修改全局环境变量,也可以在命令行中用“set PATH=%PATH%;C:\Pyhton27”命令将其加入环境变量,不过这样的环境变量在命令行窗口退出后就失效了,好处是不会修改全局的环境变量。我比较喜欢这样的方式,建立一个bat文件,把设置环境变量的工作放在bat文件中,并启动一个命令行界面,然后在这个命令行界面中编译代码。下面是我建立rtthread编译环境的bat脚本代码,先设置pyhton和scons的目录,然后启动cmd。在这个bat文件执行后启动的命令行界面中执行 scons –target=”mdk5″ 就能进行rtthread的编译了。

set PATH=%PATH%;C:/Python27;C:/Python27/Scripts
cmd

Read More »


RTThread与CubeMX – (2)修改CubeMX生成的代码


在CubeMX中配置好后,自动生成的代码只需要再添加少量的代码就可以运行了。比如上一篇的点灯,只需要在main函数的大循环中添加几个控制引脚的代码就可以了。HAL库通过systick帮我们实现了delay的功能,只需要调用就行了。

/* USER CODE BEGIN Init */

/* USER CODE END Init */

/* Configure the system clock */
SystemClock_Config();

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

CubeMX生成的代码,像上面这样有很多USER CODE BEGIN,USER CODE END的代码,据传这样的代码是为了让CubeMX在原来工程的基础上生成新代码的时候,可以保留这样的注释对中的代码。对于这个功能我没实践过,我只是用CubeMX来生成初始化的代码,还没有试过在代码已经有修改的情况下再次使用CubeMX生成代码。因为CubeMX重新生成代码的时候会将所有的库都重新复制一次,并且修改工程文件,导致所有代码都得重新编译,不是很方便。

为了让后续的rtthread跑起来,还得加入对串口的支持。

Read More »


C语言结构体与寄存器


单片机开发中免不了会与寄存器打交道。在51,AVR单片机中,会有一个头文件将寄存器的地址定义成更容易阅读的宏,在C语言中通过宏定义来访问寄存器。

#ifndef _AVR_IOM128_H_
#define _AVR_IOM128_H_ 1
............
/* Input Pins, Port D */
#define PIND      _SFR_IO8(0x10)

/* Data Direction Register, Port D */
#define DDRD      _SFR_IO8(0x11)

/* Data Register, Port D */
#define PORTD     _SFR_IO8(0x12)

/* Input Pins, Port C */
#define PINC      _SFR_IO8(0x13)

/* Data Direction Register, Port C */
#define DDRC      _SFR_IO8(0x14)

/* Data Register, Port C */
#define PORTC     _SFR_IO8(0x15)
...........

// When use GPIO register 
PORTD = 0xff; 
tmp = PINC;

而在STM32单片机中,寄存器不再是地址转化成宏定义的形式了,变成了一个结构体。对C语言不熟的同学可能会感到困惑。其实这样的定义方式,对于STM32单片机的寄存器设计而言,是更合理的一种方式。Read More »